R36-1/R36-2/R36-3/R36-5 收口请假编辑与团队日历
这个提交包含在:
@@ -69,6 +69,48 @@ async function withdrawLeave(api: Awaited<ReturnType<typeof createAuthenticatedA
|
||||
return apiPostData<{ leaveRequestId: string; leaveStatus: string }>(api, `/api/leave-requests/${leaveRequestId}/withdraw`, {});
|
||||
}
|
||||
|
||||
test("E2E 请假编辑:草稿保存后保留原单并可继续提交", async ({ page }) => {
|
||||
const employeeClient = await createAuthenticatedApiClient(EMPLOYEE);
|
||||
const baseOffset = 80 + Number(String(Date.now()).slice(-2));
|
||||
const startDate = formatDate(baseOffset);
|
||||
const updatedEndDate = formatDate(baseOffset + 1);
|
||||
|
||||
try {
|
||||
await login(page, EMPLOYEE);
|
||||
await (await openNavLink(page, "请假")).click();
|
||||
await expect(page.getByRole("heading", { name: "请假申请" })).toBeVisible();
|
||||
|
||||
const leaveId = await createLeaveDraft(page, startDate, startDate, `Playwright 编辑请假 ${Date.now()}`);
|
||||
await page.goto("/leave-requests");
|
||||
|
||||
const draftRow = page.getByRole("row").filter({ hasText: startDate }).first();
|
||||
await expect(draftRow).toContainText("草稿", { timeout: 30_000 });
|
||||
|
||||
const updateResponsePromise = page.waitForResponse((response) => {
|
||||
return response.request().method() === "PATCH" && new URL(response.url()).pathname === `/api/leave-requests/${leaveId}` && response.ok();
|
||||
});
|
||||
|
||||
await draftRow.getByRole("button", { name: "编辑" }).click();
|
||||
await expect(page.getByText("编辑请假单")).toBeVisible();
|
||||
await page.locator("#leave-end-date").fill(updatedEndDate);
|
||||
await page.locator("#leave-reason").fill(`更新后的请假说明 ${Date.now()}`);
|
||||
await page.getByRole("button", { name: "保存修改" }).click();
|
||||
|
||||
const updatePayload = (await (await updateResponsePromise).json()) as { data?: { id?: string } };
|
||||
expect(updatePayload.data?.id).toBe(leaveId);
|
||||
|
||||
await page.goto("/leave-requests");
|
||||
const updatedRow = page.getByRole("row").filter({ hasText: updatedEndDate }).first();
|
||||
await expect(updatedRow).toContainText("草稿", { timeout: 30_000 });
|
||||
|
||||
await submitLeave(employeeClient.api, leaveId);
|
||||
await page.goto("/leave-requests");
|
||||
await expect(updatedRow).toContainText("审批中", { timeout: 30_000 });
|
||||
} finally {
|
||||
await employeeClient.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
test("E2E 请假主链路:草稿 → 提交 → 撤回 + 提交 → 审批", async ({ page, workflowDetail }) => {
|
||||
const employeeClient = await createAuthenticatedApiClient(EMPLOYEE);
|
||||
const baseOffset = 30 + Number(String(Date.now()).slice(-2));
|
||||
|
||||
在新工单中引用
屏蔽一个用户