import assert from "node:assert/strict"; import test from "node:test"; import { BULK_MESSAGE_REVIEW_LIMIT, bulkMessageReviewGroups, bulkReviewIssueLabel } from "../src/features/campaigns/review/bulkMessageReview.ts"; function job(id: string, patch: Record = {}) { return { id, build_status: "built", validation_status: "needs_review", recipient_email: `${id}@example.test`, review_decision: { eligible: true, category_key: "attachments-empty", reason_required: true, issue_codes: ["attachment_missing"] }, ...patch }; } test("bulk review trusts explicit backend eligibility, never warning status or expected outcomes", () => { const groups = bulkMessageReviewGroups([ job("eligible"), job("missing", { review_decision: undefined }), job("denied", { review_decision: { eligible: false, category_key: "attachments-empty" } }), job("excluded", { validation_status: "excluded" }), job("warning", { validation_status: "warning" }), job("blocked", { validation_status: "blocked" }), job("unbuilt", { build_status: "failed" }), job("reviewed", { reviewed: true }), job("hard-issue", { issues: [{ behavior: "block" }] }), job("empty-category", { review_decision: { eligible: true, category_key: "" } }), job(""), ]); assert.deepEqual(groups.map((group) => group.messages.map((message) => message.jobId)), [["eligible"]]); }); test("bulk grouping preserves full server category and exact stable deduplicated IDs", () => { const groups = bulkMessageReviewGroups([ job("second"), job("first"), job("first"), job("other", { review_decision: { eligible: true, category_key: "attachments-count", reason_required: false, issue_codes: ["attachment_count", "attachment_empty", "attachment_count"] } }), ]); assert.equal(groups.length, 2); assert.deepEqual(groups.find((group) => group.categoryKey === "attachments-empty")?.messages.map((message) => message.jobId), ["first", "second"]); assert.equal(groups.find((group) => group.categoryKey === "attachments-empty")?.reasonRequired, true); assert.deepEqual(groups.find((group) => group.categoryKey === "attachments-count")?.issueCodes, ["attachment_count", "attachment_empty"]); }); test("group totals remain truthful beyond the bounded selection size", () => { const groups = bulkMessageReviewGroups(Array.from({ length: 205 }, (_, index) => job(`job-${String(index).padStart(3, "0")}`))); assert.equal(BULK_MESSAGE_REVIEW_LIMIT, 200); assert.equal(groups[0].messages.length, 205); assert.equal(groups[0].messages.slice(0, BULK_MESSAGE_REVIEW_LIMIT).length, 200); }); test("category labels are translated descriptions rather than technical codes", () => { assert.equal(bulkReviewIssueLabel("missing_optional_attachment"), "i18n:govoplan-campaign.bulk_review_missing_optional"); assert.equal(bulkReviewIssueLabel("missing_attachment_coverage"), "i18n:govoplan-campaign.bulk_review_no_attachments"); assert.equal(bulkReviewIssueLabel("duplicate_attachment_reuse"), "i18n:govoplan-campaign.bulk_review_shared_attachment"); assert.equal(bulkReviewIssueLabel("future_condition"), "i18n:govoplan-campaign.bulk_review_other_category"); });