const { buildConsistencyReport, } = require("../../../src/scripts/audit-wecom-oa-user-consistency"); function employee(overrides = {}) { return { id: overrides.id ?? "employee-1", employeeNo: overrides.employeeNo ?? "E001", name: overrides.name ?? "员工一", phone: overrides.phone ?? "13800000001", email: overrides.email ?? "employee1@example.com", status: overrides.status ?? "active", archived: overrides.archived ?? false, roles: overrides.roles ?? ["employee"], wecomExternalUserId: overrides.wecomExternalUserId ?? "wecom_user_001_very_long", }; } function profile(overrides = {}) { return { externalUserId: overrides.externalUserId ?? "wecom_user_001_very_long", name: overrides.name ?? "员工一", phone: overrides.phone ?? "13800000001", email: overrides.email ?? "employee1@example.com", title: overrides.title ?? "工程师", departmentExternalId: overrides.departmentExternalId ?? "1", departmentName: overrides.departmentName ?? "研发部", sourceStatus: overrides.sourceStatus ?? "active", missingRequiredFields: overrides.missingRequiredFields ?? [], }; } function count(report, key) { return report.findingCounts[key]; } describe("audit-wecom-oa-user-consistency", () => { it("reports no drift when OA active employee matches WeCom active profile by binding", () => { const report = buildConsistencyReport({ oaEmployees: [employee()], wecomProfiles: [profile()], generatedAt: "2026-05-18T00:00:00.000Z", limit: 200, }); expect(report.status).toBe("PASS_NO_DRIFT"); expect(count(report, "matchedActive")).toBe(1); expect(count(report, "oaActiveMissingInWecom")).toBe(0); expect(count(report, "wecomActiveMissingInOa")).toBe(0); expect(count(report, "matchConflict")).toBe(0); }); it("classifies OA active employees missing from WeCom", () => { const report = buildConsistencyReport({ oaEmployees: [employee({ employeeNo: "E002", wecomExternalUserId: "" })], wecomProfiles: [], }); expect(report.status).toBe("PASS_WITH_FINDINGS"); expect(count(report, "oaActiveMissingInWecom")).toBe(1); expect(report.findings.oaActiveMissingInWecom[0]).toMatchObject({ employeeNo: "E002", status: "active", }); }); it("exempts default OA-only smoke accounts from WeCom-missing findings", () => { const report = buildConsistencyReport({ oaEmployees: [ employee({ employeeNo: "T0001", name: "OA smoke admin", email: "smoke-admin@example.com", wecomExternalUserId: "", }), ], wecomProfiles: [], }); expect(report.status).toBe("PASS_NO_DRIFT"); expect(count(report, "oaOnlySmokeExempted")).toBe(1); expect(count(report, "oaActiveMissingInWecom")).toBe(0); expect(report.findings.oaOnlySmokeExempted[0]).toMatchObject({ employeeNo: "T0001", reason: "oa_only_smoke_no_wecom_account_required", }); }); it("classifies WeCom active profiles missing from OA", () => { const report = buildConsistencyReport({ oaEmployees: [], wecomProfiles: [profile({ externalUserId: "wecom_user_new_very_long" })], }); expect(report.status).toBe("PASS_WITH_FINDINGS"); expect(count(report, "wecomActiveMissingInOa")).toBe(1); expect(report.findings.wecomActiveMissingInOa[0].wecom.externalUserIdPrefix).toBe("wecom_us***"); }); it("classifies missing required WeCom fields without exposing phone or email", () => { const report = buildConsistencyReport({ oaEmployees: [employee()], wecomProfiles: [ profile({ phone: "", email: "", departmentExternalId: "", departmentName: "", missingRequiredFields: ["phone", "email", "department"], }), ], }); const serialized = JSON.stringify(report); expect(report.status).toBe("PASS_WITH_FINDINGS"); expect(count(report, "missingRequiredFields")).toBe(1); expect(report.findings.missingRequiredFields[0].fields).toEqual(["department", "email", "phone"]); expect(serialized).not.toContain("13800000001"); expect(serialized).not.toContain("employee1@example.com"); expect(serialized).not.toContain("wecom_user_001_very_long"); }); it("classifies inactive OA employees that still keep a WeCom binding", () => { const report = buildConsistencyReport({ oaEmployees: [ employee({ employeeNo: "HRWDTEST-20260517214548", status: "archived", archived: true, wecomExternalUserId: "HRWDTEST-20260517214548", }), ], wecomProfiles: [], }); expect(report.status).toBe("PASS_WITH_FINDINGS"); expect(count(report, "inactiveWithBinding")).toBe(1); expect(report.findings.inactiveWithBinding[0].employeeNo).toBe("HRWDTEST-20260517214548"); }); it("detects match conflicts across priority keys", () => { const report = buildConsistencyReport({ oaEmployees: [ employee({ id: "employee-by-no", employeeNo: "wecom_user_conflict_very_long", phone: "13800000001", email: "by-no@example.com", wecomExternalUserId: "", }), employee({ id: "employee-by-phone", employeeNo: "E003", phone: "13900000002", email: "by-phone@example.com", wecomExternalUserId: "", }), ], wecomProfiles: [ profile({ externalUserId: "wecom_user_conflict_very_long", phone: "13900000002", email: "new@example.com", }), ], }); expect(report.status).toBe("PASS_WITH_FINDINGS"); expect(count(report, "matchConflict")).toBe(1); expect(report.findings.matchConflict[0]).toMatchObject({ reason: "multiple_oa_candidates" }); expect(report.findings.matchConflict[0].candidates).toHaveLength(2); }); });