R7EP/OPS8/QAF8/UX8/P2T 收口自动化预检

这个提交包含在:
2026-05-13 15:13:41 +08:00
父节点 0260bc7fe5
当前提交 db1df49632
共修改 11 个文件,包含 133 行新增和 38 行删除
@@ -45,6 +45,16 @@ async function waitForWorkflowTaskCache(page: import("@playwright/test").Page, t
.toBe(true);
}
async function expectMobileApprovalDetailUrl(page: import("@playwright/test").Page, taskId: string) {
const encodedTaskId = taskId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
await expect(page).toHaveURL(new RegExp(`/mobile/approvals(?:/${encodedTaskId}|\\?taskId=${encodedTaskId})`));
}
async function returnToMobileApprovalList(page: import("@playwright/test").Page) {
await page.getByTestId("mobile-approvals-detail-header").getByRole("button", { name: "返回" }).click();
await expect(page).toHaveURL(/\/mobile\/approvals(?:\?|$)/);
}
test.use({
...devices["iPhone 13"],
serviceWorkers: "block",
@@ -66,7 +76,7 @@ test("E2E 移动审批:deep link 分流 + 离线草稿重放", async ({ page }
await loginMobile(page, MANAGER);
await page.goto(`/workflow/tasks/${task.id}`);
await expect(page).toHaveURL(new RegExp(`/mobile/approvals\\?taskId=${task.id}`));
await expectMobileApprovalDetailUrl(page, task.id);
await expect(page.getByTestId("mobile-approvals-detail")).toBeVisible({ timeout: 30_000 });
await expect(page.getByTestId("mobile-approvals-detail")).toContainText(created.travelRequest.requestNo);
await waitForWorkflowTaskCache(page, task.id);
@@ -75,12 +85,10 @@ test("E2E 移动审批:deep link 分流 + 离线草稿重放", async ({ page }
await expect(page.getByText("当前离线")).toBeVisible();
await expect(page.getByTestId("mobile-approvals-approve")).toBeEnabled({ timeout: 15_000 });
await page.getByTestId("mobile-approvals-approve").click();
await expect(page.getByTestId("mobile-approvals-queue")).toContainText("待同步 1");
await expect(page.getByTestId("mobile-approvals-queue")).toContainText("通过");
await expect(page.getByRole("main").getByText("当前离线,通过草稿已加入待同步队列。")).toBeVisible();
await page.context().setOffline(false);
await page.evaluate(() => window.dispatchEvent(new Event("online")));
await expect(page.getByTestId("mobile-approvals-queue")).toContainText("无草稿", { timeout: 30_000 });
await expect(page.getByRole("main").getByText(/草稿同步完成:成功 1,失败 0,冲突 0/)).toBeVisible({ timeout: 30_000 });
} finally {
await Promise.all([created.client.dispose(), managerApi.dispose()]);
@@ -102,7 +110,7 @@ test("E2E 移动审批:离线草稿冲突态可见", async ({ page }) => {
await loginMobile(page, MANAGER);
await page.goto(`/workflow/tasks/${task.id}`);
await expect(page).toHaveURL(new RegExp(`/mobile/approvals\\?taskId=${task.id}`));
await expectMobileApprovalDetailUrl(page, task.id);
await expect(page.getByTestId("mobile-approvals-detail")).toBeVisible({ timeout: 30_000 });
await expect(page.getByTestId("mobile-approvals-detail")).toContainText(created.travelRequest.requestNo);
await waitForWorkflowTaskCache(page, task.id);
@@ -111,13 +119,14 @@ test("E2E 移动审批:离线草稿冲突态可见", async ({ page }) => {
await expect(page.getByTestId("mobile-approvals-reject")).toBeEnabled({ timeout: 15_000 });
await page.getByTestId("mobile-approvals-comment").fill("离线驳回意见:请补充差旅安排说明");
await page.getByTestId("mobile-approvals-reject").click();
await expect(page.getByTestId("mobile-approvals-queue")).toContainText("待同步 1");
await expect(page.getByTestId("mobile-approvals-queue")).toContainText("驳回");
await expect(page.getByRole("main").getByText("当前离线,驳回草稿已加入待同步队列。")).toBeVisible();
await approveWorkflowTaskViaApi(managerApi.api, task.id);
await page.context().setOffline(false);
await page.evaluate(() => window.dispatchEvent(new Event("online")));
await expect(page.getByRole("main").getByText(/草稿同步完成:成功 0,失败 0,冲突 1/)).toBeVisible({ timeout: 30_000 });
await returnToMobileApprovalList(page);
await expect(page.getByTestId("mobile-approvals-queue")).toContainText("存在冲突", { timeout: 30_000 });
await expect(page.getByTestId("mobile-approvals-queue")).toContainText("最近错误:", { timeout: 30_000 });
await expect(page.getByRole("button", { name: "查看任务" })).toBeVisible();