import { describe, expect, it } from "vitest"; import { PENDING_UPLIFT_GAP } from "@/domain/work-orders/utils/wo-closability"; import { BOARD_INLINE_STATUSES, COMPLETED_DOC_BLOCK_MSG, COMPLETED_MEDIA_BLOCK_MSG, CREATION_INLINE_STATUSES, SCHEDULED_NEEDS_DATE_MSG, formatAapCompletedBlockTitle, getStatusOptionState, hasConcreteScheduleDate, maybeAutoSchedulePatch, mergeAutoSchedulePatch, } from "@/domain/work-orders/utils/wo-lifecycle-transitions"; import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row"; describe("wo-lifecycle-transitions", () => { it("lists AAP board statuses without Canceled", () => { expect(BOARD_INLINE_STATUSES).toEqual([ "Incomplete", "Pending", "Scheduled", "En Route", "On Site", "In Progress", "Completed", "Rescheduled", "Pending Quote", ]); expect(BOARD_INLINE_STATUSES).not.toContain("Canceled"); }); it("lists AAP creation statuses only", () => { expect(CREATION_INLINE_STATUSES).toEqual(["Incomplete", "Pending", "Scheduled"]); }); it("treats week-only as no concrete schedule date", () => { expect(hasConcreteScheduleDate({ scheduledOn: "2026-06-01", scheduleWeekOnly: true })).toBe( false, ); expect(hasConcreteScheduleDate({ scheduledOn: "2026-06-01", schedMode: "week" })).toBe(false); expect(hasConcreteScheduleDate({ scheduledOn: "—" })).toBe(false); expect(hasConcreteScheduleDate({ scheduledOn: "2026-06-01" })).toBe(true); }); it("disables Scheduled without a concrete date", () => { expect(getStatusOptionState({ scheduledOn: "" }, "Scheduled", [])).toEqual({ disabled: true, title: SCHEDULED_NEEDS_DATE_MSG, }); }); it("promotes Incomplete/Pending when a concrete date exists", () => { expect( maybeAutoSchedulePatch({ status: "Incomplete", scheduledOn: "2026-06-01", scheduleWeekOnly: false, }), ).toEqual({ status: "Scheduled" }); expect( maybeAutoSchedulePatch({ status: "Pending", scheduledOn: "2026-06-01", scheduleWeekOnly: false, }), ).toEqual({ status: "Scheduled" }); }); it("reverts Scheduled without a concrete date to Pending", () => { expect( maybeAutoSchedulePatch({ status: "Scheduled", scheduledOn: "", scheduleWeekOnly: false, }), ).toEqual({ status: "Pending" }); }); it("does not auto-change In Progress when a date exists", () => { expect( maybeAutoSchedulePatch({ status: "In Progress", scheduledOn: "2026-06-01", scheduleWeekOnly: false, }), ).toEqual({}); }); it("merges auto-schedule onto an existing-row patch", () => { const row = { status: "Incomplete", scheduledOn: "", scheduleWeekOnly: false, } as WorkOrderTableRow; expect( mergeAutoSchedulePatch(row, { scheduledOn: "2026-06-02", scheduleWeekOnly: false }), ).toEqual({ scheduledOn: "2026-06-02", scheduleWeekOnly: false, status: "Scheduled", }); expect(mergeAutoSchedulePatch(row, { vendorId: "9" })).toEqual({ vendorId: "9" }); }); it("uses AAP completed tooltip hierarchy", () => { expect(formatAapCompletedBlockTitle(["Dispatcher", "Company"])).toBe( "Fill in Assigned To, Vendor before completing this work order.", ); expect(formatAapCompletedBlockTitle(["Service"])).toBe( "Select a service before completing this work order.", ); expect(formatAapCompletedBlockTitle(["WO number"])).toBe( "Assign a real APM number (not SH) before completing this work order.", ); expect(formatAapCompletedBlockTitle([PENDING_UPLIFT_GAP])).toBe( "This work order has an uplift pending approval and cannot be completed.", ); expect(formatAapCompletedBlockTitle(["Completion document"])).toBe(COMPLETED_DOC_BLOCK_MSG); expect(formatAapCompletedBlockTitle(["At least 1 photo"])).toBe(COMPLETED_MEDIA_BLOCK_MSG); expect(formatAapCompletedBlockTitle(["Company", PENDING_UPLIFT_GAP])).toBe( "Fill in Vendor before completing this work order.", ); }); });