import { describe, expect, test } from 'vitest'; import { render, screen } from '@testing-library/svelte'; import type { MusicRequest } from '#lib/api/types.js'; import RequestRow, { requestName } from './RequestRow.svelte'; function req(over: Partial = {}): MusicRequest { return { id: 'r1', user_id: 'u1', status: 'approved', kind: 'album', artist_mbid: 'art-mbid', artist_name: 'Boards of Canada', album_title: 'Geogaddi', track_title: null, requested_at: '2026-04-28T12:00:00Z', updated_at: '2026-04-28T12:00:00Z', imported_album_count: 0, imported_track_count: 0, ...over }; } const text = (el: HTMLElement) => (el.textContent ?? '').replace(/\s+/g, ' ').trim(); // The row both Requests pages draw: the admin queue and the // requester's own list read the same request the same way. describe('RequestRow', () => { test('says what was asked for, where it stands, and who or when', () => { render(RequestRow, { request: req(), meta: 'by Boards of Canada · 4/28/2026', testid: 'request-row' }); const row = screen.getByTestId('request-row'); expect(row.dataset.status).toBe('approved'); expect(text(row)).toMatch(/^Album Approved · downloading Geogaddi by Boards of Canada · 4\/28\/2026$/); }); test('says how much has arrived, in the words for each kind', () => { const { unmount } = render(RequestRow, { request: req({ kind: 'artist', imported_album_count: 3, imported_track_count: 41 }), meta: '', testid: 'r' }); expect(text(screen.getByTestId('ingest-progress'))).toBe('3 albums · 41 tracks ingested'); unmount(); render(RequestRow, { request: req({ kind: 'track', track_title: 'Roygbiv', imported_track_count: 1 }), meta: '', testid: 'r' }); expect(text(screen.getByTestId('ingest-progress'))).toBe('Track ingested'); }); test('nothing arrived yet says nothing about it', () => { render(RequestRow, { request: req(), meta: '', testid: 'r' }); expect(screen.queryByTestId('ingest-progress')).toBeNull(); }); test('a request with no title still has a name a screen reader can say', () => { render(RequestRow, { request: req({ album_title: null }), meta: '', testid: 'r' }); expect(text(screen.getByTestId('r'))).toMatch(/—/); expect(requestName(req({ album_title: null }))).toBe('this album by Boards of Canada'); expect(requestName(req({ kind: 'artist' }))).toBe('Boards of Canada'); }); });