Files
govoplan-campaign/webui/tests/bulk-message-review.test.ts
zemion c51fc180fb
Module Package Release / publish-packages (push) Successful in 12s
Release govoplan-campaign v0.1.28: stabilize saving, review and delivery recovery
2026-09-08 01:32:26 +02:00

46 lines
3.1 KiB
TypeScript

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<string, unknown> = {}) {
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");
});