diff --git a/web/src/lib/components/TrackRow.svelte b/web/src/lib/components/TrackRow.svelte
index bd32ab62..c5d7144d 100644
--- a/web/src/lib/components/TrackRow.svelte
+++ b/web/src/lib/components/TrackRow.svelte
@@ -1,14 +1,25 @@
-
+
+
diff --git a/web/src/lib/components/TrackRow.test.ts b/web/src/lib/components/TrackRow.test.ts
index 1f108ea6..d4648247 100644
--- a/web/src/lib/components/TrackRow.test.ts
+++ b/web/src/lib/components/TrackRow.test.ts
@@ -1,31 +1,50 @@
-import { describe, expect, test } from 'vitest';
-import { render, screen } from '@testing-library/svelte';
-import TrackRow from './TrackRow.svelte';
+import { afterEach, describe, expect, test, vi } from 'vitest';
+import { render, screen, fireEvent } from '@testing-library/svelte';
import type { TrackRef } from '$lib/api/types';
-const track: TrackRef = {
- id: 't1',
- title: 'So What',
- album_id: 'xyz',
- album_title: 'Kind of Blue',
- artist_id: 'm-davis',
- artist_name: 'Miles Davis',
- track_number: 1,
- disc_number: 1,
- duration_sec: 545,
- stream_url: '/api/tracks/t1/stream',
-};
+vi.mock('$lib/player/store.svelte', () => ({
+ playQueue: vi.fn()
+}));
+
+import TrackRow from './TrackRow.svelte';
+import { playQueue } from '$lib/player/store.svelte';
+
+const tracks: TrackRef[] = [
+ {
+ id: 't1', title: 'So What',
+ album_id: 'xyz', album_title: 'Kind of Blue',
+ artist_id: 'm-davis', artist_name: 'Miles Davis',
+ track_number: 1, disc_number: 1,
+ duration_sec: 545, stream_url: '/api/tracks/t1/stream'
+ },
+ {
+ id: 't2', title: 'Freddie Freeloader',
+ album_id: 'xyz', album_title: 'Kind of Blue',
+ artist_id: 'm-davis', artist_name: 'Miles Davis',
+ track_number: 2, disc_number: 1,
+ duration_sec: 565, stream_url: '/api/tracks/t2/stream'
+ }
+];
+
+afterEach(() => vi.clearAllMocks());
describe('TrackRow', () => {
test('renders track number, title, formatted duration', () => {
- render(TrackRow, { props: { track } });
+ render(TrackRow, { props: { tracks, index: 0 } });
expect(screen.getByText('1')).toBeInTheDocument();
expect(screen.getByText('So What')).toBeInTheDocument();
expect(screen.getByText('9:05')).toBeInTheDocument();
});
test('track number falls back to dash when missing', () => {
- render(TrackRow, { props: { track: { ...track, track_number: undefined } } });
+ const noNum = [{ ...tracks[0], track_number: undefined }];
+ render(TrackRow, { props: { tracks: noNum, index: 0 } });
expect(screen.getByText('—')).toBeInTheDocument();
});
+
+ test('clicking the row calls playQueue(tracks, index)', async () => {
+ render(TrackRow, { props: { tracks, index: 1 } });
+ await fireEvent.click(screen.getByRole('button'));
+ expect(playQueue).toHaveBeenCalledWith(tracks, 1);
+ });
});
diff --git a/web/src/routes/albums/[id]/+page.svelte b/web/src/routes/albums/[id]/+page.svelte
index d438c7cb..b79e4a05 100644
--- a/web/src/routes/albums/[id]/+page.svelte
+++ b/web/src/routes/albums/[id]/+page.svelte
@@ -69,8 +69,8 @@
This album has no tracks.
{:else}
- {#each album.tracks as track (track.id)}
-
+ {#each album.tracks as track, i (track.id)}
+
{/each}
{/if}