修复: 08-07-business-routing-regression-repair 关闭资产创建跳转回归

这个提交包含在:
2026-08-07 14:53:55 +08:00
父节点 892b313888
当前提交 c14b40a00a
共修改 15 个文件,包含 450 行新增和 21 行删除
+2
查看文件
@@ -118,6 +118,7 @@ test("E2E 资产流转主链路:建卡→领用归还→调拨→盘点", asyn
};
const assetId = createAssetPayload.data.asset.id;
await expect(page).toHaveURL(new RegExp(`/assets/${assetId}$`));
await expect(page.getByTestId("unsaved-changes-dialog")).toHaveCount(0);
await page.goBack();
await expect(page).toHaveURL(/\/assets$/);
await page.goForward();
@@ -161,6 +162,7 @@ test("E2E 资产流转主链路:建卡→领用归还→调拨→盘点", asyn
await logout(page, ADMINISTRATION.name);
await page.setViewportSize({ width: 1440, height: 960 });
await login(page, FINANCE_MGR);
await (await openNavLink(page, "资产盘点")).click();
await page.getByTestId("inventory-create").click();
+4 -3
查看文件
@@ -90,7 +90,7 @@ test("E2E 采购主链路:员工提单→经理审批→财务归档", async (
await page.goto(`/workflow/tasks/${currentTaskId}`);
await expect(page.getByTestId("workflow-task-overview")).toContainText("采购申请");
await expect(page.getByTestId("workflow-task-summary")).toContainText("申请人");
await expect(page.getByTestId("workflow-task-summary")).toContainText("Employee");
await expect(page.getByTestId("workflow-task-summary")).toContainText(EMPLOYEE.name);
await page.getByTestId("workflow-task-approve").click();
await expect(page.getByTestId("workflow-action-confirm-dialog")).toContainText("确认后将进入下一审批节点");
await page.getByTestId("workflow-action-confirm-submit").click();
@@ -101,8 +101,9 @@ test("E2E 采购主链路:员工提单→经理审批→财务归档", async (
await login(page, FINANCE_MGR);
await (await openNavLink(page, "采购")).click();
await page.getByRole("button", { name: "全范围" }).click();
await page.getByRole("combobox").first().selectOption("approved");
await page.getByTestId("purchase-advanced-filters").click();
await page.getByTestId("purchase-scope-all").click();
await page.getByTestId("purchase-tab-approved").click();
const purchaseRow = page.getByRole("row").filter({ hasText: requestNo }).first();
await expect(purchaseRow).toBeVisible({ timeout: 30_000 });
await purchaseRow.getByTestId("purchase-row-open").click();
@@ -492,6 +492,29 @@ async function mockApis(page: Page, options: { roleCodes?: string[] } = {}) {
return;
}
if (pathName === "/api/assets" && request.method() === "POST") {
const payload = request.postDataJSON() as { name?: string };
if (payload.name === "合成失败资产") {
await route.fulfill({
status: 400,
contentType: "application/json",
body: JSON.stringify({
requestId: "mock-r103-asset-create-failure",
error: { code: "VALID_001", message: "资产保存失败,请检查填写内容。" },
}),
});
return;
}
await fulfillJson(route, {
asset: {
...assetListItem(),
...payload,
id: assetId,
},
});
return;
}
if (pathName === `/api/assets/${assetId}` && request.method() === "GET") {
await fulfillJson(route, { asset: assetListItem() });
return;
@@ -894,6 +917,45 @@ test.describe("R103 cross page UI consistency", () => {
await page.getByTestId("unsaved-changes-discard").click();
await expect(page).toHaveURL(/\/assets$/);
await expect(page.getByTestId("asset-row")).toBeVisible();
await page.getByTestId("asset-create").click();
await expect(page).toHaveURL(/\/assets\/new$/);
await page.getByTestId("asset-name").fill("合成已保存资产");
await page.getByTestId("asset-category").selectOption("asset-category-r103");
await page.getByTestId("asset-legal-entity").selectOption("legal-r103");
await page.getByTestId("asset-cost-center").selectOption("cost-r103");
await page.getByTestId("asset-save").click();
await expect(page).toHaveURL(new RegExp(`/assets/${assetId}$`));
await expect(page.getByTestId("unsaved-changes-dialog")).toHaveCount(0);
await expect(page.locator("html")).toHaveAttribute("data-unsaved-changes", "false");
await page.goBack();
await expect(page).toHaveURL(/\/assets$/);
await page.goForward();
await expect(page).toHaveURL(new RegExp(`/assets/${assetId}$`));
await page.goBack();
await page.getByTestId("asset-create").click();
await page.getByTestId("asset-name").fill("合成失败资产");
await page.getByTestId("asset-category").selectOption("asset-category-r103");
await page.getByTestId("asset-legal-entity").selectOption("legal-r103");
await page.getByTestId("asset-cost-center").selectOption("cost-r103");
const failedCreateResponse = page.waitForResponse(
(response) => response.request().method() === "POST" && new URL(response.url()).pathname === "/api/assets",
);
await page.getByTestId("asset-save").click();
const failedResponse = await failedCreateResponse;
expect(failedResponse.ok()).toBe(false);
expect(failedResponse.status()).toBe(400);
await expect(page).toHaveURL(/\/assets\/new$/);
await expect(page.getByTestId("asset-name")).toHaveValue("合成失败资产");
await expect(page.getByRole("main").getByText("资产保存失败,请检查填写内容。", { exact: true })).toBeVisible();
await page.getByRole("button", { name: "返回资产列表", exact: true }).click();
await expect(page.getByTestId("unsaved-changes-dialog")).toContainText("资产表单尚未保存");
await page.getByTestId("unsaved-changes-continue").click();
await expect(page).toHaveURL(/\/assets\/new$/);
await expect(page.getByTestId("asset-name")).toHaveValue("合成失败资产");
});
test("共享未保存保护覆盖浏览器返回取消、确认与刷新拦截", async ({ page }) => {