完成五人团队正式内用最小收口(07-18-small-team-internal-readiness)

这个提交包含在:
2026-07-18 15:46:14 +08:00
父节点 58c8decef9
当前提交 5d0a5f9a38
共修改 134 个文件,包含 10790 行新增和 1413 行删除
@@ -279,37 +279,40 @@ describe("workflow transfer route", () => {
await app.close();
});
it("does not treat admin-only target as a business approver", async () => {
const tx = buildTx({ entityType: "reimbursement", targetRoleCode: "admin" });
const app = await buildApp({
prisma: buildPrisma(tx),
employee: {
id: "actor-1",
roleCodes: ["manager"],
permissionCodes: ["expense.transfer"],
},
});
it.each(["admin", "system_admin"])(
"does not treat %s-only target as a business approver",
async (targetRoleCode) => {
const tx = buildTx({ entityType: "reimbursement", targetRoleCode });
const app = await buildApp({
prisma: buildPrisma(tx),
employee: {
id: "actor-1",
roleCodes: ["manager"],
permissionCodes: ["expense.transfer"],
},
});
const response = await app.inject({
method: "POST",
url: `/api/workflow/tasks/${buildTaskRow().id}/transfer`,
headers: { authorization: "Bearer test" },
payload: {
toApproverId: "44444444-4444-4444-8444-444444444444",
reason: "当前事项需转交对应审批人继续处理,请及时跟进。",
},
});
const response = await app.inject({
method: "POST",
url: `/api/workflow/tasks/${buildTaskRow().id}/transfer`,
headers: { authorization: "Bearer test" },
payload: {
toApproverId: "44444444-4444-4444-8444-444444444444",
reason: "当前事项需转交对应审批人继续处理,请及时跟进。",
},
});
expect(response.statusCode).toBe(409);
expect(response.json().error.details).toEqual(
expect.objectContaining({
toApproverId: "target_not_approver",
}),
);
expect(tx.workflowTask.update).not.toHaveBeenCalled();
expect(response.statusCode).toBe(409);
expect(response.json().error.details).toEqual(
expect.objectContaining({
toApproverId: "target_not_approver",
}),
);
expect(tx.workflowTask.update).not.toHaveBeenCalled();
await app.close();
});
await app.close();
},
);
it("rejects transfer to the applicant", async () => {
const tx = buildTx({ entityType: "leave", targetRoleCode: "manager" });