import { act, renderHook } from "@testing-library/react"; import { describe, expect, it, vi } from "vitest"; import { useSlideOverEditState } from "@/app/(protected)/workorders/_components/detail/use-slide-over-edit-state"; import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row"; function baseRow(overrides: Partial = {}): WorkOrderTableRow { return { id: 100, woNumber: "100", site: "SITE", type: "Emergency", severity: null, dispatcherId: "d1", dispatcherName: "Alex", scheduledOn: "2026-07-16", completedDate: "", targetWeek: "", dayGroup: "2026-07-16", dayLabel: "Thu", location: "Main", locationId: 5, pm: "", serviceNotes: "", extraServices: [], vendorId: "v1", company: "Acme", tech: "Sam", techPhone: "", apptStart: "", apptEnd: "", apptTime: "", status: "Incomplete", docStatus: "", pocName: "", pocPhone: "", pocNotes: "", additionalContacts: [], dueDate: "", rescheduleCount: 0, carriedOver: 0, originalWeek: "", originalDate: "", isPastDue: false, scheduleWeekOnly: false, mediaCount: 0, title: "", priority: "", primaryDispatchId: null, rowVersion: "1", dispatchRowVersion: "", flagColor: null, isAddOn: false, upliftSummary: { hasUplift: false, pendingCount: 0 }, ...overrides, }; } describe("useSlideOverEditState completed lock", () => { it("leaves edit mode and refuses commit when the same work order becomes completed", () => { const onSave = vi.fn(); const onClose = vi.fn(); const setTab = vi.fn(); const open = baseRow(); const { result, rerender } = renderHook( ({ row, infoSource }) => useSlideOverEditState({ row, editMode: true, infoSource, onSave, onClose, closeDisabled: false, setTab, }), { initialProps: { row: open, infoSource: open } }, ); expect(result.current.editing).toBe(true); act(() => { result.current.handleDraftChange({ woNumber: "WO-LOCKED" }); }); const completed = baseRow({ status: "Completed", woNumber: "100" }); rerender({ row: completed, infoSource: completed }); expect(result.current.editing).toBe(false); act(() => { result.current.commit(); }); expect(onSave).not.toHaveBeenCalled(); }); });