281 lines
9.9 KiB
TypeScript
281 lines
9.9 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { RoleAuthHelper } from '../../helpers/helpers';
|
|
import { ApiHelper, DEPT_ID, sessionPost } from '../../helpers/api-helper';
|
|
|
|
test.describe('Inquiry Scenario Tests', () => {
|
|
|
|
test.describe('Scenario A: Raised to Department (Outgoing)', () => {
|
|
test.describe.configure({ mode: 'serial' });
|
|
|
|
let inquiryId: string;
|
|
|
|
test('create outgoing inquiry and activate', async ({ page }) => {
|
|
const api = new ApiHelper(page);
|
|
await api.authenticate('px_admin');
|
|
|
|
const { response, body } = await api.createInquiry({
|
|
subject: `E2E Dept Inquiry ${Date.now()}`,
|
|
message: 'E2E scenario test - raised to department flow. Please ignore.',
|
|
is_straightforward: false,
|
|
is_outgoing: true,
|
|
});
|
|
expect(response.status()).toBe(201);
|
|
inquiryId = body.id;
|
|
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
const activateResp = await sessionPost(page, `/inquiries/${inquiryId}/activate/`, {});
|
|
if (![200, 302].includes(activateResp.status())) {
|
|
console.log(`Activate failed with status: ${activateResp.status}, ok: ${activateResp.ok}`);
|
|
const bodyText = await page.textContent('body');
|
|
console.log(`Page snippet: ${bodyText?.substring(0, 300)}`);
|
|
}
|
|
expect([200, 302].includes(activateResp.status())).toBeTruthy();
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.reload();
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(1500);
|
|
});
|
|
|
|
test('transfer to department', async ({ page }) => {
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
const transferResp = await sessionPost(page, `/inquiries/${inquiryId}/transfer-to-department/`, {
|
|
department_id: DEPT_ID,
|
|
note_en: 'E2E test - transferring to department for response',
|
|
recipient_type: 'staff',
|
|
});
|
|
expect([200, 302].includes(transferResp.status())).toBeTruthy();
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.reload();
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(1500);
|
|
});
|
|
|
|
test('submit department response and review', async ({ page }) => {
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
const deptResp = await sessionPost(page, `/inquiries/${inquiryId}/department-response/`, {
|
|
response_en: 'E2E test - department has investigated and provided response',
|
|
});
|
|
expect([200, 302].includes(deptResp.status())).toBeTruthy();
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
const reviewResp = await sessionPost(page, `/inquiries/${inquiryId}/review-dept-response/`, {
|
|
acceptance_status: 'acceptable',
|
|
acceptance_notes: 'E2E test - department response is acceptable',
|
|
});
|
|
expect([200, 302].includes(reviewResp.status())).toBeTruthy();
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.reload();
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(1500);
|
|
});
|
|
|
|
test('respond to inquiry and verify resolution', async ({ page }) => {
|
|
const api = new ApiHelper(page);
|
|
await api.authenticate('px_admin');
|
|
|
|
const respondResp = await api.respondToInquiry(
|
|
inquiryId,
|
|
'E2E test - inquiry resolved based on department response. Thank you for your patience.'
|
|
);
|
|
expect([200, 201, 204].includes(respondResp.status())).toBeTruthy();
|
|
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
const pageText = await page.textContent('body');
|
|
expect(pageText).toMatch(/resolved|Resolved/i);
|
|
await page.waitForTimeout(800);
|
|
});
|
|
|
|
test('verify transfer count and department info in detail', async ({ page }) => {
|
|
if (!inquiryId) { test.skip(); return; }
|
|
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
const pageText = (await page.textContent('body')) || '';
|
|
expect(pageText).toContain('INQ-');
|
|
await page.waitForTimeout(800);
|
|
});
|
|
});
|
|
|
|
test.describe('Scenario B: Handled Immediately (Straightforward)', () => {
|
|
test.describe.configure({ mode: 'serial' });
|
|
|
|
let inquiryId: string;
|
|
|
|
test('create straightforward inquiry and resolve directly', async ({ page }) => {
|
|
const api = new ApiHelper(page);
|
|
await api.authenticate('px_admin');
|
|
|
|
const { response, body } = await api.createInquiry({
|
|
subject: `E2E Direct Inquiry ${Date.now()}`,
|
|
message: 'E2E scenario test - handled immediately. Please ignore.',
|
|
is_straightforward: true,
|
|
});
|
|
expect(response.status()).toBe(201);
|
|
inquiryId = body.id;
|
|
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
await sessionPost(page, `/inquiries/${inquiryId}/activate/`, {});
|
|
await page.waitForTimeout(800);
|
|
|
|
const respondResp = await api.respondToInquiry(
|
|
inquiryId,
|
|
'E2E test - direct response provided, no department coordination needed.'
|
|
);
|
|
expect([200, 201, 204].includes(respondResp.status())).toBeTruthy();
|
|
|
|
await page.reload();
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(1500);
|
|
});
|
|
|
|
test('verify resolved status in admin UI', async ({ page }) => {
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
const pageText = await page.textContent('body');
|
|
expect(pageText).toMatch(/resolved|Resolved/i);
|
|
await page.waitForTimeout(800);
|
|
});
|
|
|
|
test('verify no department transfer shown', async ({ page }) => {
|
|
if (!inquiryId) { test.skip(); return; }
|
|
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
const pageText = (await page.textContent('body')) || '';
|
|
expect(pageText).toMatch(/resolved|Resolved/i);
|
|
await page.waitForTimeout(800);
|
|
});
|
|
});
|
|
|
|
test.describe('Scenario C: Let Expire (SLA Breach)', () => {
|
|
test.describe.configure({ mode: 'serial' });
|
|
|
|
let inquiryId: string;
|
|
|
|
test('create inquiry, activate and backdate SLA', async ({ page }) => {
|
|
const api = new ApiHelper(page);
|
|
await api.authenticate('px_admin');
|
|
|
|
const { response, body } = await api.createInquiry({
|
|
subject: `E2E Expire Inquiry ${Date.now()}`,
|
|
message: 'E2E scenario test - SLA expiry flow. Please ignore.',
|
|
});
|
|
expect(response.status()).toBe(201);
|
|
inquiryId = body.id;
|
|
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
await sessionPost(page, `/inquiries/${inquiryId}/activate/`, {});
|
|
await page.waitForTimeout(800);
|
|
|
|
const patchResp = await api.setDueAtPast('inquiries', inquiryId, 7);
|
|
expect([200, 204].includes(patchResp.status())).toBeTruthy();
|
|
});
|
|
|
|
test('verify overdue indicator in inquiry list', async ({ page }) => {
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto('/inquiries/');
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
const tableText = await page.locator('table').textContent();
|
|
expect(tableText).toBeTruthy();
|
|
await page.waitForTimeout(800);
|
|
});
|
|
|
|
test('verify overdue indicator in inquiry detail', async ({ page }) => {
|
|
const auth = new RoleAuthHelper(page);
|
|
await auth.login('hospital_admin');
|
|
await page.waitForTimeout(800);
|
|
|
|
await page.goto(`/inquiries/${inquiryId}/`);
|
|
await page.waitForLoadState('domcontentloaded');
|
|
await page.waitForTimeout(2500);
|
|
|
|
const pageText = await page.textContent('body');
|
|
expect(pageText).toContain('INQ-');
|
|
await page.waitForTimeout(800);
|
|
});
|
|
|
|
test('inquiry can still be responded to after SLA breach', async ({ page }) => {
|
|
const api = new ApiHelper(page);
|
|
await api.authenticate('px_admin');
|
|
|
|
const respondResp = await api.respondToInquiry(
|
|
inquiryId,
|
|
'E2E test - response provided after SLA breach'
|
|
);
|
|
expect([200, 201, 204].includes(respondResp.status())).toBeTruthy();
|
|
});
|
|
});
|
|
});
|