Skip to content

Commit 6592592

Browse files
committed
Add tests for original title display preference
1 parent 149cfd8 commit 6592592

4 files changed

Lines changed: 138 additions & 0 deletions

File tree

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { ItemFields } from '@jellyfin/sdk/lib/generated-client/models/item-fields';
2+
import { describe, expect, it } from 'vitest';
3+
4+
import { QUERY_OPTIONS } from './queryOptions';
5+
6+
describe('QUERY_OPTIONS', () => {
7+
it('should include OriginalTitle field', () => {
8+
expect(QUERY_OPTIONS.fields).toContain(ItemFields.OriginalTitle);
9+
});
10+
});

src/components/itemHelper.test.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { describe, expect, it, vi } from 'vitest';
2+
3+
import { getDisplayName } from './itemHelper';
4+
5+
vi.mock('./apphost', () => ({ appHost: { supports: vi.fn() } }));
6+
vi.mock('lib/globalize', () => ({ default: { translate: vi.fn((key, ...args) => args[0] ?? key) } }));
7+
vi.mock('lib/jellyfin-apiclient', () => ({ ServerConnections: {} }));
8+
vi.mock('utils/jellyfin-apiclient/compat', () => ({ toApi: vi.fn() }));
9+
vi.mock('scripts/settings/userSettings', () => ({ shouldUseOriginalTitles: vi.fn() }));
10+
11+
import { shouldUseOriginalTitles } from 'scripts/settings/userSettings';
12+
13+
describe('getDisplayName', () => {
14+
describe('shouldUseOriginalTitles preference', () => {
15+
it('should return OriginalTitle when preference is enabled and OriginalTitle is available', () => {
16+
shouldUseOriginalTitles.mockReturnValue(true);
17+
const item = { Type: 'Movie', Name: 'Spirited Away', OriginalTitle: '千と千尋の神隠し' };
18+
expect(getDisplayName(item)).toBe('千と千尋の神隠し');
19+
});
20+
21+
it('should return Name when preference is enabled but OriginalTitle is not set', () => {
22+
shouldUseOriginalTitles.mockReturnValue(true);
23+
const item = { Type: 'Movie', Name: 'Spirited Away' };
24+
expect(getDisplayName(item)).toBe('Spirited Away');
25+
});
26+
27+
it('should return Name when preference is disabled even if OriginalTitle is available', () => {
28+
shouldUseOriginalTitles.mockReturnValue(false);
29+
const item = { Type: 'Movie', Name: 'Spirited Away', OriginalTitle: '千と千尋の神隠し' };
30+
expect(getDisplayName(item)).toBe('Spirited Away');
31+
});
32+
33+
it('should return EpisodeTitle for Program regardless of OriginalTitle when preference is enabled', () => {
34+
shouldUseOriginalTitles.mockReturnValue(true);
35+
const item = { Type: 'Program', Name: 'Show Name', OriginalTitle: 'Original Show Name', EpisodeTitle: 'Episode Title' };
36+
expect(getDisplayName(item)).toBe('Episode Title');
37+
});
38+
});
39+
});
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { beforeEach, describe, expect, it, vi } from 'vitest';
2+
3+
vi.mock('../../utils/events.ts', () => ({ default: { trigger: vi.fn() } }));
4+
vi.mock('../browser', () => ({ default: {} }));
5+
vi.mock('./appSettings', () => ({ default: { get: vi.fn(), set: vi.fn() } }));
6+
7+
import appSettings from './appSettings';
8+
import { UserSettings } from './userSettings';
9+
10+
describe('UserSettings', () => {
11+
let settings;
12+
13+
beforeEach(() => {
14+
settings = new UserSettings();
15+
vi.clearAllMocks();
16+
});
17+
18+
describe('shouldUseOriginalTitles', () => {
19+
it('reads from server display preferences when they are loaded', () => {
20+
settings.displayPrefs = { CustomPrefs: { useOriginalTitles: 'true' } };
21+
22+
expect(settings.shouldUseOriginalTitles()).toBe(true);
23+
expect(appSettings.get).not.toHaveBeenCalled();
24+
});
25+
26+
it('reads false from server display preferences when set to false', () => {
27+
settings.displayPrefs = { CustomPrefs: { useOriginalTitles: 'false' } };
28+
29+
expect(settings.shouldUseOriginalTitles()).toBe(false);
30+
expect(appSettings.get).not.toHaveBeenCalled();
31+
});
32+
33+
it('server preference takes precedence over local storage value', () => {
34+
settings.displayPrefs = { CustomPrefs: { useOriginalTitles: 'true' } };
35+
appSettings.get.mockReturnValue('false');
36+
37+
expect(settings.shouldUseOriginalTitles()).toBe(true);
38+
});
39+
40+
it('falls back to local storage when server preferences are not loaded', () => {
41+
settings.displayPrefs = null;
42+
appSettings.get.mockReturnValue('true');
43+
44+
expect(settings.shouldUseOriginalTitles()).toBe(true);
45+
expect(appSettings.get).toHaveBeenCalled();
46+
});
47+
});
48+
});

src/utils/items.test.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { ItemFields } from '@jellyfin/sdk/lib/generated-client/models/item-fields';
2+
import { ImageType } from '@jellyfin/sdk/lib/generated-client/models/image-type';
3+
import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client/models/item-sort-by';
4+
import { SortOrder } from '@jellyfin/sdk/lib/generated-client/models/sort-order';
5+
import { describe, expect, it, vi } from 'vitest';
6+
7+
import { LibraryTab } from 'types/libraryTab';
8+
import { ViewMode } from 'types/library';
9+
import type { LibraryViewSettings } from 'types/library';
10+
11+
import { getFieldsQuery } from './items';
12+
13+
vi.mock('scripts/settings/userSettings');
14+
vi.mock('components/layoutManager', () => ({ default: {} }));
15+
16+
const baseSettings: LibraryViewSettings = {
17+
SortBy: ItemSortBy.SortName,
18+
SortOrder: SortOrder.Ascending,
19+
StartIndex: 0,
20+
CardLayout: false,
21+
ImageType: ImageType.Primary,
22+
ViewMode: ViewMode.GridView,
23+
ShowTitle: true
24+
};
25+
26+
describe('getFieldsQuery', () => {
27+
it('should include OriginalTitle field when useOriginalTitles is true', () => {
28+
const result = getFieldsQuery(LibraryTab.Movies, baseSettings, true);
29+
expect(result.fields).toContain(ItemFields.OriginalTitle);
30+
});
31+
32+
it('should not include OriginalTitle field when useOriginalTitles is false', () => {
33+
const result = getFieldsQuery(LibraryTab.Movies, baseSettings, false);
34+
expect(result.fields).not.toContain(ItemFields.OriginalTitle);
35+
});
36+
37+
it('should not include OriginalTitle field when useOriginalTitles is not provided', () => {
38+
const result = getFieldsQuery(LibraryTab.Movies, baseSettings);
39+
expect(result.fields).not.toContain(ItemFields.OriginalTitle);
40+
});
41+
});

0 commit comments

Comments
 (0)