95bd703b26
Docs Check / Markdown lint (push) Successful in 1m14s
Build and Push Docker Image / build (push) Successful in 1m52s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m55s
CI / Security audit (push) Successful in 2m25s
Docs Check / Mermaid diagram parse check (push) Successful in 3m6s
CI / Swagger Validation & Coverage (push) Successful in 3m22s
CI / Tests & coverage (push) Successful in 3m45s
174 lines
6.1 KiB
JavaScript
174 lines
6.1 KiB
JavaScript
// Copyright (c) 2026 Gordon Bolton. MIT License.
|
|
import { describe, it, expect } from 'vitest';
|
|
|
|
const {
|
|
extractRequestedUser,
|
|
filterRequestsByUser
|
|
} = require('../../server/utils/ombiHelpers');
|
|
|
|
describe('ombiHelpers', () => {
|
|
describe('extractRequestedUser', () => {
|
|
it('returns empty string if request is null or undefined', () => {
|
|
expect(extractRequestedUser(null)).toBe('');
|
|
expect(extractRequestedUser(undefined)).toBe('');
|
|
});
|
|
|
|
it('returns requestedUser if requestedUser is a string', () => {
|
|
const req = { requestedUser: 'testuser', requestedByAlias: 'alias' };
|
|
expect(extractRequestedUser(req)).toBe('testuser');
|
|
});
|
|
|
|
it('falls back to requestedByAlias if requestedUser is missing', () => {
|
|
const req = { requestedByAlias: 'aliasuser' };
|
|
expect(extractRequestedUser(req)).toBe('aliasuser');
|
|
});
|
|
|
|
it('returns alias from requestedUser object if present', () => {
|
|
const req = {
|
|
requestedUser: {
|
|
alias: 'alias_val',
|
|
userAlias: 'userAlias_val',
|
|
userName: 'userName_val',
|
|
normalizedUserName: 'normalized_val'
|
|
}
|
|
};
|
|
expect(extractRequestedUser(req)).toBe('alias_val');
|
|
});
|
|
|
|
it('returns userAlias from requestedUser object if alias is missing', () => {
|
|
const req = {
|
|
requestedUser: {
|
|
userAlias: 'userAlias_val',
|
|
userName: 'userName_val',
|
|
normalizedUserName: 'normalized_val'
|
|
}
|
|
};
|
|
expect(extractRequestedUser(req)).toBe('userAlias_val');
|
|
});
|
|
|
|
it('returns userName from requestedUser object if alias/userAlias are missing', () => {
|
|
const req = {
|
|
requestedUser: {
|
|
userName: 'userName_val',
|
|
normalizedUserName: 'normalized_val'
|
|
}
|
|
};
|
|
expect(extractRequestedUser(req)).toBe('userName_val');
|
|
});
|
|
|
|
it('returns normalizedUserName from requestedUser object if other fields are missing', () => {
|
|
const req = {
|
|
requestedUser: {
|
|
normalizedUserName: 'normalized_val'
|
|
}
|
|
};
|
|
expect(extractRequestedUser(req)).toBe('normalized_val');
|
|
});
|
|
|
|
it('falls back to requestedByAlias when requestedUser is empty object {} (bug fix)', () => {
|
|
const req = {
|
|
requestedUser: {},
|
|
requestedByAlias: 'fallback_alias'
|
|
};
|
|
expect(extractRequestedUser(req)).toBe('fallback_alias');
|
|
});
|
|
|
|
it('returns empty string if requestedUser is empty object {} and requestedByAlias is missing', () => {
|
|
const req = {
|
|
requestedUser: {}
|
|
};
|
|
expect(extractRequestedUser(req)).toBe('');
|
|
});
|
|
|
|
it('returns userName from nested user object', () => {
|
|
const req = { user: { userName: 'user_val' } };
|
|
expect(extractRequestedUser(req)).toBe('user_val');
|
|
});
|
|
|
|
it('returns alias from nested requestedBy object', () => {
|
|
const req = { requestedBy: { alias: 'req_alias' } };
|
|
expect(extractRequestedUser(req)).toBe('req_alias');
|
|
});
|
|
|
|
it('returns normalizedUserName from nested ombiUser object', () => {
|
|
const req = { ombiUser: { normalizedUserName: 'norm_ombi' } };
|
|
expect(extractRequestedUser(req)).toBe('norm_ombi');
|
|
});
|
|
|
|
it('returns userAlias from nested requestedByUser object', () => {
|
|
const req = { requestedByUser: { userAlias: 'alias_user' } };
|
|
expect(extractRequestedUser(req)).toBe('alias_user');
|
|
});
|
|
|
|
it('returns username from a string source value', () => {
|
|
const req = { requestedBy: 'direct_string' };
|
|
expect(extractRequestedUser(req)).toBe('direct_string');
|
|
});
|
|
|
|
it('returns username from root fallbacks (requestedByUsername, requester, requestedByEmail)', () => {
|
|
expect(extractRequestedUser({ requestedByUsername: 'user_uname' })).toBe('user_uname');
|
|
expect(extractRequestedUser({ requester: 'req_val' })).toBe('req_val');
|
|
expect(extractRequestedUser({ requestedByEmail: 'test@email.com' })).toBe('test@email.com');
|
|
});
|
|
|
|
it('recursively extracts user from seasons array requests', () => {
|
|
const req = {
|
|
seasons: [
|
|
{},
|
|
{ requestedUser: { alias: 'season_user' } }
|
|
]
|
|
};
|
|
expect(extractRequestedUser(req)).toBe('season_user');
|
|
});
|
|
|
|
it('recursively extracts user from childRequests array', () => {
|
|
const req = {
|
|
childRequests: [
|
|
{},
|
|
{ user: { userName: 'child_user' } }
|
|
]
|
|
};
|
|
expect(extractRequestedUser(req)).toBe('child_user');
|
|
});
|
|
});
|
|
|
|
describe('filterRequestsByUser', () => {
|
|
const movie1 = { id: 1, requestedUser: { userName: 'user1' }, type: 'movie' };
|
|
const movie2 = { id: 2, requestedUser: { userName: 'user2' }, type: 'movie' };
|
|
const tv1 = { id: 3, requestedUser: { alias: 'User1' }, type: 'tv' };
|
|
|
|
it('returns empty array if requests input is not an array', () => {
|
|
expect(filterRequestsByUser(null, 'user1', false)).toEqual([]);
|
|
expect(filterRequestsByUser({}, 'user1', false)).toEqual([]);
|
|
});
|
|
|
|
it('returns all requests unmodified if showAll is true', () => {
|
|
const requests = [movie1, movie2];
|
|
expect(filterRequestsByUser(requests, 'user1', true)).toEqual(requests);
|
|
});
|
|
|
|
it('returns all requests unmodified if username is falsy or missing', () => {
|
|
const requests = [movie1, movie2];
|
|
expect(filterRequestsByUser(requests, '', false)).toEqual(requests);
|
|
expect(filterRequestsByUser(requests, null, false)).toEqual(requests);
|
|
});
|
|
|
|
it('filters requests correctly for a specific user', () => {
|
|
const requests = [movie1, movie2, tv1];
|
|
const result = filterRequestsByUser(requests, 'user1', false);
|
|
expect(result).toHaveLength(2);
|
|
expect(result).toContainEqual(movie1);
|
|
expect(result).toContainEqual(tv1);
|
|
expect(result).not.toContainEqual(movie2);
|
|
});
|
|
|
|
it('performs case-insensitive filtering', () => {
|
|
const requests = [movie1, movie2, tv1];
|
|
const result = filterRequestsByUser(requests, 'USER1', false);
|
|
expect(result).toHaveLength(2);
|
|
expect(result).toContainEqual(movie1);
|
|
expect(result).toContainEqual(tv1);
|
|
});
|
|
});
|
|
});
|