187 lines
6.4 KiB
TypeScript
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);
|
|
});
|
|
});
|