mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 23:35:44 +00:00
73 lines
2.8 KiB
TypeScript
73 lines
2.8 KiB
TypeScript
import { beforeEach, describe, expect, it } from 'vitest';
|
|
import { useAuthStore } from '@/store/authStore';
|
|
import {
|
|
appendServerQuery,
|
|
buildAlbumDetailPath,
|
|
buildArtistDetailPath,
|
|
buildComposerDetailPath,
|
|
readDetailServerId,
|
|
} from '@/lib/navigation/detailServerScope';
|
|
import { serverIndexKeyFromUrl } from '@/lib/server/serverIndexKey';
|
|
|
|
describe('detailServerScope', () => {
|
|
beforeEach(() => {
|
|
useAuthStore.setState({
|
|
activeServerId: 'srv-active',
|
|
servers: [
|
|
{ id: 'srv-active', name: 'Active', url: 'https://active.test', username: 'u', password: 'p' },
|
|
{ id: 'srv-a', name: 'A', url: 'https://a.test', username: 'u', password: 'p' },
|
|
{ id: 'srv-b', name: 'B', url: 'https://b.test', username: 'u', password: 'p' },
|
|
],
|
|
});
|
|
});
|
|
|
|
it('readDetailServerId prefers valid ?server= over fallback', () => {
|
|
const params = new URLSearchParams('server=srv-b&lossless=1');
|
|
expect(readDetailServerId(params, 'srv-active')).toBe('srv-b');
|
|
});
|
|
|
|
it('readDetailServerId fails closed when an explicit server param is unknown', () => {
|
|
const params = new URLSearchParams('server=missing');
|
|
expect(readDetailServerId(params, 'srv-active')).toBeNull();
|
|
});
|
|
|
|
it('resolves route and fallback index keys to profile ids', () => {
|
|
const indexKey = serverIndexKeyFromUrl('https://b.test');
|
|
expect(readDetailServerId(new URLSearchParams(`server=${indexKey}`), 'srv-a')).toBe('srv-b');
|
|
expect(readDetailServerId(new URLSearchParams(), indexKey)).toBe('srv-b');
|
|
});
|
|
|
|
it('buildArtistDetailPath preserves search and replaces duplicate server params', () => {
|
|
expect(buildArtistDetailPath('art-1', {
|
|
serverId: 'srv-b',
|
|
search: '?lossless=1&server=old&tab=albums&server=older',
|
|
})).toBe('/artist/art-1?lossless=1&server=srv-b&tab=albums');
|
|
});
|
|
|
|
it('buildAlbumDetailPath preserves search and owning server', () => {
|
|
expect(buildAlbumDetailPath('album-1', {
|
|
serverId: 'srv-b',
|
|
search: 'lossless=1',
|
|
})).toBe('/album/album-1?lossless=1&server=srv-b');
|
|
});
|
|
|
|
it('buildComposerDetailPath preserves the concrete owner', () => {
|
|
expect(buildComposerDetailPath('composer-1', {
|
|
serverId: 'srv-b',
|
|
search: 'tab=works',
|
|
})).toBe('/composer/composer-1?tab=works&server=srv-b');
|
|
});
|
|
|
|
it('buildArtistDetailPath preserves an existing server when no owner is supplied', () => {
|
|
expect(buildArtistDetailPath('art-1', { search: 'server=srv-a&lossless=1' }))
|
|
.toBe('/artist/art-1?server=srv-a&lossless=1');
|
|
});
|
|
|
|
it('appendServerQuery merges with existing query parts', () => {
|
|
expect(appendServerQuery('lossless=1', 'srv-a')).toBe('lossless=1&server=srv-a');
|
|
expect(appendServerQuery(undefined, 'srv-a')).toBe('server=srv-a');
|
|
expect(appendServerQuery('server=old&lossless=1&server=older', 'srv-a'))
|
|
.toBe('server=srv-a&lossless=1');
|
|
});
|
|
});
|