// apps/web/e2e/flows/patient-journey.spec.ts import { test, expect } from '../fixtures/auth.fixture'; import { PatientListPage } from '../pages/patient-list.page'; import { PatientDetailPage } from '../pages/patient-detail.page'; import { makePatient, makeDoctor } from '../fixtures/test-data'; test.describe('@flow 患者全流程', () => { const cleanup: Array<() => Promise> = []; test.afterEach(async () => { for (const fn of cleanup.reverse()) { await fn().catch(() => {}); } cleanup.length = 0; }); test('创建患者 → 查看详情 → 编辑 → 分配医生', async ({ api, authenticatedPage: page }) => { const doctorData = makeDoctor(); const doctor = await api.createDoctor(doctorData); cleanup.push(() => api.deleteDoctor(doctor.id, doctor.version)); const listPage = new PatientListPage(page); await listPage.goto(); const patientData = makePatient(); await listPage.clickCreate(); await listPage.fillCreateForm({ name: patientData.name, }); await listPage.submitForm(); await expect(async () => { const found = await listPage.hasPatientInTable(patientData.name); expect(found).toBeTruthy(); }).toPass({ timeout: 10000 }); const patient = await api.createPatient({ ...patientData, name: `${patientData.name}_detail` }); cleanup.push(() => api.deletePatient(patient.id, patient.version)); const detailPage = new PatientDetailPage(page); await detailPage.goto(patient.id); const name = await detailPage.getPatientName(); expect(name.length).toBeGreaterThan(0); const assignBtn = page.locator('button:has-text("分配医生")'); if (await assignBtn.isVisible().catch(() => false)) { await detailPage.clickAssignDoctor(); await detailPage.selectDoctor(doctorData.name); await detailPage.confirmAssign(); } }); });