import { render, screen, within } from '@testing-library/svelte'; import { describe, expect, it, test } from "vitest"; import TatortListPage from "../src/routes/(token-based)/list/[vorgang]/+page.svelte"; const testUser = { admin: true, exp: 1757067123, iat: 1757063523, id: "admin", } const testCrimesList = [ { name: 'model-A', lastModified: '2025-08-28T09:44:12.453Z', etag: '558f35716f6af953f9bb5d75f6d77e6a', size: 8947140, prefix: '7596e4d5-c51f-482d-a4aa-ff76434305fc', show_button: true }, { name: 'model-z', lastModified: '2025-08-28T10:37:20.142Z', etag: '43e3989c32c4682bee407baaf83b6fa0', size: 35788560, prefix: '7596e4d5-c51f-482d-a4aa-ff76434305fc', show_button: true } ]; const testVorgangsList = [ { vorgangName: "vorgang-1", vorgangPIN: "pin-123", vorgangToken: "c322f26f-8c5e-4cb9-94b3-b5433bf5109e" }, { vorgangName: "vorgang-2", vorgangPIN: "pin-2", vorgangToken: "cb0051bc-5f38-47b8-943c-9352d4d9c984" } ] const baseData = { user: testUser, vorgang: testVorgangsList[0], vorgangList: testVorgangsList, crimesList: testCrimesList, url: URL, crimeNames: [ "modell-A" ] } describe('Seite: Vorgangsansicht', () => { test.todo('zeigt PIN und Share-Link, wenn Admin'); describe('Szenario: Liste leer (unabhängig von Rolle)', () => { it('zeigt Hinweistext bei leerer Liste', () => { const testData = { ...baseData, crimesList: [] }; const { getByTestId } = render(TatortListPage, {props:{data: testData}}); expect(getByTestId('empty-list')).toBeInTheDocument(); }); it('zeigt keinen Listeneintrag', () => { const items = screen.queryAllByTestId('test-list-item'); expect(items).toHaveLength(0); }); }); describe('Szenario: Liste gefüllt (unabhängig von Rolle)', () => { it('rendert mindestens ein Listenelement bei vorhandenen crimesList-Daten und prüft ob Link vorhanden', () => { const testData = { ...baseData }; const { queryAllByTestId } = render(TatortListPage, {props:{data: testData}}); const items = queryAllByTestId('test-list-item'); expect(items.length).toBeGreaterThan(0); }); it('zeigt für jeden Eintrag einen Link', () => { const testData = { ...baseData }; render(TatortListPage, { props: { data: testData } }); const links = screen.queryAllByTestId('crime-link'); expect(links).toHaveLength(testData.crimesList.length); }); it('prüft href und title jedes Links', () => { const testData = { ...baseData }; const { queryAllByTestId } = render(TatortListPage, { props: { data: testData } }); const items = queryAllByTestId('test-list-item'); items.forEach((item, i) => { const link = within(item).getByRole('link'); const expectedHref = `/view/${testData.vorgang.vorgangToken}/${testData.crimesList[i].name}?pin=${testData.vorgang.vorgangPIN}`; expect(link).toBeInTheDocument(); expect(link).toHaveAttribute('href', expectedHref); expect(link).toHaveAttribute('title', testData.crimesList[i].name); }); }); test.todo('testet zuletzt angezeigt, wenn item.lastModified'); test.todo('zeigt Dateigröße, wenn item.size vorhanden ist'); }); describe('Szenario: Admin + Liste gefüllt', () => { it('zeigt PIN und Share-Link disabeld, wenn Liste leer', () => { }); it('zeigt PIN und Share-Link disabeld=false', () => { }); it('zeigt Listeneinträge mit Edit/Delete', () => { }); it('gibt Edit/Delete-Events korrekt weiter', () => { }); }); describe('Szenario: Viewer + Liste gefüllt', () => { it('zeigt Listeneinträge ohne Edit/Delete', () => { }); it('zeigt Link und Änderungsdatum', () => { }); it('zeigt keinen Share-Link oder PIN', () => { }); }); test.todo('Modal testen, wenn open') });