import { describe, expect, it } from "vitest"; import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row"; import { shouldCompleteAfterCompletionDoc } from "@/domain/work-orders/utils/completion-doc-auto-complete"; function closablePmRow(overrides: Partial = {}): WorkOrderTableRow { return { id: 42, woNumber: "24866", type: "PM", dispatcherId: "u1", dispatcherName: "Dispatcher", company: "Vendor Co", vendorId: "7", tech: "Tech One", completedDate: "2026-09-15", pm: "HVAC", status: "In Progress", docStatus: "Yes", mediaCount: 0, isPastDue: false, upliftSummary: { hasUplift: false, pendingCount: 0 }, ...overrides, } as WorkOrderTableRow; } describe("shouldCompleteAfterCompletionDoc (SH-341)", () => { it("completes a closable PM once the generated document is persisted", () => { expect(shouldCompleteAfterCompletionDoc("Yes", closablePmRow())).toBe(true); }); it("never completes on Save draft or Not required", () => { expect(shouldCompleteAfterCompletionDoc("No", closablePmRow({ docStatus: "No" }))).toBe(false); expect(shouldCompleteAfterCompletionDoc("NN", closablePmRow({ docStatus: "NN" }))).toBe(false); }); it("does not complete when the server did not persist the document as generated", () => { expect(shouldCompleteAfterCompletionDoc("Yes", closablePmRow({ docStatus: "No" }))).toBe(false); }); it.each([ ["dispatcher", { dispatcherId: "", dispatcherName: "" }], ["vendor", { company: "", vendorId: "" }], ["completed date", { completedDate: "" }], ["real WO number", { woNumber: "SH02137" }], ["service", { pm: "" }], ["pending uplift", { upliftSummary: { hasUplift: true, pendingCount: 1 } }], ["photo on a Reactive WO", { type: "Reactive" as const, mediaCount: 0 }], ])("keeps the SH-114 closability gate: missing %s blocks completion", (_label, overrides) => { expect(shouldCompleteAfterCompletionDoc("Yes", closablePmRow(overrides))).toBe(false); }); it("completes a Reactive WO that has its completion photo", () => { expect( shouldCompleteAfterCompletionDoc("Yes", closablePmRow({ type: "Reactive", mediaCount: 1 })), ).toBe(true); }); it("leaves Completed, Canceled, and Past Due rows unchanged", () => { expect(shouldCompleteAfterCompletionDoc("Yes", closablePmRow({ status: "Completed" }))).toBe( false, ); expect(shouldCompleteAfterCompletionDoc("Yes", closablePmRow({ status: "Canceled" }))).toBe( false, ); expect(shouldCompleteAfterCompletionDoc("Yes", closablePmRow({ isPastDue: true }))).toBe(false); }); });