From 9b4f907db641aa64cc3cb34cb8a1f8b5b7e4bd5c Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sun, 10 May 2026 15:58:14 -0400 Subject: [PATCH] refactor(web): sweep 24 test files to use makeTrack/makeTracks fixtures (#375) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces inline TrackRef literal redefinitions with calls to the test-utils helper. Tests that asserted on default field values (e.g. track titles, artist names rendered in the DOM) keep explicit overrides; tests that only need a stub for shape now use makeTrack() with no overrides. PlaylistCard.test.ts, PlaylistTrackRow.test.ts, and playlist.test.ts SKIPPED — they use PlaylistTrack (with track_id/added_at), not TrackRef. ArtistCard.svelte and +page.svelte route files (matched by initial grep) SKIPPED — live code, not test files. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../lib/components/AddToPlaylistMenu.test.ts | 13 ++----------- web/src/lib/components/AlbumCard.test.ts | 17 +++++++++-------- web/src/lib/components/AlbumMenu.test.ts | 8 ++++---- web/src/lib/components/ArtistCard.test.ts | 16 +++++++--------- web/src/lib/components/ArtistMenu.test.ts | 8 ++++---- web/src/lib/components/CompactTrackCard.test.ts | 17 ++++++----------- web/src/lib/components/FlagPopover.test.ts | 13 ++----------- web/src/lib/components/HistoryRow.test.ts | 13 ++++--------- web/src/lib/components/PlayerBar.test.ts | 10 +++++----- web/src/lib/components/QueueDrawer.test.ts | 12 ++---------- web/src/lib/components/QueueTrackRow.test.ts | 14 ++++---------- .../lib/components/RemoveTrackPopover.test.ts | 13 ++----------- web/src/lib/components/TrackMenu.test.ts | 13 ++----------- web/src/lib/components/TrackRow.test.ts | 17 +++-------------- web/src/lib/player/events.svelte.test.ts | 11 +++++------ web/src/lib/player/mediaSession.svelte.test.ts | 13 ++++++------- web/src/lib/player/persisted.test.ts | 13 ++----------- web/src/lib/player/store.test.ts | 11 +++++------ web/src/lib/utils/dayGroup.test.ts | 13 ++----------- web/src/routes/albums/[id]/album.test.ts | 7 ++++--- web/src/routes/library/history/page.test.ts | 13 ++----------- web/src/routes/library/liked/liked.test.ts | 11 +++++------ web/src/routes/search/search.test.ts | 12 ++++++------ web/src/routes/search/tracks/tracks.test.ts | 9 ++------- 24 files changed, 95 insertions(+), 202 deletions(-) diff --git a/web/src/lib/components/AddToPlaylistMenu.test.ts b/web/src/lib/components/AddToPlaylistMenu.test.ts index 11574c71..89ae38e5 100644 --- a/web/src/lib/components/AddToPlaylistMenu.test.ts +++ b/web/src/lib/components/AddToPlaylistMenu.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test, vi } from 'vitest'; import { render, screen, fireEvent, waitFor } from '@testing-library/svelte'; import { readable } from 'svelte/store'; -import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; const playlistsData = vi.hoisted(() => ({ owned: [ @@ -69,16 +69,7 @@ vi.mock('$lib/api/playlists', () => ({ import AddToPlaylistMenu from './AddToPlaylistMenu.svelte'; -const track: TrackRef = { - id: 't1', - title: 'Roygbiv', - album_id: 'a1', - album_title: 'MHTRTC', - artist_id: 'ar1', - artist_name: 'BoC', - duration_sec: 137, - stream_url: '/api/tracks/t1/stream' -}; +const track = makeTrack(); describe('AddToPlaylistMenu', () => { test('lists own playlists alphabetically followed by "New playlist…"', () => { diff --git a/web/src/lib/components/AlbumCard.test.ts b/web/src/lib/components/AlbumCard.test.ts index 1f489c7c..39327a4c 100644 --- a/web/src/lib/components/AlbumCard.test.ts +++ b/web/src/lib/components/AlbumCard.test.ts @@ -3,6 +3,7 @@ import { render, screen, fireEvent } from '@testing-library/svelte'; import type { AlbumRef, AlbumDetail, TrackRef } from '$lib/api/types'; import { FALLBACK_COVER } from '$lib/media/covers'; import { emptyLikesMock } from '../../test-utils/mocks/likes'; +import { makeTrack } from '$test-utils/fixtures/track'; vi.mock('$lib/api/client', () => ({ api: { get: vi.fn() } @@ -80,13 +81,12 @@ describe('AlbumCard', () => { test('+ queue button fetches album detail and calls enqueueTracks', async () => { const tracks: TrackRef[] = [ - { - id: 't1', title: 'So What', + makeTrack({ + title: 'So What', album_id: 'xyz', album_title: 'Kind of Blue', artist_id: 'm-davis', artist_name: 'Miles Davis', - track_number: 1, disc_number: 1, duration_sec: 545, - stream_url: '/api/tracks/t1/stream' - } + duration_sec: 545 + }) ]; const detail: AlbumDetail = { ...album, tracks }; (api.get as ReturnType).mockResolvedValueOnce(detail); @@ -102,11 +102,12 @@ describe('AlbumCard', () => { test('play overlay click fetches album detail and calls playQueue at index 0', async () => { const tracks: TrackRef[] = [ - { id: 't1', title: 'So What', + makeTrack({ + title: 'So What', album_id: 'xyz', album_title: 'Kind of Blue', artist_id: 'm-davis', artist_name: 'Miles Davis', - track_number: 1, disc_number: 1, duration_sec: 545, - stream_url: '/api/tracks/t1/stream' } + duration_sec: 545 + }) ]; const detail: AlbumDetail = { ...album, tracks }; (api.get as ReturnType).mockResolvedValueOnce(detail); diff --git a/web/src/lib/components/AlbumMenu.test.ts b/web/src/lib/components/AlbumMenu.test.ts index 9d4e15f6..6db143d4 100644 --- a/web/src/lib/components/AlbumMenu.test.ts +++ b/web/src/lib/components/AlbumMenu.test.ts @@ -3,6 +3,7 @@ import { render, screen, fireEvent, waitFor } from '@testing-library/svelte'; import { readable } from 'svelte/store'; import { emptyLikesMock } from '../../test-utils/mocks/likes'; import type { TrackRef } from '$lib/api/types'; +import { makeTracks } from '$test-utils/fixtures/track'; vi.mock('$app/navigation', () => ({ goto: vi.fn() })); @@ -30,10 +31,9 @@ import { listAlbumTracks } from '$lib/api/albums'; import { likeEntity } from '$lib/api/likes'; import { goto } from '$app/navigation'; -const TRACKS: TrackRef[] = [ - { id: 't1', title: 'A', album_id: 'al1', album_title: 'Disc', artist_id: 'a1', artist_name: 'Test', duration_sec: 100, stream_url: '/s/t1' }, - { id: 't2', title: 'B', album_id: 'al1', album_title: 'Disc', artist_id: 'a1', artist_name: 'Test', duration_sec: 100, stream_url: '/s/t2' } -]; +const TRACKS: TrackRef[] = makeTracks(2, { + album_id: 'al1', album_title: 'Disc', artist_id: 'a1', artist_name: 'Test' +}); const PROPS = { albumId: 'al1', albumTitle: 'Disc', artistId: 'a1', artistName: 'Test' }; diff --git a/web/src/lib/components/ArtistCard.test.ts b/web/src/lib/components/ArtistCard.test.ts index 9dcbb473..c92dbfae 100644 --- a/web/src/lib/components/ArtistCard.test.ts +++ b/web/src/lib/components/ArtistCard.test.ts @@ -2,6 +2,7 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/svelte'; import { emptyLikesMock } from '../../test-utils/mocks/likes'; import type { ArtistRef, TrackRef } from '$lib/api/types'; +import { makeTrack, makeTracks } from '$test-utils/fixtures/track'; vi.mock('$lib/api/client', () => ({ api: { get: vi.fn() } @@ -46,14 +47,11 @@ describe('ArtistCard', () => { }); test('play overlay fetches tracks, shuffles, calls playQueue', async () => { - const tracks: TrackRef[] = [ - { id: 't1', title: 'A', album_id: 'al-1', album_title: 'X', - artist_id: 'art-1', artist_name: 'BoC', - track_number: 1, disc_number: 1, duration_sec: 1, stream_url: '/x' }, - { id: 't2', title: 'B', album_id: 'al-1', album_title: 'X', - artist_id: 'art-1', artist_name: 'BoC', - track_number: 2, disc_number: 1, duration_sec: 1, stream_url: '/x' } - ]; + const tracks: TrackRef[] = makeTracks(2, { + album_id: 'al-1', album_title: 'X', + artist_id: 'art-1', artist_name: 'BoC', + duration_sec: 1 + }); (api.get as ReturnType).mockResolvedValueOnce(tracks); render(ArtistCard, { props: { artist } }); @@ -83,7 +81,7 @@ describe('ArtistCard', () => { test('+queue button calls listArtistTracks then enqueueTracks', async () => { const fakeTracks = [ - { id: 't1', title: 'A', album_id: 'al1', album_title: 'X', artist_id: 'art-1', artist_name: 'BoC', duration_sec: 60, stream_url: '/s/t1' } + makeTrack({ artist_id: 'art-1', artist_name: 'BoC' }) ]; const { listArtistTracks } = await import('$lib/api/artists'); (listArtistTracks as unknown as ReturnType).mockResolvedValueOnce(fakeTracks); diff --git a/web/src/lib/components/ArtistMenu.test.ts b/web/src/lib/components/ArtistMenu.test.ts index a0ba00af..d8439841 100644 --- a/web/src/lib/components/ArtistMenu.test.ts +++ b/web/src/lib/components/ArtistMenu.test.ts @@ -3,6 +3,7 @@ import { render, screen, fireEvent, waitFor } from '@testing-library/svelte'; import { readable } from 'svelte/store'; import { emptyLikesMock } from '../../test-utils/mocks/likes'; import type { TrackRef } from '$lib/api/types'; +import { makeTracks } from '$test-utils/fixtures/track'; vi.mock('$app/navigation', () => ({ goto: vi.fn() })); @@ -28,10 +29,9 @@ import { enqueueTracks } from '$lib/player/store.svelte'; import { listArtistTracks } from '$lib/api/artists'; import { likeEntity, unlikeEntity } from '$lib/api/likes'; -const TRACKS: TrackRef[] = [ - { id: 't1', title: 'A', album_id: 'al1', album_title: 'X', artist_id: 'a1', artist_name: 'Test', duration_sec: 100, stream_url: '/s/t1' }, - { id: 't2', title: 'B', album_id: 'al1', album_title: 'X', artist_id: 'a1', artist_name: 'Test', duration_sec: 100, stream_url: '/s/t2' } -]; +const TRACKS: TrackRef[] = makeTracks(2, { + album_id: 'al1', artist_id: 'a1', artist_name: 'Test' +}); afterEach(() => { vi.clearAllMocks(); diff --git a/web/src/lib/components/CompactTrackCard.test.ts b/web/src/lib/components/CompactTrackCard.test.ts index 3df4e135..0dfb1532 100644 --- a/web/src/lib/components/CompactTrackCard.test.ts +++ b/web/src/lib/components/CompactTrackCard.test.ts @@ -4,6 +4,7 @@ import type { TrackRef } from '$lib/api/types'; import { readable } from 'svelte/store'; import { emptyLikesMock } from '../../test-utils/mocks/likes'; import { emptyQuarantineMock } from '../../test-utils/mocks/quarantine'; +import { makeTracks } from '$test-utils/fixtures/track'; vi.mock('$lib/api/likes', () => emptyLikesMock()); @@ -35,17 +36,11 @@ vi.mock('$lib/player/store.svelte', () => ({ import CompactTrackCard from './CompactTrackCard.svelte'; import { playQueue, enqueueTrack } from '$lib/player/store.svelte'; -const tracks: TrackRef[] = [ - { id: 't1', title: 'First', album_id: 'a1', album_title: 'A', - artist_id: 'art-1', artist_name: 'Artist', - track_number: 1, disc_number: 1, duration_sec: 1, stream_url: '/a' }, - { id: 't2', title: 'Second', album_id: 'a1', album_title: 'A', - artist_id: 'art-1', artist_name: 'Artist', - track_number: 2, disc_number: 1, duration_sec: 1, stream_url: '/b' }, - { id: 't3', title: 'Third', album_id: 'a1', album_title: 'A', - artist_id: 'art-1', artist_name: 'Artist', - track_number: 3, disc_number: 1, duration_sec: 1, stream_url: '/c' } -]; +const titles = ['First', 'Second', 'Third']; +const tracks: TrackRef[] = makeTracks(3, { artist_name: 'Artist' }).map((t, i) => ({ + ...t, + title: titles[i] +})); afterEach(() => vi.clearAllMocks()); diff --git a/web/src/lib/components/FlagPopover.test.ts b/web/src/lib/components/FlagPopover.test.ts index 0bd19363..90837cc2 100644 --- a/web/src/lib/components/FlagPopover.test.ts +++ b/web/src/lib/components/FlagPopover.test.ts @@ -1,7 +1,7 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/svelte'; import FlagPopover from './FlagPopover.svelte'; -import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; const invalidateMock = vi.fn(); vi.mock('@tanstack/svelte-query', async (orig) => { @@ -18,16 +18,7 @@ vi.mock('$lib/api/quarantine', () => ({ import { flagTrack } from '$lib/api/quarantine'; -const track: TrackRef = { - id: 't1', - title: 'Roygbiv', - album_id: 'a1', - album_title: 'Geogaddi', - artist_id: 'ar1', - artist_name: 'Boards of Canada', - duration_sec: 240, - stream_url: '/api/tracks/t1/stream' -}; +const track = makeTrack(); afterEach(() => vi.clearAllMocks()); diff --git a/web/src/lib/components/HistoryRow.test.ts b/web/src/lib/components/HistoryRow.test.ts index bd5b050c..341e687e 100644 --- a/web/src/lib/components/HistoryRow.test.ts +++ b/web/src/lib/components/HistoryRow.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/svelte'; import HistoryRow from './HistoryRow.svelte'; import type { HistoryEvent } from '$lib/api/history'; -import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; const playQueue = vi.fn(); @@ -10,16 +10,11 @@ vi.mock('$lib/player/store.svelte', () => ({ playQueue: (...args: unknown[]) => playQueue(...args) })); -const sampleTrack: TrackRef = { - id: 'track-1', +const sampleTrack = makeTrack({ title: 'Song Title', - album_id: 'album-1', album_title: 'Album', - artist_id: 'artist-1', - artist_name: 'Artist Name', - duration_sec: 200, - stream_url: '/stream/track-1' -}; + artist_name: 'Artist Name' +}); const sampleEvent: HistoryEvent = { id: 'event-1', diff --git a/web/src/lib/components/PlayerBar.test.ts b/web/src/lib/components/PlayerBar.test.ts index 375a1d10..14f4ac00 100644 --- a/web/src/lib/components/PlayerBar.test.ts +++ b/web/src/lib/components/PlayerBar.test.ts @@ -3,6 +3,7 @@ import { render, screen, fireEvent } from '@testing-library/svelte'; import type { TrackRef } from '$lib/api/types'; import { emptyLikesMock } from '../../test-utils/mocks/likes'; import { emptyQuarantineMock } from '../../test-utils/mocks/quarantine'; +import { makeTrack } from '$test-utils/fixtures/track'; // Mutable state the mocked store reads from. const state = vi.hoisted(() => ({ @@ -57,13 +58,12 @@ import { } from '$lib/player/store.svelte'; function track(): TrackRef { - return { - id: 't1', title: 'So What', + return makeTrack({ + title: 'So What', album_id: 'xyz', album_title: 'Kind of Blue', artist_id: 'md', artist_name: 'Miles Davis', - track_number: 1, disc_number: 1, - duration_sec: 545, stream_url: '/api/tracks/t1/stream' - }; + duration_sec: 545 + }); } beforeEach(() => { diff --git a/web/src/lib/components/QueueDrawer.test.ts b/web/src/lib/components/QueueDrawer.test.ts index a42cb202..b95a22d2 100644 --- a/web/src/lib/components/QueueDrawer.test.ts +++ b/web/src/lib/components/QueueDrawer.test.ts @@ -2,6 +2,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/svelte'; import QueueDrawer from './QueueDrawer.svelte'; import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; const closeQueueDrawer = vi.fn(); let queueValue: TrackRef[] = []; @@ -22,16 +23,7 @@ vi.mock('$lib/player/store.svelte', () => ({ moveQueueItem: vi.fn() })); -const t = (id: string): TrackRef => ({ - id, - title: `Song ${id}`, - album_id: `al-${id}`, - album_title: 'A', - artist_id: `ar-${id}`, - artist_name: `Artist ${id}`, - duration_sec: 200, - stream_url: `/stream/${id}` -}); +const t = (id: string): TrackRef => makeTrack({ id, title: `Song ${id}` }); describe('QueueDrawer', () => { beforeEach(() => { diff --git a/web/src/lib/components/QueueTrackRow.test.ts b/web/src/lib/components/QueueTrackRow.test.ts index 87117942..96428bb0 100644 --- a/web/src/lib/components/QueueTrackRow.test.ts +++ b/web/src/lib/components/QueueTrackRow.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/svelte'; import QueueTrackRow from './QueueTrackRow.svelte'; -import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; const playFromQueueIndex = vi.fn(); const removeFromQueue = vi.fn(); @@ -13,16 +13,10 @@ vi.mock('$lib/player/store.svelte', () => ({ moveQueueItem: (...args: unknown[]) => moveQueueItem(...args) })); -const sampleTrack: TrackRef = { - id: 't1', +const sampleTrack = makeTrack({ title: 'Song Title', - album_id: 'al1', - album_title: 'Album', - artist_id: 'ar1', - artist_name: 'Artist Name', - duration_sec: 200, - stream_url: '/stream/t1' -}; + artist_name: 'Artist Name' +}); describe('QueueTrackRow', () => { beforeEach(() => { diff --git a/web/src/lib/components/RemoveTrackPopover.test.ts b/web/src/lib/components/RemoveTrackPopover.test.ts index 926083ec..93b2505a 100644 --- a/web/src/lib/components/RemoveTrackPopover.test.ts +++ b/web/src/lib/components/RemoveTrackPopover.test.ts @@ -1,6 +1,6 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; import { render, screen, fireEvent, waitFor } from '@testing-library/svelte'; -import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; const invalidateMock = vi.fn(); vi.mock('@tanstack/svelte-query', async (orig) => { @@ -18,16 +18,7 @@ vi.mock('$lib/api/admin/tracks', () => ({ import RemoveTrackPopover from './RemoveTrackPopover.svelte'; import { removeTrack } from '$lib/api/admin/tracks'; -const track: TrackRef = { - id: 't1', - title: 'Roygbiv', - album_id: 'a1', - album_title: 'Geogaddi', - artist_id: 'ar1', - artist_name: 'Boards of Canada', - duration_sec: 240, - stream_url: '/api/tracks/t1/stream' -}; +const track = makeTrack({ title: 'Roygbiv' }); afterEach(() => vi.clearAllMocks()); diff --git a/web/src/lib/components/TrackMenu.test.ts b/web/src/lib/components/TrackMenu.test.ts index b1bf0c48..7a50a9dc 100644 --- a/web/src/lib/components/TrackMenu.test.ts +++ b/web/src/lib/components/TrackMenu.test.ts @@ -3,7 +3,7 @@ import { render, screen, fireEvent, waitFor } from '@testing-library/svelte'; import { readable } from 'svelte/store'; import { emptyLikesMock } from '../../test-utils/mocks/likes'; import { emptyQuarantineMock } from '../../test-utils/mocks/quarantine'; -import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; // Mutable mock-user handle so individual tests can flip is_admin / null // without re-importing the module under test. @@ -44,16 +44,7 @@ vi.mock('$lib/player/store.svelte', () => ({ import TrackMenu from './TrackMenu.svelte'; import { playNext, enqueueTrack } from '$lib/player/store.svelte'; -const track: TrackRef = { - id: 't1', - title: 'Roygbiv', - album_id: 'a1', - album_title: 'Geogaddi', - artist_id: 'ar1', - artist_name: 'Boards of Canada', - duration_sec: 240, - stream_url: '/api/tracks/t1/stream' -}; +const track = makeTrack({ title: 'Roygbiv' }); afterEach(() => { vi.clearAllMocks(); diff --git a/web/src/lib/components/TrackRow.test.ts b/web/src/lib/components/TrackRow.test.ts index e16c0b6b..a1717f28 100644 --- a/web/src/lib/components/TrackRow.test.ts +++ b/web/src/lib/components/TrackRow.test.ts @@ -3,6 +3,7 @@ import { render, screen, fireEvent } from '@testing-library/svelte'; import type { TrackRef } from '$lib/api/types'; import { emptyLikesMock } from '../../test-utils/mocks/likes'; import { emptyQuarantineMock } from '../../test-utils/mocks/quarantine'; +import { makeTrack } from '$test-utils/fixtures/track'; vi.mock('$lib/player/store.svelte', () => ({ playQueue: vi.fn(), @@ -18,20 +19,8 @@ import TrackRow from './TrackRow.svelte'; import { playQueue, enqueueTrack, playRadio } from '$lib/player/store.svelte'; const tracks: TrackRef[] = [ - { - id: 't1', title: 'So What', - album_id: 'xyz', album_title: 'Kind of Blue', - artist_id: 'm-davis', artist_name: 'Miles Davis', - track_number: 1, disc_number: 1, - duration_sec: 545, stream_url: '/api/tracks/t1/stream' - }, - { - id: 't2', title: 'Freddie Freeloader', - album_id: 'xyz', album_title: 'Kind of Blue', - artist_id: 'm-davis', artist_name: 'Miles Davis', - track_number: 2, disc_number: 1, - duration_sec: 565, stream_url: '/api/tracks/t2/stream' - } + makeTrack({ title: 'So What', duration_sec: 545 }), + makeTrack({ id: 't2', title: 'Freddie Freeloader', track_number: 2, duration_sec: 565, stream_url: '/api/tracks/t2/stream' }) ]; afterEach(() => vi.clearAllMocks()); diff --git a/web/src/lib/player/events.svelte.test.ts b/web/src/lib/player/events.svelte.test.ts index bcb657d9..74e324f8 100644 --- a/web/src/lib/player/events.svelte.test.ts +++ b/web/src/lib/player/events.svelte.test.ts @@ -21,16 +21,15 @@ import { } from './store.svelte'; import { api } from '$lib/api/client'; import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; function track(id: string, dur = 200): TrackRef { - return { - id, title: `T ${id}`, - album_id: 'a', album_title: 'A', - artist_id: 'ar', artist_name: 'Ar', - track_number: Number(id), disc_number: 1, + return makeTrack({ + id, + title: `T ${id}`, duration_sec: dur, stream_url: `/api/tracks/${id}/stream` - }; + }); } beforeEach(() => { diff --git a/web/src/lib/player/mediaSession.svelte.test.ts b/web/src/lib/player/mediaSession.svelte.test.ts index faf89dc6..385d0b93 100644 --- a/web/src/lib/player/mediaSession.svelte.test.ts +++ b/web/src/lib/player/mediaSession.svelte.test.ts @@ -1,15 +1,14 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import { flushSync } from 'svelte'; import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; function track(id: string): TrackRef { - return { - id, title: `T ${id}`, - album_id: 'a1', album_title: 'A', - artist_id: 'ar1', artist_name: 'Ar', - track_number: Number(id), disc_number: 1, - duration_sec: 180, stream_url: `/api/tracks/${id}/stream` - }; + return makeTrack({ + id, + title: `T ${id}`, + stream_url: `/api/tracks/${id}/stream` + }); } type Handler = (details: MediaSessionActionDetails) => void; diff --git a/web/src/lib/player/persisted.test.ts b/web/src/lib/player/persisted.test.ts index b5e00695..1eb711a7 100644 --- a/web/src/lib/player/persisted.test.ts +++ b/web/src/lib/player/persisted.test.ts @@ -1,17 +1,8 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { readPersistedQueue, writePersistedQueue, clearPersistedQueue } from './persisted'; -import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; -const sampleTrack: TrackRef = { - id: 't1', - title: 'Foo', - album_id: 'al1', - album_title: 'Baz', - artist_id: 'ar1', - artist_name: 'Bar', - duration_sec: 200, - stream_url: '/stream/t1' -}; +const sampleTrack = makeTrack(); describe('persisted queue', () => { beforeEach(() => { diff --git a/web/src/lib/player/store.test.ts b/web/src/lib/player/store.test.ts index 2d894db7..bc83a7ea 100644 --- a/web/src/lib/player/store.test.ts +++ b/web/src/lib/player/store.test.ts @@ -19,6 +19,7 @@ import { } from './store.svelte'; import type { TrackRef } from '$lib/api/types'; import { writePersistedQueue, clearPersistedQueue } from './persisted'; +import { makeTrack } from '$test-utils/fixtures/track'; vi.mock('$lib/auth/store.svelte', () => ({ user: { @@ -29,14 +30,12 @@ vi.mock('$lib/auth/store.svelte', () => ({ })); function track(id: string, dur = 180): TrackRef { - return { - id, title: `T ${id}`, - album_id: 'a1', album_title: 'A', - artist_id: 'ar1', artist_name: 'Ar', - track_number: Number(id), disc_number: 1, + return makeTrack({ + id, + title: `T ${id}`, duration_sec: dur, stream_url: `/api/tracks/${id}/stream` - }; + }); } beforeEach(() => { diff --git a/web/src/lib/utils/dayGroup.test.ts b/web/src/lib/utils/dayGroup.test.ts index f7cb03d6..12768b6f 100644 --- a/web/src/lib/utils/dayGroup.test.ts +++ b/web/src/lib/utils/dayGroup.test.ts @@ -1,20 +1,11 @@ import { describe, it, expect } from 'vitest'; import { dayBucket, groupByDay } from './dayGroup'; import type { HistoryEvent } from '$lib/api/history'; -import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; const NOW = new Date('2026-05-04T14:00:00Z'); -const stubTrack: TrackRef = { - id: 'track-x', - title: 'Song X', - album_id: 'al-x', - album_title: 'Album X', - artist_id: 'ar-x', - artist_name: 'Artist X', - duration_sec: 200, - stream_url: '/stream/x' -}; +const stubTrack = makeTrack(); const mkEvent = (id: string, playedAt: string): HistoryEvent => ({ id, diff --git a/web/src/routes/albums/[id]/album.test.ts b/web/src/routes/albums/[id]/album.test.ts index 5d96312c..23c1427f 100644 --- a/web/src/routes/albums/[id]/album.test.ts +++ b/web/src/routes/albums/[id]/album.test.ts @@ -4,6 +4,7 @@ import { flushSync } from 'svelte'; import { mockQuery } from '../../../test-utils/query'; import { emptyLikesMock } from '../../../test-utils/mocks/likes'; import type { AlbumDetail, TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; const state = vi.hoisted(() => ({ pageParams: { id: 'xyz' } as Record })); @@ -25,14 +26,14 @@ import AlbumPage from './+page.svelte'; import { createAlbumQuery } from '$lib/api/queries'; function track(id: string, title: string, number: number, dur: number): TrackRef { - return { + return makeTrack({ id, title, album_id: 'xyz', album_title: 'Kind of Blue', artist_id: 'md', artist_name: 'Miles Davis', - track_number: number, disc_number: 1, + track_number: number, duration_sec: dur, stream_url: `/api/tracks/${id}/stream` - }; + }); } afterEach(() => { diff --git a/web/src/routes/library/history/page.test.ts b/web/src/routes/library/history/page.test.ts index b276e064..522fa48c 100644 --- a/web/src/routes/library/history/page.test.ts +++ b/web/src/routes/library/history/page.test.ts @@ -2,18 +2,9 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen } from '@testing-library/svelte'; import HistoryPage from './+page.svelte'; import type { HistoryEvent, HistoryResponse } from '$lib/api/history'; -import type { TrackRef } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; -const mkTrack = (id: string): TrackRef => ({ - id: `track-${id}`, - title: `Song ${id}`, - album_id: `album-${id}`, - album_title: `Album ${id}`, - artist_id: `artist-${id}`, - artist_name: `Artist ${id}`, - duration_sec: 200, - stream_url: `/stream/${id}` -}); +const mkTrack = (id: string) => makeTrack({ id: `track-${id}`, title: `Song ${id}` }); const mkEvent = (id: string, playedAt: Date): HistoryEvent => ({ id: `event-${id}`, diff --git a/web/src/routes/library/liked/liked.test.ts b/web/src/routes/library/liked/liked.test.ts index b2248666..0211c94f 100644 --- a/web/src/routes/library/liked/liked.test.ts +++ b/web/src/routes/library/liked/liked.test.ts @@ -3,6 +3,7 @@ import { render, screen, fireEvent } from '@testing-library/svelte'; import { mockInfiniteQuery } from '../../../test-utils/query'; import type { ArtistRef, AlbumRef, TrackRef, Page } from '$lib/api/types'; import { readable } from 'svelte/store'; +import { makeTrack } from '$test-utils/fixtures/track'; vi.mock('$lib/api/likes', () => ({ createLikedIdsQuery: () => readable({ @@ -42,12 +43,10 @@ describe('liked library page', () => { id: 'al1', title: 'Y', sort_title: 'Y', artist_id: 'a1', artist_name: 'X', year: 2020, track_count: 1, duration_sec: 100, cover_url: '/x', cover_art_source: null }; - const tr: TrackRef = { - id: 't1', title: 'Z', album_id: 'al1', album_title: 'Y', - artist_id: 'a1', artist_name: 'X', - track_number: 1, disc_number: 1, duration_sec: 100, - stream_url: '/api/tracks/t1/stream' - }; + const tr: TrackRef = makeTrack({ + title: 'Z', album_id: 'al1', album_title: 'Y', + artist_id: 'a1', artist_name: 'X', duration_sec: 100 + }); (createLikedArtistsInfiniteQuery as ReturnType).mockReturnValue( mockInfiniteQuery({ pages: [page([ar], 1)] }) ); diff --git a/web/src/routes/search/search.test.ts b/web/src/routes/search/search.test.ts index beec6dac..ae13d0a4 100644 --- a/web/src/routes/search/search.test.ts +++ b/web/src/routes/search/search.test.ts @@ -3,7 +3,8 @@ import { render, screen } from '@testing-library/svelte'; import { mockQuery } from '../../test-utils/query'; import { emptyLikesMock } from '../../test-utils/mocks/likes'; import { pageUrlModule } from '$test-utils/mocks/appState'; -import type { ArtistRef, AlbumRef, TrackRef, SearchResponse } from '$lib/api/types'; +import type { ArtistRef, AlbumRef, SearchResponse } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; const state = vi.hoisted(() => ({ pageUrl: new URL('http://localhost/search') @@ -44,13 +45,12 @@ const album: AlbumRef = { id: 'al1', title: 'Kind of Blue', sort_title: 'Kind of Blue', artist_id: 'a1', artist_name: 'Miles Davis', year: 1959, track_count: 5, duration_sec: 2630, cover_url: '/api/albums/al1/cover', cover_art_source: null }; -const track: TrackRef = { - id: 't1', title: 'So What', +const track = makeTrack({ + title: 'So What', album_id: 'al1', album_title: 'Kind of Blue', artist_id: 'a1', artist_name: 'Miles Davis', - track_number: 1, disc_number: 1, duration_sec: 545, - stream_url: '/api/tracks/t1/stream' -}; + duration_sec: 545 +}); afterEach(() => { vi.clearAllMocks(); diff --git a/web/src/routes/search/tracks/tracks.test.ts b/web/src/routes/search/tracks/tracks.test.ts index d8e769a9..8cb4c07e 100644 --- a/web/src/routes/search/tracks/tracks.test.ts +++ b/web/src/routes/search/tracks/tracks.test.ts @@ -5,6 +5,7 @@ import { emptyLikesMock } from '../../../test-utils/mocks/likes'; import { emptyQuarantineMock } from '../../../test-utils/mocks/quarantine'; import { pageUrlModule } from '$test-utils/mocks/appState'; import type { TrackRef, Page } from '$lib/api/types'; +import { makeTrack } from '$test-utils/fixtures/track'; const state = vi.hoisted(() => ({ pageUrl: new URL('http://localhost/search/tracks?q=miles') })); @@ -32,13 +33,7 @@ function page(items: T[], total: number, offset = 0, limit = 50): Page { return { items, total, offset, limit }; } -const track: TrackRef = { - id: 't1', title: 'So What', - album_id: 'al1', album_title: 'Kind of Blue', - artist_id: 'a1', artist_name: 'Miles Davis', - track_number: 1, disc_number: 1, duration_sec: 545, - stream_url: '/api/tracks/t1/stream' -}; +const track = makeTrack({ title: 'So What' }); afterEach(() => { vi.clearAllMocks();