import { fireEvent, getAllByTestId, queryAllByTestId, render, screen, within } from '@testing-library/svelte'; import { describe, expect, it, vi } from "vitest"; import TatortListPage from "../src/routes/(token-based)/list/[vorgang]/+page.svelte"; import { baseData } from './fixtures'; // Mock für invalidateAll vi.mock('$app/navigation', () => ({ invalidateAll: vi.fn() })); // Minimaler fetch-Mock global.fetch = vi.fn().mockResolvedValue({ ok: true }); describe('Seite: Vorgangsansicht', () => { describe('Szenario: Admin + Liste gefüllt', () => { it('ändert den Namen nach Speichern', async () => { const testData = structuredClone(baseData); const oldName = testData.crimesList[0].name; render(TatortListPage, { props: { data: testData } }); const firstItem = screen.getAllByTestId('test-list-item')[0]; await fireEvent.click(within(firstItem).getByTestId('edit-button')); const input = within(firstItem).getByRole('textbox'); await fireEvent.input(input, { target: { value: 'Fall-B' } }); await fireEvent.click(within(firstItem).getByTestId('commit-button')); // Erwartung: fetch wurde aufgerufen expect(global.fetch).toHaveBeenCalledWith( expect.stringContaining(`/api/list/${testData.vorgang.vorgangToken}/${oldName}`), expect.any(Object) ); // Erwartung: neuer Name ist sofort im DOM sichtbar expect(within(firstItem).getByRole('textbox')).toHaveValue('Fall-B'); }); it('entfernt das Listenelement nach Löschen', async () => { const testData = structuredClone(baseData); testData.url = new URL('https://example.com/vorgang-1'); // Fix für Invalid URL const toDelete = testData.crimesList[0]; global.fetch = vi.fn().mockResolvedValue({ ok: true }); render(TatortListPage, { props: { data: testData } }); const deletedFirstItem = screen.getAllByTestId('test-list-item')[0]; const deletedLink = within(deletedFirstItem).getByRole('link'); const deletedExpectedHref = `/view/${testData.vorgang.vorgangToken}/${toDelete.name}?pin=${testData.vorgang.vorgangPIN}`; expect(deletedLink).toBeInTheDocument(); expect(deletedLink).toHaveAttribute('href', deletedExpectedHref); expect(deletedLink).toHaveAttribute('title', toDelete.name); await fireEvent.click(within(deletedFirstItem).getByTestId('delete-button')); // Erwartung: fetch wurde aufgerufen expect(global.fetch).toHaveBeenCalledWith( expect.stringContaining(`/api/vorgang-1/${toDelete.name}`), expect.any(Object) ); // Erwartung: Element ist nicht mehr im DOM expect(within(deletedFirstItem).getByRole('textbox')).toHaveValue(toDelete.name); }); }); });