HH/e2e/tests/public-forms/complaints.spec.ts
2026-04-08 17:13:35 +03:00

122 lines
5.2 KiB
TypeScript

import { test, expect } from '@playwright/test';
import { PublicFormHelper } from '../../helpers/helpers';
test.describe.configure({ mode: 'serial' });
test.describe('Public Complaint Form', () => {
test('complaint form loads from landing page', async ({ page }) => {
const helper = new PublicFormHelper(page);
await helper.goToPublicLanding();
await helper.selectFormType('complaint');
await page.waitForSelector('#id_complainant_name', { timeout: 15000 });
await expect(page.locator('#id_complainant_name')).toBeVisible();
await expect(page.locator('#id_patient_name')).toBeVisible();
await expect(page.locator('#id_national_id')).toBeVisible();
await expect(page.locator('#id_mobile_number')).toBeVisible();
await expect(page.locator('#id_incident_date')).toBeVisible();
await expect(page.locator('#id_complaint_details')).toBeVisible();
await expect(page.locator('#submit_btn')).toBeVisible();
});
test('complaint form has required field validation', async ({ page }) => {
const helper = new PublicFormHelper(page);
await helper.goToPublicLanding();
await helper.selectFormType('complaint');
await page.waitForSelector('#id_complainant_name', { timeout: 15000 });
await page.click('#submit_btn');
await page.waitForLoadState('networkidle');
const complainantInvalid = await page.locator('#id_complainant_name:invalid').count();
const patientInvalid = await page.locator('#id_patient_name:invalid').count();
const nationalIdInvalid = await page.locator('#id_national_id:invalid').count();
expect(complainantInvalid + patientInvalid + nationalIdInvalid).toBeGreaterThan(0);
});
test('complaint form fills all fields correctly', async ({ page }) => {
const helper = new PublicFormHelper(page);
await helper.goToPublicLanding();
await helper.selectFormType('complaint');
await page.waitForSelector('#id_complainant_name', { timeout: 15000 });
await helper.fillComplaintForm({
complainantName: 'Test Complainant',
relationToPatient: 'relative',
mobileNumber: '+966501234567',
patientName: 'Test Patient',
nationalId: '1234567890',
incidentDate: '2026-01-15',
complaintDetails: 'This is a test complaint for E2E testing purposes. The patient experienced delays in the emergency department.',
email: 'test@example.com',
});
await expect(page.locator('#id_complainant_name')).toHaveValue('Test Complainant');
await expect(page.locator('#id_patient_name')).toHaveValue('Test Patient');
await expect(page.locator('#id_national_id')).toHaveValue('1234567890');
await expect(page.locator('#id_mobile_number')).toHaveValue('+966501234567');
await expect(page.locator('#id_incident_date')).toHaveValue('2026-01-15');
await expect(page.locator('#id_complaint_details')).toHaveValue(
'This is a test complaint for E2E testing purposes. The patient experienced delays in the emergency department.'
);
await expect(page.locator('#id_email')).toHaveValue('test@example.com');
});
test('back button returns to selection from complaint form', async ({ page }) => {
const helper = new PublicFormHelper(page);
await helper.goToPublicLanding();
await helper.selectFormType('complaint');
await page.waitForSelector('#id_complainant_name', { timeout: 15000 });
await page.click('button:has-text("Back to Selection")');
await page.waitForSelector('.selection-card', { timeout: 10000 });
await expect(page.locator('.selection-card')).toHaveCount(3);
});
test('relation to patient has correct options', async ({ page }) => {
const helper = new PublicFormHelper(page);
await helper.goToPublicLanding();
await helper.selectFormType('complaint');
await page.waitForSelector('#id_relation_to_patient', { timeout: 15000 });
const options = page.locator('#id_relation_to_patient option');
const count = await options.count();
expect(count).toBeGreaterThanOrEqual(4);
const values = [];
for (let i = 0; i < count; i++) {
values.push(await options.nth(i).getAttribute('value'));
}
expect(values).toContain('patient');
expect(values).toContain('relative');
expect(values).toContain('friend');
expect(values).toContain('other');
});
});
test.describe('Public Complaint Tracking', () => {
test('tracking page loads correctly', async ({ page }) => {
await page.goto('/complaints/public/track/');
await page.waitForSelector('input[name="reference_number"]');
await expect(page.locator('input[name="reference_number"]')).toBeVisible();
await expect(page.locator('button[type="submit"]')).toContainText('Track Status');
await expect(page.locator('input[name="reference_number"]')).toHaveAttribute(
'placeholder',
/CMP-/
);
});
test('tracking with invalid reference shows error', async ({ page }) => {
await page.goto('/complaints/public/track/');
await page.fill('input[name="reference_number"]', 'CMP-INVALID-999999');
await page.click('button[type="submit"]');
await page.waitForLoadState('networkidle');
const hasError = await page.locator('.bg-rose-50').count().then(c => c > 0);
expect(hasError).toBeTruthy();
});
});