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 @@
-
+
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();
+ });
});