import { test, expect } from "./helpers/fixtures"; import { EMPLOYEE, login, logout } from "./helpers/auth"; import { openNavLink } from "./helpers/navigation"; function extractId(text: string, label: string) { const match = text.match(new RegExp(`${label}:([0-9a-f-]{36})`)); if (!match?.[1]) { throw new Error(`Failed to parse ${label} from text: ${text}`); } return match[1]; } test("E2E 报销审批进度:提交后详情页展示当前步骤进度", async ({ page, reimbursementDetail }) => { await login(page, EMPLOYEE); await (await openNavLink(page, "我的报销")).click(); await expect(page).toHaveURL(/\/reimbursements/); await expect(page.getByTestId("reimbursements-create")).toBeVisible(); const createResponsePromise = page.waitForResponse((response) => { const url = new URL(response.url()); return response.request().method() === "POST" && url.pathname === "/api/reimbursements" && response.ok(); }); await page.getByTestId("reimbursements-create").click(); const createPayload = (await (await createResponsePromise).json()) as { data?: { id?: string } }; const reimbursementId = createPayload.data?.id; if (!reimbursementId) { throw new Error(`创建报销单后未返回 id: ${JSON.stringify(createPayload)}`); } await page.goto(`/reimbursements/${reimbursementId}`); await reimbursementDetail.assertLoaded(); await (await openNavLink(page, "票据中心")).click(); const marker = `MOCK_E2E_${Date.now()}_${Math.random().toString(16).slice(2)}`; await page.getByTestId("invoice-upload-file").setInputFiles({ name: `progress-${Date.now()}.png`, mimeType: "image/png", buffer: Buffer.from(marker, "utf8"), }); await page.getByTestId("invoice-upload-submit").click(); await expect(page.getByTestId("invoice-detail-panel")).toBeVisible(); await expect(page.getByTestId("invoice-detail-panel")).toContainText("状态:available", { timeout: 90_000 }); const invoiceDetailText = await page.getByTestId("invoice-detail-panel").innerText(); const invoiceId = extractId(invoiceDetailText, "票据ID"); await page.getByTestId("invoice-bind-invoice").selectOption(invoiceId); await page.getByTestId("invoice-bind-reimbursement").selectOption(reimbursementId); await page.getByTestId("invoice-bind-submit").click(); await page.goto(`/reimbursements/${reimbursementId}`); await reimbursementDetail.assertLoaded(); await reimbursementDetail.submitReimbursement(); await expect(page.getByText(/状态:(reviewing|审批中)/)).toBeVisible({ timeout: 30_000 }); await expect(reimbursementDetail.workflowProgress).toBeVisible({ timeout: 30_000 }); await expect(reimbursementDetail.workflowProgress).toContainText("当前节点"); await expect(reimbursementDetail.workflowProgress).toContainText(/第 1 步|第 2 步|第 3 步/); await logout(page, EMPLOYEE.name); });