HH/e2e/tests/workflows/inquiry-lifecycle.spec.ts
2026-04-08 17:13:35 +03:00

187 lines
6.4 KiB
TypeScript

import { test, expect } from '@playwright/test';
import { RoleAuthHelper } from '../../helpers/helpers';
test.describe('Inquiry Lifecycle', () => {
test.describe.configure({ mode: 'serial' });
let inquiryReference = '';
test('submit inquiry via public form', async ({ page }) => {
await page.goto('/inquiries/public/submit/');
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(1000);
const timestamp = Date.now();
const nameInput = page.locator('input[name="name"], #inquiry_name');
if (await nameInput.count() > 0) {
await nameInput.fill(`E2E Inquiry ${timestamp}`);
}
const emailInput = page.locator('input[name="email"], #inquiry_email');
if (await emailInput.count() > 0) {
await emailInput.fill(`e2e-inquiry-${timestamp}@test.com`);
}
const phoneInput = page.locator('input[name="phone"], #inquiry_phone');
if (await phoneInput.count() > 0) {
await phoneInput.fill('0559876543');
}
const hospitalSelect = page.locator('select[name="hospital"], #inquiry_hospital');
if (await hospitalSelect.count() > 0) {
await hospitalSelect.selectOption({ index: 0 });
}
const categorySelect = page.locator('select[name="category"], #inquiry_category');
if (await categorySelect.count() > 0) {
await categorySelect.selectOption({ index: 0 });
}
const subjectInput = page.locator('input[name="subject"], #inquiry_subject');
if (await subjectInput.count() > 0) {
await subjectInput.fill(`E2E Test Inquiry ${timestamp}`);
}
const messageInput = page.locator('textarea[name="message"], #inquiry_message');
if (await messageInput.count() > 0) {
await messageInput.fill('E2E automated test inquiry - please ignore');
}
const submitBtn = page.locator('button[type="submit"], #inquirySubmitBtn');
await submitBtn.click();
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(3000);
const pageText = await page.textContent('body');
const match = pageText?.match(/INQ-\d{8}-\d{6}/);
if (match) {
inquiryReference = match[0];
}
const success = pageText?.includes('success') || pageText?.includes('thank') || pageText?.includes('received') || !!match;
expect(success).toBeTruthy();
});
test('inquiry appears in admin list', async ({ page }) => {
const auth = new RoleAuthHelper(page);
await auth.login('hospital_admin');
await page.goto('/inquiries/');
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(2000);
if (inquiryReference) {
const searchInput = page.locator('input[name="search"]');
if (await searchInput.count() > 0) {
await searchInput.fill(inquiryReference);
await searchInput.press('Enter');
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(1000);
}
const tableText = await page.locator('table').textContent();
expect(tableText).toContain(inquiryReference);
} else {
const tableText = await page.locator('table').textContent();
expect(tableText).toBeTruthy();
}
});
test('inquiry list has filter and table', async ({ page }) => {
const auth = new RoleAuthHelper(page);
await auth.login('hospital_admin');
await page.goto('/inquiries/');
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(2000);
const table = page.locator('table.data-table, table');
expect(await table.count()).toBeGreaterThan(0);
const filterForm = page.locator('form[method="get"]');
expect(await filterForm.count()).toBeGreaterThan(0);
});
test('can access inquiry create form (authenticated)', async ({ page }) => {
const auth = new RoleAuthHelper(page);
await auth.login('hospital_admin');
await page.goto('/inquiries/new/');
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(2000);
const form = page.locator('#inquiryForm, form[action*="inquiry_create"]');
const hasForm = await form.count().then(c => c > 0);
expect(hasForm).toBeTruthy();
});
test('inquiry detail page loads for open inquiry', async ({ page }) => {
const auth = new RoleAuthHelper(page);
await auth.login('hospital_admin');
await page.goto('/inquiries/?status=open');
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(2000);
const firstRow = page.locator('table tbody tr').first();
const hasRows = await firstRow.count().then(c => c > 0);
if (!hasRows) {
test.skip();
return;
}
await firstRow.click();
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(1000);
const pageText = await page.textContent('body');
expect(pageText).toContain('INQ-');
});
test('respond modal opens on inquiry detail', async ({ page }) => {
const auth = new RoleAuthHelper(page);
await auth.login('hospital_admin');
await page.goto('/inquiries/?status=open');
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(2000);
const firstRow = page.locator('table tbody tr').first();
const hasRows = await firstRow.count().then(c => c > 0);
if (!hasRows) {
test.skip();
return;
}
await firstRow.click();
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(1000);
const respondBtn = page.locator('button[onclick="showRespondModal()"]');
const hasRespond = await respondBtn.count().then(c => c > 0);
if (!hasRespond) {
test.skip();
return;
}
await respondBtn.click();
const modal = page.locator('#respondModal');
await modal.waitFor({ state: 'visible', timeout: 5000 });
const form = modal.locator('form#respondForm, form[action*="respond"]');
expect(await form.count()).toBeGreaterThan(0);
const closeBtn = modal.locator('button[onclick="closeRespondModal()"]');
if (await closeBtn.count() > 0) {
await closeBtn.click();
}
});
test('inquiry list shows status badges', async ({ page }) => {
const auth = new RoleAuthHelper(page);
await auth.login('hospital_admin');
await page.goto('/inquiries/');
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(2000);
const statusBadges = page.locator('span.rounded-full');
const badgeCount = await statusBadges.count();
expect(badgeCount).toBeGreaterThan(0);
});
});