Files
tatort/tests/TatortList.test.ts

78 lines
2.5 KiB
TypeScript

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);
});
});
});