Files
triqura-ecd/tests/playwright/agenda/agenda.spec.ts
colinislit 9195eb9fed 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>
2026-07-09 23:16:17 +02:00

121 lines
4.3 KiB
TypeScript

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