test: Cypress en Playwright e2e-suites voor login, agenda, cortex en verpleegrapportage
Configs voor beide runners, login via session caching, AI-chat mocks (SSE) voor deterministische Cortex-tests. Supabase local config toegevoegd. Auth-state en reports zijn gitignored. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
120
tests/playwright/agenda/agenda.spec.ts
Normal file
120
tests/playwright/agenda/agenda.spec.ts
Normal file
@@ -0,0 +1,120 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
const MOCK_PATIENT = {
|
||||
id: 'test-patient-uuid',
|
||||
name_family: 'Robot',
|
||||
name_given: ['Robbert'],
|
||||
birth_date: '1990-01-01',
|
||||
identifier_client_number: '99001',
|
||||
};
|
||||
|
||||
const FHIR_PATIENT_RESPONSE = {
|
||||
entry: [
|
||||
{
|
||||
resource: {
|
||||
id: MOCK_PATIENT.id,
|
||||
name: [{ family: MOCK_PATIENT.name_family, given: MOCK_PATIENT.name_given }],
|
||||
birthDate: MOCK_PATIENT.birth_date,
|
||||
identifier: [
|
||||
{ system: 'http://example.com/client/999.7.6', value: MOCK_PATIENT.identifier_client_number },
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
test.describe('Agenda', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.goto('/epd/agenda');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('laadt de agendapagina', async ({ page }) => {
|
||||
await expect(page.getByRole('heading', { name: 'Agenda' })).toBeVisible();
|
||||
await expect(page.getByRole('button', { name: /Nieuwe Afspraak|Nieuw/i })).toBeVisible();
|
||||
});
|
||||
|
||||
test('toont navigatieknoppen en weergave-switcher', async ({ page }) => {
|
||||
await expect(page.getByRole('button', { name: 'Vandaag' })).toBeVisible();
|
||||
await expect(page.getByRole('button', { name: 'Dag' })).toBeVisible();
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('Afspraak maken', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
// Mock patient search
|
||||
await page.route('**/api/fhir/Patient**', async (route) => {
|
||||
await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify(FHIR_PATIENT_RESPONSE) });
|
||||
});
|
||||
|
||||
// Mock afspraak aanmaken (voorkom echte database write)
|
||||
await page.route('**/epd/agenda**', async (route) => {
|
||||
if (route.request().method() === 'POST') {
|
||||
await route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ success: true }) });
|
||||
} else {
|
||||
await route.continue();
|
||||
}
|
||||
});
|
||||
|
||||
await page.goto('/epd/agenda');
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('opent de "Nieuwe Afspraak" modal', async ({ page }) => {
|
||||
await page.getByRole('button', { name: /Nieuwe Afspraak|Nieuw/i }).click();
|
||||
|
||||
await expect(page.getByRole('dialog')).toBeVisible();
|
||||
await expect(page.getByRole('heading', { name: 'Nieuwe Afspraak' })).toBeVisible();
|
||||
});
|
||||
|
||||
test('modal toont alle verplichte velden', async ({ page }) => {
|
||||
await page.getByRole('button', { name: /Nieuwe Afspraak|Nieuw/i }).click();
|
||||
|
||||
const dialog = page.getByRole('dialog');
|
||||
await expect(dialog.getByPlaceholder(/Zoek op naam/i)).toBeVisible();
|
||||
await expect(dialog.locator('input[type="date"]')).toBeVisible();
|
||||
await expect(dialog.locator('input[type="time"]').first()).toBeVisible();
|
||||
await expect(dialog.getByRole('button', { name: 'Afspraak maken' })).toBeVisible();
|
||||
});
|
||||
|
||||
test('zoeken naar patiënt toont resultaat', async ({ page }) => {
|
||||
await page.getByRole('button', { name: /Nieuwe Afspraak|Nieuw/i }).click();
|
||||
|
||||
const dialog = page.getByRole('dialog');
|
||||
await dialog.getByPlaceholder(/Zoek op naam/i).fill('Robbert');
|
||||
|
||||
// Dropdown met patiënt verschijnt
|
||||
await expect(dialog.getByText('Robbert Robot')).toBeVisible({ timeout: 5_000 });
|
||||
});
|
||||
|
||||
test('selecteren van patiënt vult het veld in', async ({ page }) => {
|
||||
await page.getByRole('button', { name: /Nieuwe Afspraak|Nieuw/i }).click();
|
||||
|
||||
const dialog = page.getByRole('dialog');
|
||||
await dialog.getByPlaceholder(/Zoek op naam/i).fill('Robbert');
|
||||
await expect(dialog.getByText('Robbert Robot')).toBeVisible({ timeout: 5_000 });
|
||||
await dialog.getByText('Robbert Robot').click();
|
||||
|
||||
// Patiënt bevestigingskaart zichtbaar
|
||||
await expect(dialog.locator('.bg-teal-50')).toBeVisible();
|
||||
});
|
||||
|
||||
test('afspraak maken knop is uitgeschakeld zonder patiënt', async ({ page }) => {
|
||||
await page.getByRole('button', { name: /Nieuwe Afspraak|Nieuw/i }).click();
|
||||
|
||||
const dialog = page.getByRole('dialog');
|
||||
const submitButton = dialog.getByRole('button', { name: 'Afspraak maken' });
|
||||
|
||||
await expect(submitButton).toBeDisabled();
|
||||
});
|
||||
|
||||
test('sluiten sluit de modal', async ({ page }) => {
|
||||
await page.getByRole('button', { name: /Nieuwe Afspraak|Nieuw/i }).click();
|
||||
|
||||
const dialog = page.getByRole('dialog');
|
||||
await expect(dialog).toBeVisible();
|
||||
|
||||
await dialog.getByRole('button', { name: 'Sluiten' }).click();
|
||||
await expect(dialog).not.toBeVisible();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user