WCBK1 实现企微审批回调只读 POC
这个提交包含在:
@@ -46,6 +46,24 @@ function validFixtureRow(overrides = {}) {
|
||||
};
|
||||
}
|
||||
|
||||
function validCallbackRow(overrides = {}) {
|
||||
return {
|
||||
ID: "WCBK1-0",
|
||||
Title: "合法企微审批回调只读合同",
|
||||
Description: "WCBK1 回调只读 POC,路线:WCBK1 -> WACP3 -> WADM1 -> wecom_attendance_approval_mirror_v1;范围只验证企微审批回调。",
|
||||
Acceptance: "固定 WECOM_APPROVAL_CALLBACK_URL、WECOM_CALLBACK_TOKEN、WECOM_CALLBACK_ENCODING_AES_KEY;GET /api/wecom/approval/callback 做 URL 验证;POST /api/wecom/approval/callback 接收事件;使用 msg_signature 验签和 EncodingAESKey 解密;只读、幂等,不写 OA 业务镜像,不写企微数据;不使用通讯录 Secret,不尝试其他 Secret,不允许运行时猜 Secret;缺配置记录 NEEDS_CONFIG,外部阻断记录 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。",
|
||||
Test_Method: "受影响流程:WAPC2FLIVE 样件 -> WCBK1 回调只读 POC -> WACP3 补偿拉取;验证步骤:node scripts/qa/check-process-contract.mjs --issue callback.csv --profile wecom-callback --json。",
|
||||
Tools: "node|vitest",
|
||||
Dev_Status: "TODO",
|
||||
Review1_Status: "TODO",
|
||||
Regression_Status: "TODO",
|
||||
Files: "server/src/routes/wecomApprovalCallback.js|server/src/services/integrations/wecomCallbackCrypto.js",
|
||||
Dependencies: "[]",
|
||||
Notes: "回滚路径:移除回调 URL 或新增路由;报告不得输出原始 XML、密文、完整 sp_no、完整 userid、完整 template_id、Token、EncodingAESKey 或原始 payload。",
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
function evaluate(rows, profile = "wecom-approval-fixture") {
|
||||
return gate.evaluateIssueContract({
|
||||
csvText: buildCsv(rows),
|
||||
@@ -72,6 +90,14 @@ describe("check-process-contract", () => {
|
||||
expect(result.checks.some((item) => item.name === "profile.wecom_approval_fixture")).toBe(true);
|
||||
});
|
||||
|
||||
it("passes a valid WCBK1 callback contract", () => {
|
||||
const result = evaluate([validCallbackRow()], "wecom-callback");
|
||||
|
||||
expect(result.status).toBe("PASS");
|
||||
expect(errorCodes(result)).toEqual([]);
|
||||
expect(result.checks.some((item) => item.name === "profile.wecom_callback")).toBe(true);
|
||||
});
|
||||
|
||||
it("fails when Dependencies is not a JSON array", () => {
|
||||
const result = evaluate([validFixtureRow({ Dependencies: "WAPC2F-0" })]);
|
||||
|
||||
@@ -138,6 +164,10 @@ describe("check-process-contract", () => {
|
||||
issue: "a.csv",
|
||||
profile: "wecom",
|
||||
});
|
||||
expect(gate.parseArgs(["--issue", "a.csv", "--profile", "wecom-callback"])).toMatchObject({
|
||||
issue: "a.csv",
|
||||
profile: "wecom-callback",
|
||||
});
|
||||
expect(() => gate.parseArgs(["--issue", "a.csv", "--profile", "unknown"])).toThrow(/unsupported profile/);
|
||||
});
|
||||
});
|
||||
|
||||
在新工单中引用
屏蔽一个用户