refactor(web): sweep 24 test files to use makeTrack/makeTracks fixtures (#375)

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) <noreply@anthropic.com>
This commit is contained in:
2026-05-10 15:58:14 -04:00
parent 993bcc6a14
commit 9b4f907db6
24 changed files with 95 additions and 202 deletions
@@ -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…"', () => {
+9 -8
View File
@@ -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<typeof vi.fn>).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<typeof vi.fn>).mockResolvedValueOnce(detail);
+4 -4
View File
@@ -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' };
+7 -9
View File
@@ -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<typeof vi.fn>).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<typeof vi.fn>).mockResolvedValueOnce(fakeTracks);
+4 -4
View File
@@ -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();
@@ -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());
+2 -11
View File
@@ -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());
+4 -9
View File
@@ -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',
+5 -5
View File
@@ -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(() => {
+2 -10
View File
@@ -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(() => {
+4 -10
View File
@@ -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(() => {
@@ -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());
+2 -11
View File
@@ -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();
+3 -14
View File
@@ -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());