diff --git a/web/src/lib/components/TrackRow.svelte b/web/src/lib/components/TrackRow.svelte index c5d7144d..5cad7134 100644 --- a/web/src/lib/components/TrackRow.svelte +++ b/web/src/lib/components/TrackRow.svelte @@ -1,25 +1,57 @@ - {formatDuration(track.duration_sec)} - + diff --git a/web/src/lib/components/TrackRow.test.ts b/web/src/lib/components/TrackRow.test.ts index d4648247..9d6de2ac 100644 --- a/web/src/lib/components/TrackRow.test.ts +++ b/web/src/lib/components/TrackRow.test.ts @@ -3,11 +3,12 @@ import { render, screen, fireEvent } from '@testing-library/svelte'; import type { TrackRef } from '$lib/api/types'; vi.mock('$lib/player/store.svelte', () => ({ - playQueue: vi.fn() + playQueue: vi.fn(), + enqueueTrack: vi.fn() })); import TrackRow from './TrackRow.svelte'; -import { playQueue } from '$lib/player/store.svelte'; +import { playQueue, enqueueTrack } from '$lib/player/store.svelte'; const tracks: TrackRef[] = [ { @@ -44,7 +45,34 @@ describe('TrackRow', () => { test('clicking the row calls playQueue(tracks, index)', async () => { render(TrackRow, { props: { tracks, index: 1 } }); - await fireEvent.click(screen.getByRole('button')); + await fireEvent.click(screen.getByRole('button', { name: /Freddie Freeloader/ })); expect(playQueue).toHaveBeenCalledWith(tracks, 1); }); + + test('Enter on the row activates play', async () => { + render(TrackRow, { props: { tracks, index: 0 } }); + await fireEvent.keyDown(screen.getByRole('button', { name: /So What/ }), { key: 'Enter' }); + expect(playQueue).toHaveBeenCalledWith(tracks, 0); + }); + + test('Space on the row activates play', async () => { + render(TrackRow, { props: { tracks, index: 0 } }); + await fireEvent.keyDown(screen.getByRole('button', { name: /So What/ }), { key: ' ' }); + expect(playQueue).toHaveBeenCalledWith(tracks, 0); + }); + + test('onPlay prop overrides default playQueue', async () => { + const onPlay = vi.fn(); + render(TrackRow, { props: { tracks, index: 1, onPlay } }); + await fireEvent.click(screen.getByRole('button', { name: /Freddie Freeloader/ })); + expect(onPlay).toHaveBeenCalledWith(tracks, 1); + expect(playQueue).not.toHaveBeenCalled(); + }); + + test('+ queue button calls enqueueTrack and does NOT trigger row play', async () => { + render(TrackRow, { props: { tracks, index: 0 } }); + await fireEvent.click(screen.getByRole('button', { name: /add to queue/i })); + expect(enqueueTrack).toHaveBeenCalledWith(tracks[0]); + expect(playQueue).not.toHaveBeenCalled(); + }); });