organize tests into units
This commit is contained in:
24
tests/views/Home.view.test.ts
Normal file
24
tests/views/Home.view.test.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import { render, screen } from '@testing-library/svelte';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import HomePage from '$root/routes/(angemeldet)/+page.svelte';
|
||||
|
||||
import { ROUTE_NAMES } from '../../src/routes';
|
||||
import { baseData } from '../fixtures';
|
||||
|
||||
describe('Home-Page View', () => {
|
||||
it('Überprüfe Links', () => {
|
||||
render(HomePage, { props: { data: baseData } });
|
||||
let linkElement = screen.getByText('Vorgänge');
|
||||
expect(linkElement).toBeInTheDocument();
|
||||
expect(linkElement).toHaveAttribute('href', ROUTE_NAMES.LIST);
|
||||
|
||||
linkElement = screen.getByText('Hinzufügen');
|
||||
expect(linkElement).toBeInTheDocument();
|
||||
expect(linkElement).toHaveAttribute('href', ROUTE_NAMES.UPLOAD);
|
||||
|
||||
linkElement = screen.getByText('Benutzerverwaltung');
|
||||
expect(linkElement).toBeInTheDocument();
|
||||
expect(linkElement).toHaveAttribute('href', ROUTE_NAMES.USERMGMT);
|
||||
});
|
||||
});
|
||||
29
tests/views/Layout.test.ts
Normal file
29
tests/views/Layout.test.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { describe, test, expect } from 'vitest';
|
||||
import { load } from '$root/routes/(angemeldet)/+layout.server';
|
||||
import { ROUTE_NAMES } from '../../src/routes';
|
||||
import { baseData, mockEvent } from '../fixtures';
|
||||
|
||||
describe('+layout.server load(): Teste korrekte URL', () => {
|
||||
test('Werfe redirect zu /anmeldung wenn User nicht eingeloggt', async () => {
|
||||
const mockEvent = {
|
||||
locals: {
|
||||
user: null
|
||||
},
|
||||
url: new URL(`https://example.com/not-anmeldung`)
|
||||
};
|
||||
try {
|
||||
load(mockEvent);
|
||||
throw new Error('Expected load() to throw');
|
||||
} catch (err) {
|
||||
expect(err.status).toBe(303);
|
||||
expect(err.location).toBe(ROUTE_NAMES.ANMELDUNG);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('+layout.server load(): Teste erfolgreichen Pfad', () => {
|
||||
test('Werfe kein Fehler', async () => {
|
||||
const result = load(mockEvent);
|
||||
expect(result).toEqual({ user: baseData.user });
|
||||
});
|
||||
});
|
||||
85
tests/views/TatortList.test.ts
Normal file
85
tests/views/TatortList.test.ts
Normal file
@@ -0,0 +1,85 @@
|
||||
import { render, fireEvent, screen, within } from '@testing-library/svelte';
|
||||
import { describe, it, expect, vi, test } from 'vitest';
|
||||
import * as nav from '$app/navigation';
|
||||
import TatortListPage from '$root/routes/(token-based)/list/[vorgang]/+page.svelte';
|
||||
import { baseData } from '../fixtures';
|
||||
import { tick } from 'svelte';
|
||||
import { API_ROUTES } from '../../src/routes';
|
||||
|
||||
vi.spyOn(nav, 'invalidateAll').mockResolvedValue();
|
||||
global.fetch = vi.fn().mockResolvedValue({ ok: true });
|
||||
|
||||
|
||||
describe('Seite: Vorgangsansicht', () => {
|
||||
test.todo('Share Link disabled wenn Liste leer');
|
||||
describe('Szenario: Admin + Liste gefüllt - Funktionalität', () => {
|
||||
test.todo('Share Link Link generierung richtig');
|
||||
|
||||
it('führt PUT-Request aus und aktualisiert UI nach onSave', async () => {
|
||||
const data = structuredClone(baseData);
|
||||
const oldName = data.crimesList[0].name;
|
||||
const newName = 'Fall-C';
|
||||
|
||||
render(TatortListPage, { props: { data } });
|
||||
const listItem = screen.getAllByTestId('test-list-item')[0];
|
||||
expect(listItem).toHaveTextContent(oldName);
|
||||
|
||||
await fireEvent.click(within(listItem).getByTestId('edit-button'));
|
||||
const input = within(listItem).getByTestId('test-input');
|
||||
await fireEvent.input(input, { target: { value: newName } });
|
||||
|
||||
await fireEvent.click(within(listItem).getByTestId('commit-button'));
|
||||
await tick();
|
||||
|
||||
expect(global.fetch).toHaveBeenCalledWith(
|
||||
`/api/list/${data.vorgang.vorgangToken}/${oldName}`,
|
||||
expect.objectContaining({
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
vorgangToken: data.vorgang.vorgangToken,
|
||||
oldName,
|
||||
newName
|
||||
})
|
||||
})
|
||||
);
|
||||
|
||||
expect(nav.invalidateAll).toHaveBeenCalled();
|
||||
expect(within(listItem).getByText(newName)).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('führt DELETE-Request aus und entfernt Element aus UI', async () => {
|
||||
const testData = structuredClone(baseData);
|
||||
const oldName = testData.crimesList[0].name;
|
||||
const vorgang = testData.vorgang;
|
||||
|
||||
render(TatortListPage, { props: { data: testData } });
|
||||
const initialItems = screen.getAllByTestId('test-list-item');
|
||||
expect(initialItems).toHaveLength(testData.crimesList.length);
|
||||
|
||||
const listItem = screen.getAllByTestId('test-list-item')[0];
|
||||
expect(listItem).toHaveTextContent(oldName);
|
||||
const del = within(listItem).getByTestId('delete-button');
|
||||
expect(del).toBeInTheDocument()
|
||||
await fireEvent.click(within(listItem).getByTestId('delete-button'));
|
||||
await tick();
|
||||
|
||||
let expectedPath = API_ROUTES.CRIME(vorgang.vorgangToken, oldName)
|
||||
expect(global.fetch).toHaveBeenCalledWith(
|
||||
expectedPath,
|
||||
expect.objectContaining({
|
||||
method: 'DELETE',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
vorgangToken: testData.vorgang.vorgangToken,
|
||||
tatort: oldName
|
||||
})
|
||||
})
|
||||
);
|
||||
expect(nav.invalidateAll).toHaveBeenCalled();
|
||||
const updatedItems = screen.queryAllByTestId('test-list-item');
|
||||
expect(updatedItems).toHaveLength(testData.crimesList.length - 1);
|
||||
expect(screen.queryByText(oldName)).toBeNull();
|
||||
});
|
||||
});
|
||||
});
|
||||
103
tests/views/TatortList.view.test.ts
Normal file
103
tests/views/TatortList.view.test.ts
Normal file
@@ -0,0 +1,103 @@
|
||||
import { render, screen, within } from '@testing-library/svelte';
|
||||
import { describe, expect, it, test } from 'vitest';
|
||||
import TatortListPage from '$root/routes/(token-based)/list/[vorgang]/+page.svelte';
|
||||
import { baseData } from '../fixtures';
|
||||
import { ROUTE_NAMES } from '../../src/routes';
|
||||
|
||||
describe('Seite: Vorgangsansicht', () => {
|
||||
test.todo('zeigt PIN und Share-Link, wenn Admin');
|
||||
test.todo('zeigt PIN und Share-Link disabeld, wenn Liste leer');
|
||||
|
||||
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', () => {
|
||||
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 = ROUTE_NAMES.CRIME(testData.vorgang.vorgangToken, testData.crimesList[i].name, 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', () => {
|
||||
const testData = { ...baseData, user: { ...baseData.user, admin: true } };
|
||||
it('zeigt Listeneinträge mit Komponente NameItemEditor', () => {
|
||||
const { getAllByTestId } = render(TatortListPage, { props: { data: testData } });
|
||||
const items = getAllByTestId('test-nameItemEditor');
|
||||
|
||||
expect(items.length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
test.todo('Modal testen, wenn open');
|
||||
});
|
||||
|
||||
describe('Szenario: Viewer + Liste gefüllt', () => {
|
||||
const testData = { ...baseData, user: { ...baseData.user, admin: false } };
|
||||
it('zeigt Listeneinträge mit p', () => {
|
||||
render(TatortListPage, { props: { data: testData } });
|
||||
const paragraphs = screen.queryAllByTestId('test-nameItem-p');
|
||||
|
||||
expect(paragraphs).toHaveLength(testData.crimesList.length);
|
||||
paragraphs.forEach((p, i) => {
|
||||
expect(p).toHaveTextContent(testData.crimesList[i].name);
|
||||
});
|
||||
});
|
||||
|
||||
test.todo('zeigt keinen Share-Link oder PIN');
|
||||
});
|
||||
|
||||
describe('Teste Links auf Korrektheit', () => {
|
||||
it('Überprüfe Links', () => {
|
||||
const crimesListOneItem = baseData.crimesList.slice(0, 1);
|
||||
const crimeObj = crimesListOneItem[0];
|
||||
const vorgObj = baseData.vorgangList[0]
|
||||
const expectedURL = ROUTE_NAMES.CRIME(vorgObj.vorgangToken, crimeObj.name, vorgObj.vorgangPIN)
|
||||
|
||||
render(TatortListPage, { props: { data: { ...baseData, crimesList: crimesListOneItem } } });
|
||||
const listItem = screen.getByTestId("test-list-item");
|
||||
const linkElement = within(listItem).getByRole('link');
|
||||
expect(linkElement).toBeInTheDocument();
|
||||
expect(linkElement).toHaveAttribute('href', expectedURL);
|
||||
});
|
||||
});
|
||||
});
|
||||
36
tests/views/VorgangList.view.test.ts
Normal file
36
tests/views/VorgangList.view.test.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { render, screen, within } from '@testing-library/svelte';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import VorgangListPage from '$root/routes/(angemeldet)/list/+page.svelte';
|
||||
import { baseData } from '../fixtures';
|
||||
import { ROUTE_NAMES } from '../../src/routes';
|
||||
|
||||
describe('Vorgänge Liste Page EmptyList-Komponente View', () => {
|
||||
it('zeigt EmptyList-Komponente an, wenn Liste leer ist', () => {
|
||||
const testData = { ...baseData, vorgangList: [] };
|
||||
const { getByTestId } = render(VorgangListPage, { props: { data: testData } });
|
||||
|
||||
expect(getByTestId('empty-list')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('zeigt Liste(mockData 2 Elemente) an, wenn Liste vorhanden ist', () => {
|
||||
const testData = { ...baseData };
|
||||
const { getAllByTestId } = render(VorgangListPage, { props: { data: testData } });
|
||||
const items = getAllByTestId('test-list-item');
|
||||
|
||||
expect(items.length).toBeGreaterThan(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Teste Links auf Korrektheit', () => {
|
||||
it('Überprüfe Links', () => {
|
||||
const vorgListOneItem = baseData.vorgangList.slice(0, 1);
|
||||
const vorgObj = vorgListOneItem[0];
|
||||
const expectedURL = ROUTE_NAMES.VORGANG(vorgObj.vorgangToken, vorgObj.vorgangPIN)
|
||||
|
||||
render(VorgangListPage, { props: { data: { ...baseData, vorgangList: vorgListOneItem } } });
|
||||
const listItem = screen.getByTestId("test-list-item");
|
||||
const linkElement = within(listItem).getByRole('link');
|
||||
expect(linkElement).toBeInTheDocument();
|
||||
expect(linkElement).toHaveAttribute('href', expectedURL);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user