import { fireEvent, getByTestId, queryAllByTestId, render, screen, within } from '@testing-library/svelte'; import { describe, expect, it, test, vi } from "vitest"; import TatortListPage from "../src/routes/(token-based)/list/[vorgang]/+page.svelte"; import { baseData } from './fixtures'; import { invalidateAll } from '$app/navigation'; // Mock für invalidateAll vi.mock('$app/navigation', () => ({ invalidateAll: vi.fn() })); describe('Seite: Vorgangsansicht', () => { test.todo('Share Link disabled wenn Liste leer'); describe('Szenario: Admin + Liste gefüllt', () => { test.todo('Share Link Link generierung richtig'); it('ändert den Namen nach Speichern', async () => { const testData = structuredClone(baseData); const oldName = testData.crimesList[0].name; const newName = 'Fall-B'; const list = testData.crimesList const vorgangToken = testData.vorgang.vorgangToken // Minimaler fetch-Mock global.fetch = vi.fn().mockResolvedValue({ ok: true }) as typeof fetch; const { getAllByTestId } = render(TatortListPage, { props: { data: testData } }); const firstItem = getAllByTestId('test-list-item')[0]; const editButton = within(firstItem).getByTestId('edit-button'); await fireEvent.click(editButton); const input = within(firstItem).getByTestId('test-input'); expect(input).toHaveValue(oldName) await fireEvent.input(input, { target: { value: newName } }); const commitButton = within(firstItem).getByTestId('commit-button'); await fireEvent.click(commitButton); // const fetchMock = global.fetch as ReturnType; // console.log('Fetch calls:', fetchMock.mock.calls); // // Erwartung: fetch wurde aufgerufen // expect(global.fetch).toHaveBeenCalledWith( // expect.stringContaining(`/api/list/${vorgangToken}/${oldName}`), // expect.objectContaining({ // method: 'PUT', // headers: { 'Content-Type': 'application/json' }, // body: JSON.stringify({vorgangToken, oldName, newName}) // }) // ); // expect(invalidateAll).toHaveBeenCalled(); // Erwartung: neuer Name ist sofort im DOM sichtbar // expect(within(firstItem).getByRole('textbox')).toHaveValue(newName); // const editedLink = within(firstItem).getByRole('link'); // const editedExpectedHref = `/view/${vorgangToken}/${newName}?pin=${testData.vorgang.vorgangPIN}`; // expect(editedLink).toBeInTheDocument(); // expect(editedLink).toHaveAttribute('href', editedExpectedHref); // expect(editedLink).toHaveAttribute('title', newName); }); // 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); // }); }); });