From 80b39f1713105a49328351086a1eb0582001c7a1 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sat, 25 Apr 2026 15:37:11 -0400 Subject: [PATCH] feat(web): TrackRow div+role button with onPlay prop and + queue button Outer {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(); + }); });