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>
121 lines
4.3 KiB
TypeScript
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();
|
|
});
|
|
});
|