B1-B8 建立项目级流程与QA门禁

这个提交包含在:
2026-05-09 01:57:05 +08:00
父节点 555e7b7e29
当前提交 485328426a
共修改 29 个文件,包含 1633 行新增和 102 行删除
+8 -11
查看文件
@@ -23,7 +23,7 @@ async function createBlankReimbursement(page: import("@playwright/test").Page) {
return reimbursementId;
}
test("E2E 轻交互 OCR:报销详情上传后自动可绑定并提交", async ({ page, reimbursementDetail }) => {
test("E2E 轻交互 OCR:报销详情上传后自动添加并提交", async ({ page, reimbursementDetail }) => {
await login(page, EMPLOYEE);
const reimbursementId = await createBlankReimbursement(page);
@@ -34,21 +34,18 @@ test("E2E 轻交互 OCR:报销详情上传后自动可绑定并提交", async
await expect(page.getByRole("dialog", { name: "添加发票" })).toBeVisible();
const marker = `MOCK_R73_SUCCESS_${Date.now()}`;
const invoiceFileName = `r73-success-${Date.now()}.png`;
await page.getByTestId(TEST_IDS.reimbursement.invoiceUploadFile).setInputFiles({
name: `r73-success-${Date.now()}.png`,
name: invoiceFileName,
mimeType: "image/png",
buffer: Buffer.from(marker, "utf8"),
});
await page.getByTestId(TEST_IDS.reimbursement.invoiceUploadSubmit).scrollIntoViewIfNeeded();
await page.getByTestId(TEST_IDS.reimbursement.invoiceUploadSubmit).click();
await expect.poll(async () => {
const text = await page.getByText(/已选 \d+ 张发票/).first().textContent().catch(() => "");
return text ?? "";
}, { timeout: 90_000 }).toContain("已选 1 张发票");
await page.getByRole("button", { name: "绑定选中发票" }).click();
await expect(page.getByTestId(TEST_IDS.reimbursement.invoices)).not.toContainText("暂无关联票据", { timeout: 30_000 });
await expect(page.getByTestId(TEST_IDS.reimbursement.invoices)).toContainText(invoiceFileName, { timeout: 90_000 });
await page.keyboard.press("Escape");
await expect(page.getByTestId(TEST_IDS.reimbursement.invoiceDialog)).toHaveCount(0);
await reimbursementDetail.submitReimbursement();
await expect(page.getByText(/状态:(reviewing|审批中)/)).toBeVisible({ timeout: 30_000 });
@@ -71,7 +68,7 @@ test("E2E 轻交互 OCR:票据中心缺关键字段后可在当前页修正并
});
await page.getByTestId("invoice-upload-submit").click();
await expect(page.getByTestId("invoice-detail-panel")).toContainText("状态:ocr_failed", { timeout: 90_000 });
await expect(page.getByTestId("invoice-detail-panel")).toContainText("状态:识别失败", { timeout: 90_000 });
await expect(page.getByTestId("invoice-ocr-status-banner")).toContainText("OCR 缺少关键字段:发票代码、销售方。");
await page.getByTestId("invoice-edit-open").click();
@@ -83,7 +80,7 @@ test("E2E 轻交互 OCR:票据中心缺关键字段后可在当前页修正并
await page.getByTestId("invoice-edit-seller-name").fill("北京悦海堂餐饮管理有限公司");
await page.getByTestId("invoice-edit-save").click();
await expect(page.getByTestId("invoice-detail-panel")).toContainText("状态:available", { timeout: 30_000 });
await expect(page.getByTestId("invoice-detail-panel")).toContainText("状态:可用", { timeout: 30_000 });
await expect(page.getByTestId("invoice-detail-panel")).toContainText("北京悦海堂餐饮管理有限公司");
await logout(page, EMPLOYEE.name);