diff --git a/web/src/lib/components/AlbumCard.test.ts b/web/src/lib/components/AlbumCard.test.ts index e4fb0285..1f489c7c 100644 --- a/web/src/lib/components/AlbumCard.test.ts +++ b/web/src/lib/components/AlbumCard.test.ts @@ -2,7 +2,7 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; 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 { readable } from 'svelte/store'; +import { emptyLikesMock } from '../../test-utils/mocks/likes'; vi.mock('$lib/api/client', () => ({ api: { get: vi.fn() } @@ -12,15 +12,7 @@ vi.mock('$lib/player/store.svelte', () => ({ playQueue: vi.fn() })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => readable({ - data: { track_ids: [], album_ids: [], artist_ids: [] }, - isPending: false, - isError: false - }), - likeEntity: vi.fn(), - unlikeEntity: vi.fn() -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); vi.mock('$app/navigation', () => ({ goto: vi.fn() })); diff --git a/web/src/lib/components/AlbumMenu.test.ts b/web/src/lib/components/AlbumMenu.test.ts index 6d8a0ea2..9d4e15f6 100644 --- a/web/src/lib/components/AlbumMenu.test.ts +++ b/web/src/lib/components/AlbumMenu.test.ts @@ -1,16 +1,12 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; 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'; vi.mock('$app/navigation', () => ({ goto: vi.fn() })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => - readable({ data: { track_ids: [], album_ids: [], artist_ids: [] }, isPending: false, isError: false }), - likeEntity: vi.fn().mockResolvedValue(undefined), - unlikeEntity: vi.fn().mockResolvedValue(undefined) -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); vi.mock('$lib/api/albums', async (orig) => { const actual = (await orig()) as Record; diff --git a/web/src/lib/components/ArtistCard.test.ts b/web/src/lib/components/ArtistCard.test.ts index 7faeb502..9dcbb473 100644 --- a/web/src/lib/components/ArtistCard.test.ts +++ b/web/src/lib/components/ArtistCard.test.ts @@ -1,5 +1,6 @@ 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'; vi.mock('$lib/api/client', () => ({ @@ -12,15 +13,7 @@ vi.mock('$lib/player/store.svelte', () => ({ vi.mock('$lib/api/artists', () => ({ listArtistTracks: vi.fn().mockResolvedValue([]) })); -vi.mock('$lib/api/likes', async () => { - const { readable } = await import('svelte/store'); - return { - createLikedIdsQuery: () => - readable({ data: { track_ids: [], album_ids: [], artist_ids: [] }, isPending: false, isError: false }), - likeEntity: vi.fn().mockResolvedValue(undefined), - unlikeEntity: vi.fn().mockResolvedValue(undefined) - }; -}); +vi.mock('$lib/api/likes', () => emptyLikesMock()); import ArtistCard from './ArtistCard.svelte'; import { api } from '$lib/api/client'; import { playQueue } from '$lib/player/store.svelte'; diff --git a/web/src/lib/components/ArtistMenu.test.ts b/web/src/lib/components/ArtistMenu.test.ts index d68669e6..a0ba00af 100644 --- a/web/src/lib/components/ArtistMenu.test.ts +++ b/web/src/lib/components/ArtistMenu.test.ts @@ -1,16 +1,12 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; 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'; vi.mock('$app/navigation', () => ({ goto: vi.fn() })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => - readable({ data: { track_ids: [], album_ids: [], artist_ids: [] }, isPending: false, isError: false }), - likeEntity: vi.fn().mockResolvedValue(undefined), - unlikeEntity: vi.fn().mockResolvedValue(undefined) -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); vi.mock('$lib/api/artists', () => ({ listArtistTracks: vi.fn().mockResolvedValue([]) diff --git a/web/src/lib/components/CompactTrackCard.test.ts b/web/src/lib/components/CompactTrackCard.test.ts index ab8bf665..3df4e135 100644 --- a/web/src/lib/components/CompactTrackCard.test.ts +++ b/web/src/lib/components/CompactTrackCard.test.ts @@ -2,20 +2,12 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/svelte'; 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'; -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => - readable({ data: { track_ids: [], album_ids: [], artist_ids: [] }, isPending: false, isError: false }), - likeEntity: vi.fn().mockResolvedValue(undefined), - unlikeEntity: vi.fn().mockResolvedValue(undefined) -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); -vi.mock('$lib/api/quarantine', () => ({ - flagTrack: vi.fn().mockResolvedValue({}), - unflagTrack: vi.fn().mockResolvedValue(undefined), - listMyQuarantine: vi.fn().mockResolvedValue([]), - createMyQuarantineQuery: () => readable({ data: [], isPending: false, isError: false }) -})); +vi.mock('$lib/api/quarantine', () => emptyQuarantineMock()); vi.mock('$lib/api/admin/tracks', () => ({ removeTrack: vi.fn().mockResolvedValue({ deleted_track_id: 't1' }) diff --git a/web/src/lib/components/PlayerBar.test.ts b/web/src/lib/components/PlayerBar.test.ts index 71c7f5cd..375a1d10 100644 --- a/web/src/lib/components/PlayerBar.test.ts +++ b/web/src/lib/components/PlayerBar.test.ts @@ -1,7 +1,8 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/svelte'; 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'; // Mutable state the mocked store reads from. const state = vi.hoisted(() => ({ @@ -44,22 +45,9 @@ vi.mock('$lib/player/store.svelte', () => ({ toggleQueueDrawer: vi.fn() })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => readable({ - data: { track_ids: [], album_ids: [], artist_ids: [] }, - isPending: false, - isError: false - }), - likeEntity: vi.fn(), - unlikeEntity: vi.fn() -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); -vi.mock('$lib/api/quarantine', () => ({ - flagTrack: vi.fn(), - unflagTrack: vi.fn(), - listMyQuarantine: vi.fn().mockResolvedValue([]), - createMyQuarantineQuery: vi.fn() -})); +vi.mock('$lib/api/quarantine', () => emptyQuarantineMock()); import PlayerBar from './PlayerBar.svelte'; import { diff --git a/web/src/lib/components/PlaylistTrackRow.test.ts b/web/src/lib/components/PlaylistTrackRow.test.ts index d028ab07..0dc47b4c 100644 --- a/web/src/lib/components/PlaylistTrackRow.test.ts +++ b/web/src/lib/components/PlaylistTrackRow.test.ts @@ -1,6 +1,7 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; import { render, screen, fireEvent } 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 { PlaylistTrack } from '$lib/api/types'; // LikeButton + TrackMenu transitively pull in TanStack Query, the auth @@ -16,24 +17,9 @@ vi.mock('$app/navigation', () => ({ goto: vi.fn() })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => - readable({ - data: { track_ids: [], album_ids: [], artist_ids: [] }, - isPending: false, - isError: false - }), - likeEntity: vi.fn().mockResolvedValue(undefined), - unlikeEntity: vi.fn().mockResolvedValue(undefined) -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); -vi.mock('$lib/api/quarantine', () => ({ - flagTrack: vi.fn().mockResolvedValue({}), - unflagTrack: vi.fn().mockResolvedValue(undefined), - listMyQuarantine: vi.fn().mockResolvedValue([]), - createMyQuarantineQuery: () => - readable({ data: [], isPending: false, isError: false }) -})); +vi.mock('$lib/api/quarantine', () => emptyQuarantineMock()); vi.mock('$lib/api/admin/tracks', () => ({ removeTrack: vi.fn().mockResolvedValue({ deleted_track_id: 't-1' }) diff --git a/web/src/lib/components/TrackMenu.test.ts b/web/src/lib/components/TrackMenu.test.ts index 1b7903d8..b1bf0c48 100644 --- a/web/src/lib/components/TrackMenu.test.ts +++ b/web/src/lib/components/TrackMenu.test.ts @@ -1,6 +1,8 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; 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'; // Mutable mock-user handle so individual tests can flip is_admin / null @@ -19,19 +21,9 @@ vi.mock('$app/navigation', () => ({ goto: vi.fn() })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => - readable({ data: { track_ids: [], album_ids: [], artist_ids: [] }, isPending: false, isError: false }), - likeEntity: vi.fn().mockResolvedValue(undefined), - unlikeEntity: vi.fn().mockResolvedValue(undefined) -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); -vi.mock('$lib/api/quarantine', () => ({ - flagTrack: vi.fn().mockResolvedValue({}), - unflagTrack: vi.fn().mockResolvedValue(undefined), - listMyQuarantine: vi.fn().mockResolvedValue([]), - createMyQuarantineQuery: () => readable({ data: [], isPending: false, isError: false }) -})); +vi.mock('$lib/api/quarantine', () => emptyQuarantineMock()); vi.mock('$lib/api/admin/tracks', () => ({ removeTrack: vi.fn().mockResolvedValue({ deleted_track_id: 't1' }) diff --git a/web/src/lib/components/TrackRow.test.ts b/web/src/lib/components/TrackRow.test.ts index 054e3bb1..e16c0b6b 100644 --- a/web/src/lib/components/TrackRow.test.ts +++ b/web/src/lib/components/TrackRow.test.ts @@ -1,7 +1,8 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/svelte'; 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'; vi.mock('$lib/player/store.svelte', () => ({ playQueue: vi.fn(), @@ -9,22 +10,9 @@ vi.mock('$lib/player/store.svelte', () => ({ playRadio: vi.fn() })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => readable({ - data: { track_ids: [], album_ids: [], artist_ids: [] }, - isPending: false, - isError: false - }), - likeEntity: vi.fn(), - unlikeEntity: vi.fn() -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); -vi.mock('$lib/api/quarantine', () => ({ - flagTrack: vi.fn(), - unflagTrack: vi.fn(), - listMyQuarantine: vi.fn().mockResolvedValue([]), - createMyQuarantineQuery: vi.fn() -})); +vi.mock('$lib/api/quarantine', () => emptyQuarantineMock()); import TrackRow from './TrackRow.svelte'; import { playQueue, enqueueTrack, playRadio } from '$lib/player/store.svelte'; diff --git a/web/src/routes/albums/[id]/album.test.ts b/web/src/routes/albums/[id]/album.test.ts index 3efc3dc9..5d96312c 100644 --- a/web/src/routes/albums/[id]/album.test.ts +++ b/web/src/routes/albums/[id]/album.test.ts @@ -1,8 +1,8 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; import { render, screen } from '@testing-library/svelte'; import { flushSync } from 'svelte'; -import { readable } from 'svelte/store'; import { mockQuery } from '../../../test-utils/query'; +import { emptyLikesMock } from '../../../test-utils/mocks/likes'; import type { AlbumDetail, TrackRef } from '$lib/api/types'; const state = vi.hoisted(() => ({ pageParams: { id: 'xyz' } as Record })); @@ -19,15 +19,7 @@ vi.mock('$lib/api/queries', () => ({ createAlbumQuery: vi.fn() })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => readable({ - data: { track_ids: [], album_ids: [], artist_ids: [] }, - isPending: false, - isError: false - }), - likeEntity: vi.fn(), - unlikeEntity: vi.fn() -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); import AlbumPage from './+page.svelte'; import { createAlbumQuery } from '$lib/api/queries'; diff --git a/web/src/routes/artists/[id]/artist.test.ts b/web/src/routes/artists/[id]/artist.test.ts index 1bd387d8..38541d1d 100644 --- a/web/src/routes/artists/[id]/artist.test.ts +++ b/web/src/routes/artists/[id]/artist.test.ts @@ -1,8 +1,8 @@ import { afterEach, describe, expect, test, vi } from 'vitest'; import { render, screen } from '@testing-library/svelte'; import { flushSync } from 'svelte'; -import { readable } from 'svelte/store'; import { mockQuery } from '../../../test-utils/query'; +import { emptyLikesMock } from '../../../test-utils/mocks/likes'; import type { ArtistDetail, AlbumRef } from '$lib/api/types'; const state = vi.hoisted(() => ({ pageParams: { id: 'abc' } as Record })); @@ -19,15 +19,7 @@ vi.mock('$lib/api/queries', () => ({ createArtistQuery: vi.fn() })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => readable({ - data: { track_ids: [], album_ids: [], artist_ids: [] }, - isPending: false, - isError: false - }), - likeEntity: vi.fn(), - unlikeEntity: vi.fn() -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); import ArtistPage from './+page.svelte'; import { createArtistQuery } from '$lib/api/queries'; diff --git a/web/src/routes/library/albums/page.test.ts b/web/src/routes/library/albums/page.test.ts index 80d2f656..a48ef9a6 100644 --- a/web/src/routes/library/albums/page.test.ts +++ b/web/src/routes/library/albums/page.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test, vi } from 'vitest'; import { render, screen } from '@testing-library/svelte'; import { readable } from 'svelte/store'; +import { emptyLikesMock } from '../../../test-utils/mocks/likes'; vi.mock('$lib/api/albums', () => ({ createAlbumsAlphaInfiniteQuery: () => readable({ @@ -29,14 +30,7 @@ vi.mock('$lib/player/store.svelte', () => ({ enqueueTracks: vi.fn(), playQueue: vi.fn() })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => readable({ - data: { track_ids: [], album_ids: [], artist_ids: [] }, - isPending: false, isError: false - }), - likeEntity: vi.fn(), - unlikeEntity: vi.fn() -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); // AlbumCard renders LikeButton, which calls useQueryClient() to get the // cache for invalidation. The page test isn't wrapped in a QueryClientProvider, // so we stub useQueryClient with a noop client. diff --git a/web/src/routes/library/artists/page.test.ts b/web/src/routes/library/artists/page.test.ts index f99ecbc6..27e221d4 100644 --- a/web/src/routes/library/artists/page.test.ts +++ b/web/src/routes/library/artists/page.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test, vi } from 'vitest'; import { render, screen } from '@testing-library/svelte'; import { readable } from 'svelte/store'; +import { emptyLikesMock } from '../../../test-utils/mocks/likes'; vi.mock('$lib/api/queries', () => ({ createArtistsQuery: () => readable({ @@ -27,12 +28,7 @@ vi.mock('$lib/player/store.svelte', () => ({ vi.mock('$lib/api/artists', () => ({ listArtistTracks: vi.fn().mockResolvedValue([]) })); -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => - readable({ data: { track_ids: [], album_ids: [], artist_ids: [] }, isPending: false, isError: false }), - likeEntity: vi.fn().mockResolvedValue(undefined), - unlikeEntity: vi.fn().mockResolvedValue(undefined) -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); import Page from './+page.svelte'; describe('/library/artists', () => { diff --git a/web/src/routes/page.test.ts b/web/src/routes/page.test.ts index c39ee179..10a5466e 100644 --- a/web/src/routes/page.test.ts +++ b/web/src/routes/page.test.ts @@ -1,6 +1,7 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; import { render, screen } from '@testing-library/svelte'; import { readable } from 'svelte/store'; +import { emptyLikesMock } from '../test-utils/mocks/likes'; import type { Playlist } from '$lib/api/types'; // Mock all the queries the home page constructs. @@ -29,12 +30,7 @@ vi.mock('$lib/api/me', () => ({ })); // LikeButton imports — needed because the home renders cards that may use it. -vi.mock('$lib/api/likes', () => ({ - createLikedIdsQuery: () => - readable({ data: { track_ids: [], album_ids: [], artist_ids: [] }, isPending: false, isError: false }), - likeEntity: vi.fn().mockResolvedValue(undefined), - unlikeEntity: vi.fn().mockResolvedValue(undefined) -})); +vi.mock('$lib/api/likes', () => emptyLikesMock()); import Page from './+page.svelte'; import { createPlaylistsQuery } from '$lib/api/playlists';