import { expect, test } from '@rstest/core'; import { selectLocalTracks, selectLocalAlbums, selectLocalArtists, } from '../src/store/selectors/localLibrary'; import type { RootState } from '../src/store/index'; function stateWith(queries: Record): RootState { return { api: { queries } } as unknown as RootState; } const track = (id: string, over: Record = {}) => ({ id, title: `Track ${id}`, artistName: 'A', albumTitle: 'Alb', ...over, }); test('selectLocalTracks unions getTracks pages, list endpoints and single tracks', () => { const state = stateWith({ 'getTracks(undefined)': { status: 'fulfilled', endpointName: 'getTracks', data: { items: [track('1'), track('2')], total: 2 }, }, 'getArtistTracks("x")': { status: 'fulfilled', endpointName: 'getArtistTracks', data: [track('2'), track('3')], // 2 is a dupe }, 'getTrack("4")': { status: 'fulfilled', endpointName: 'getTrack', data: track('4'), }, }); const ids = selectLocalTracks(state) .map((t) => t.id) .sort(); expect(ids).toEqual(['1', '2', '3', '4']); }); test('selectLocalTracks ignores pending/rejected and null-data entries', () => { const state = stateWith({ 'getTracks(a)': { status: 'rejected', endpointName: 'getTracks', data: undefined, }, 'getTracks(b)': { status: 'pending', endpointName: 'getTracks' }, 'getTracks(c)': { status: 'fulfilled', endpointName: 'getTracks', data: { items: [track('9')], total: 1 }, }, }); expect(selectLocalTracks(state).map((t) => t.id)).toEqual(['9']); }); test('selectLocalAlbums and selectLocalArtists compose and dedupe', () => { const state = stateWith({ 'getAlbums(undefined)': { status: 'fulfilled', endpointName: 'getAlbums', data: { items: [{ id: 'al1' }, { id: 'al2' }], total: 2 }, }, 'getArtistAlbums("x")': { status: 'fulfilled', endpointName: 'getArtistAlbums', data: [{ id: 'al2' }], // dupe }, 'getArtists(undefined)': { status: 'fulfilled', endpointName: 'getArtists', data: { items: [{ id: 'ar1' }], total: 1 }, }, }); expect( selectLocalAlbums(state) .map((a) => a.id) .sort(), ).toEqual(['al1', 'al2']); expect(selectLocalArtists(state).map((a) => a.id)).toEqual(['ar1']); });