import { useMemo, useState } from "react"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { describe, expect, it, vi } from "vitest"; import { AssignedToCell } from "@/app/(protected)/workorders/_components/list/table/cells/assigned-to-cell"; import { WoTableBody } from "@/app/(protected)/workorders/_components/list/table/wo-table-body"; import type { ReturnTypeOfUseWorkOrdersTableData } from "@/app/(protected)/workorders/_components/list/table/wo-table-types"; import { expandTablePatchToBoardFieldOps } from "@/domain/work-orders/mappers/work-order-board-patch-mapper"; import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row"; import { buildDayGroups, composeBoardSections, rowIdSet, } from "@/domain/work-orders/utils/table-filter-utils"; function makeRow(overrides: Partial = {}): WorkOrderTableRow { return { id: "1", woNumber: "24991", site: "CLV2", type: "PM", severity: null, dispatcherId: "", dispatcherName: "", scheduledOn: "2026-06-02", completedDate: "", targetWeek: "", dayGroup: "06/02", dayLabel: "TUE · 06/02", location: "Cleveland, OH", locationId: "", pm: "Backflow", serviceNotes: "", extraServices: [], company: "", tech: "", techPhone: "", apptStart: "", apptEnd: "", apptTime: "—", status: "Incomplete", docStatus: "No", pocName: "", pocPhone: "", pocNotes: "", dueDate: "", rescheduleCount: 0, carriedOver: 0, isAddOn: false, originalWeek: "", originalDate: "", isPastDue: false, scheduleWeekOnly: false, mediaCount: 0, title: "", priority: "", vendorId: "", primaryDispatchId: null, rowVersion: "", dispatchRowVersion: "", flagColor: null, ...overrides, }; } function baseTableData( overrides: Partial = {}, ): ReturnTypeOfUseWorkOrdersTableData { return { rows: [], isLoading: false, isFetching: false, error: null, refetch: vi.fn(), advActive: false, advResults: [], unassigned: [], unassignedError: null, unscheduled: [], displayGroups: [], searchActive: false, noSearchResults: false, isEmptyWeek: false, todayKey: null, draftDayKey: null, draft: null, setDraft: vi.fn(), unassignedOpen: true, setUnassignedOpen: vi.fn(), unschedOpen: true, setUnschedOpen: vi.fn(), selectedId: null, setSelectedId: vi.fn(), selectedRow: null, flashId: null, triggerFlash: vi.fn(), dragViz: null, setDragViz: vi.fn(), dragState: null, patchRow: vi.fn(), clearRowPatch: vi.fn(), reorderRows: vi.fn(), endDrag: vi.fn(), startDayDraft: vi.fn(), cancelDraft: vi.fn(), addRow: vi.fn(), scopeTotalCount: 0, totalCount: 0, search: "", ...overrides, } as ReturnTypeOfUseWorkOrdersTableData; } const DISPATCHER = { id: "sarah", name: "Sarah Chen", initials: "SC", color: "#3366cc" }; function UnassignedAssignHarness({ initialRow, patchBoardField, }: { initialRow: WorkOrderTableRow; patchBoardField: ( id: string | number, payload: { field: string; value?: string | null }, ) => Promise; }) { const [rows, setRows] = useState([initialRow]); const weeklyIds = rowIdSet(rows); const sections = useMemo( () => composeBoardSections({ displayRows: rows, weekRows: rows, weeklyIds, queueIds: weeklyIds, }), [rows, weeklyIds], ); const tableData = baseTableData({ unassigned: sections.unassigned, unscheduled: sections.unscheduled, displayGroups: buildDayGroups(sections.scheduled), }); return ( ( )} renderInlineRow={() => null} />
{row.woNumber} { const ops = expandTablePatchToBoardFieldOps({ dispatcherId: id, dispatcherName: name, }); const patched = await patchBoardField(row.id, ops[0]!); setRows((current) => current.map((item) => String(item.id) === String(row.id) ? { ...patched, dispatcherId: id, dispatcherName: name } : item, ), ); }} />
); } describe("WoTableBody Unassigned queue (SH-165)", () => { it("renders Unassigned above Unscheduled and day groups without duplicate rows", () => { const datedUnassigned = makeRow({ id: "u-dated", woNumber: "24991" }); const undatedUnassigned = makeRow({ id: "us1", woNumber: "25021", scheduledOn: "", dayGroup: "", dayLabel: "", }); const undatedAssigned = makeRow({ id: "us-assigned", woNumber: "25022", dispatcherId: "sarah", dispatcherName: "Sarah", scheduledOn: "", dayGroup: "", dayLabel: "", }); const datedAssigned = makeRow({ id: "day-assigned", woNumber: "25023", dispatcherId: "sarah", dispatcherName: "Sarah", }); const tableData = baseTableData({ unassigned: [datedUnassigned, undatedUnassigned], unscheduled: [undatedAssigned], displayGroups: [ { key: "06/02", label: "TUE · 06/02", date: "2026-06-02", items: [datedAssigned], }, ], }); render( ( )} renderInlineRow={() => null} />
{row.woNumber}
, ); const unassignedHeader = screen.getByRole("button", { name: "Unassigned, 2 work orders, expanded", }); const unscheduledHeader = screen.getByRole("button", { name: "Unscheduled, 1 work order, expanded", }); const dayLabel = screen.getByText("TUE · 06/02"); expect(unassignedHeader.compareDocumentPosition(screen.getByTestId("row-u-dated"))).toBe( Node.DOCUMENT_POSITION_FOLLOWING, ); expect(unassignedHeader.compareDocumentPosition(unscheduledHeader)).toBe( Node.DOCUMENT_POSITION_FOLLOWING, ); expect(unscheduledHeader.compareDocumentPosition(dayLabel)).toBe( Node.DOCUMENT_POSITION_FOLLOWING, ); expect(screen.getByTestId("row-u-dated")).toBeInTheDocument(); expect(screen.getByTestId("row-us1")).toBeInTheDocument(); expect(screen.getByTestId("row-us-assigned")).toBeInTheDocument(); expect(screen.getByTestId("row-day-assigned")).toBeInTheDocument(); expect(screen.getAllByTestId(/row-/)).toHaveLength(4); }); it("collapses and expands the Unassigned section via the disclosure control", async () => { const user = userEvent.setup(); const setUnassignedOpen = vi.fn(); const tableData = baseTableData({ unassigned: [makeRow({ id: "u1", woNumber: "24991" })], setUnassignedOpen, }); render( ( )} renderInlineRow={() => null} />
{row.woNumber}
, ); await user.click(screen.getByRole("button", { name: "Unassigned, 1 work order, expanded" })); expect(setUnassignedOpen).toHaveBeenCalledWith(expect.any(Function)); }); it("renders a scheduled unassigned WO from outside the selected week in the pin", () => { const outOfWeek = makeRow({ id: "out-week", woNumber: "26001", scheduledOn: "2026-07-15", dayGroup: "07/15", dayLabel: "WED · 07/15", }); render( ( )} renderInlineRow={() => null} />
{row.woNumber}
, ); expect(screen.getByTestId("row-out-week")).toBeInTheDocument(); expect(screen.queryByText("WED · 07/15")).not.toBeInTheDocument(); }); it("keeps the Unassigned pin visible when the queue query fails", () => { render( ( )} renderInlineRow={() => null} />
{row.woNumber}
, ); expect(screen.getByText("queue unavailable")).toBeInTheDocument(); }); it("keeps the Unassigned section visible with an empty state when the queue is empty", () => { render( ( )} renderInlineRow={() => null} />
{row.woNumber}
, ); expect( screen.getByRole("button", { name: "Unassigned, 0 work orders, expanded" }), ).toBeInTheDocument(); expect(screen.getByText("No unassigned work orders.")).toBeInTheDocument(); expect(screen.queryByTestId(/row-/)).not.toBeInTheDocument(); }); it("removes a pinned row immediately after assigning through the board PATCH path", async () => { const user = userEvent.setup(); const pinned = makeRow({ id: "u-pin", woNumber: "24991", dispatcherId: "", dispatcherName: "", rowVersion: "AAAAAAA=", }); const patchBoardField = vi.fn(async (_id: string | number, payload: { field: string }) => { expect(payload.field).toBe("assignTo"); return { ...pinned, dispatcherId: DISPATCHER.id, dispatcherName: DISPATCHER.name }; }); render(); expect(screen.getByTestId("row-u-pin")).toBeInTheDocument(); await user.click(screen.getByRole("button", { name: /Select/ })); await user.click(screen.getByRole("button", { name: /Sarah Chen/ })); expect(patchBoardField).toHaveBeenCalled(); expect( screen.getByRole("button", { name: "Unassigned, 0 work orders, expanded" }), ).toBeInTheDocument(); expect(screen.getByText("No unassigned work orders.")).toBeInTheDocument(); expect(screen.getByTestId("row-u-pin")).toBeInTheDocument(); expect(screen.getByText("TUE · 06/02")).toBeInTheDocument(); }); });