Files
Psychotoxical-psysonic/src/lib/navigation/detailServerScope.test.ts
T
2026-07-19 22:57:48 +03:00

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');
});
});