import assert from "node:assert/strict"; import test from "node:test"; import { attachmentDeliveryPreflight, calculateBuildReviewProgress } from "../src/features/campaigns/review/reviewProgress.ts"; test("separates blocking, individual, and group review work", () => { assert.deepEqual(calculateBuildReviewProgress({ blocking: 2, individualRequired: 3, individualReviewed: 1, groupRequired: 4, reviewComplete: false }), { blocking: 2, individualRequired: 3, individualReviewed: 1, individualRemaining: 2, groupRequired: 4, groupReviewed: 0, groupRemaining: 4, required: 7, reviewed: 1, remaining: 6 }); }); test("a recorded review completion acknowledges every review decision", () => { const progress = calculateBuildReviewProgress({ blocking: 0, individualRequired: 3, individualReviewed: 3, groupRequired: 4, reviewComplete: true }); assert.equal(progress.reviewed, 7); assert.equal(progress.remaining, 0); assert.equal(progress.individualRemaining, 0); assert.equal(progress.groupRemaining, 0); }); test("normalizes malformed counters without overstating progress", () => { const progress = calculateBuildReviewProgress({ blocking: -2, individualRequired: 2.9, individualReviewed: 99, groupRequired: Number.NaN, reviewComplete: false }); assert.equal(progress.blocking, 0); assert.equal(progress.individualRequired, 2); assert.equal(progress.individualReviewed, 2); assert.equal(progress.required, 2); assert.equal(progress.remaining, 0); }); const acceptedAttachments = { migrationRequired: false, hasBuild: true, reviewLoaded: true, blocking: 0, remaining: 0, inspectionComplete: true, missing: 14, ambiguous: 0 }; test("fourteen accepted missing matches do not ask again at final delivery preflight", () => { assert.equal(attachmentDeliveryPreflight(acceptedAttachments).state, "ready"); assert.equal(attachmentDeliveryPreflight({ ...acceptedAttachments, inspectionComplete: false }).state, "ready"); }); test("expected policy omissions need no acceptance and pending review is not a hard attachment blocker", () => { assert.equal(attachmentDeliveryPreflight({ ...acceptedAttachments, inspectionComplete: false, remaining: 0 }).state, "ready"); assert.equal(attachmentDeliveryPreflight({ ...acceptedAttachments, inspectionComplete: false, remaining: 14 }).state, "warning"); }); test("saved review cannot override real blockers, missing build evidence or legacy Mail migration", () => { assert.equal(attachmentDeliveryPreflight({ ...acceptedAttachments, blocking: 1 }).state, "blocked"); assert.equal(attachmentDeliveryPreflight({ ...acceptedAttachments, migrationRequired: true }).state, "blocked"); assert.equal(attachmentDeliveryPreflight({ ...acceptedAttachments, reviewLoaded: false }).state, "info"); assert.equal(attachmentDeliveryPreflight({ ...acceptedAttachments, hasBuild: false }).state, "info"); });