/** * Verifies applyLiveStatus: the live-progress overlay used by the client * portal order timeline. Run: npx tsx api/test/test_timeline_status.ts */ import { applyLiveStatus } from "../src/routes/order-timeline-status.js"; type Step = { name: string; description: string; business_days: number; status: string }; const npiSteps: Step[] = [ { name: "Order Received", description: "", business_days: 0, status: "completed" }, { name: "Document Preparation", description: "", business_days: 1, status: "pending" }, { name: "Signature Required", description: "", business_days: 1, status: "pending" }, { name: "Filed with CMS", description: "", business_days: 2, status: "pending" }, { name: "CMS Confirmation", description: "", business_days: 10, status: "pending" }, ]; let failures = 0; function check(label: string, got: string[], want: string[]) { const ok = JSON.stringify(got) === JSON.stringify(want); if (!ok) { failures++; console.error(`FAIL: ${label}\n got: ${got.join(",")}\n want: ${want.join(",")}`); } else { console.log(`ok: ${label}`); } } const statuses = (s: Step[]) => s.map((x) => x.status); // 1. Unpaid, nothing reached → only the statically-completed step 0 is done. check( "unpaid", statuses(applyLiveStatus(npiSteps, { paid: false, signed: false, fulfillmentStatus: null })), ["completed", "pending", "pending", "pending", "pending"], ); // 2. Paid only → Order Received done, prep in progress check( "paid only", statuses(applyLiveStatus(npiSteps, { paid: true, signed: false, fulfillmentStatus: null })), ["completed", "in_progress", "pending", "pending", "pending"], ); // 3. Paid + signed → through Signature done, Filed in progress check( "paid+signed", statuses(applyLiveStatus(npiSteps, { paid: true, signed: true, fulfillmentStatus: null })), ["completed", "completed", "completed", "in_progress", "pending"], ); // 4. Paid + signed + filed → through Filed done, Confirmation in progress check( "paid+signed+filed", statuses(applyLiveStatus(npiSteps, { paid: true, signed: true, fulfillmentStatus: "filed_waiting_state" })), ["completed", "completed", "completed", "completed", "in_progress"], ); // 5. Completed → everything done check( "completed", statuses(applyLiveStatus(npiSteps, { paid: true, signed: true, fulfillmentStatus: "completed" })), ["completed", "completed", "completed", "completed", "completed"], ); // 6. ready_to_file without explicit signed → still advances to Filed step check( "ready_to_file", statuses(applyLiveStatus(npiSteps, { paid: true, signed: false, fulfillmentStatus: "ready_to_file" })), ["completed", "completed", "completed", "completed", "in_progress"], ); // 7. A timeline with no signature step (e.g. boc3) still works off paid + fulfillment const boc3: Step[] = [ { name: "Order Received", description: "", business_days: 0, status: "completed" }, { name: "Process Agent Filing", description: "", business_days: 1, status: "pending" }, { name: "FMCSA Registration", description: "", business_days: 3, status: "pending" }, ]; check( "boc3 paid", statuses(applyLiveStatus(boc3, { paid: true, signed: false, fulfillmentStatus: null })), ["completed", "in_progress", "pending"], ); check( "boc3 filed", statuses(applyLiveStatus(boc3, { paid: true, signed: false, fulfillmentStatus: "filed_waiting_state" })), ["completed", "completed", "in_progress"], // "Process Agent Filing" matches FILED_STEP_RE ); if (failures > 0) { console.error(`\n${failures} test(s) failed`); process.exit(1); } console.log("\nAll timeline status tests passed");