mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-04 17:12:06 +00:00
Extras treated a persisted false as authoritative, so unsaved Aveta toggles never reached the overlay. Refresh the filters visual baseline for the Aveta Compliance section.
117 lines
3.3 KiB
TypeScript
117 lines
3.3 KiB
TypeScript
import { screen } from "@testing-library/react";
|
|
import { describe, expect, it, vi } from "vitest";
|
|
import { WorkOrderSlideOverTabs } from "@/app/(protected)/workorders/_components/detail/work-order-slide-over-tabs";
|
|
import type { useWorkOrderSlideOver } from "@/app/(protected)/workorders/_components/detail/use-work-order-slide-over";
|
|
import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row";
|
|
import { renderWithProviders } from "@/test/test-utils";
|
|
|
|
type SlideOverState = ReturnType<typeof useWorkOrderSlideOver>;
|
|
|
|
function baseRow(overrides: Partial<WorkOrderTableRow> = {}): WorkOrderTableRow {
|
|
return {
|
|
id: 42,
|
|
woNumber: "WO-42",
|
|
site: "SEA1",
|
|
type: "PM",
|
|
severity: null,
|
|
dispatcherId: "u1",
|
|
dispatcherName: "Dispatcher",
|
|
scheduledOn: "2026-07-20",
|
|
completedDate: "",
|
|
targetWeek: "",
|
|
dayGroup: "07/20",
|
|
dayLabel: "Mon",
|
|
location: "Seattle",
|
|
locationId: "loc-1",
|
|
pm: "HVAC",
|
|
serviceNotes: "",
|
|
extraServices: [],
|
|
company: "Vendor Co",
|
|
tech: "Tech",
|
|
techPhone: "",
|
|
vendorId: "v1",
|
|
apptStart: "",
|
|
apptEnd: "",
|
|
apptTime: "",
|
|
status: "Scheduled",
|
|
docStatus: "No",
|
|
pocName: "",
|
|
pocPhone: "",
|
|
pocNotes: "",
|
|
additionalContacts: [],
|
|
dueDate: "",
|
|
rescheduleCount: 0,
|
|
carriedOver: 0,
|
|
originalWeek: "",
|
|
originalDate: "",
|
|
isPastDue: false,
|
|
scheduleWeekOnly: false,
|
|
mediaCount: 0,
|
|
title: "PM — SEA1",
|
|
priority: "Sev 3",
|
|
primaryDispatchId: null,
|
|
rowVersion: "v1",
|
|
dispatchRowVersion: "",
|
|
flagColor: null,
|
|
isAddOn: false,
|
|
avetaRequired: false,
|
|
upliftSummary: { hasUplift: false, pendingCount: 0 },
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
function extrasState(editing: boolean, persisted: boolean, draft: boolean): SlideOverState {
|
|
return {
|
|
error: null,
|
|
detailForRow: undefined,
|
|
isLoading: false,
|
|
infoSource: baseRow({ avetaRequired: persisted }),
|
|
activeDraft: baseRow({ avetaRequired: draft }),
|
|
showDetailSkeleton: false,
|
|
errorMessage: "",
|
|
refetch: vi.fn(),
|
|
extrasUploads: [],
|
|
isExtrasReadOnly: true,
|
|
mediaPending: false,
|
|
uploadExtraFiles: vi.fn(),
|
|
removeMedia: vi.fn(),
|
|
editing,
|
|
} as unknown as SlideOverState;
|
|
}
|
|
|
|
function renderExtras(state: SlideOverState) {
|
|
return renderWithProviders(
|
|
<WorkOrderSlideOverTabs
|
|
tab="extras"
|
|
state={state}
|
|
users={[]}
|
|
sites={[]}
|
|
vendors={[]}
|
|
pmTypes={[]}
|
|
allOrders={[]}
|
|
onOpenCompletionDoc={vi.fn()}
|
|
/>,
|
|
);
|
|
}
|
|
|
|
describe("WorkOrderSlideOverTabs Extras Aveta draft", () => {
|
|
it("shows the Extras Aveta indicator from an unsaved false-to-true draft", () => {
|
|
renderExtras(extrasState(true, false, true));
|
|
|
|
expect(screen.getByText("Extra Documents")).toBeInTheDocument();
|
|
expect(screen.getByText("Aveta")).toBeInTheDocument();
|
|
});
|
|
|
|
it("hides the Extras Aveta indicator from an unsaved true-to-false draft", () => {
|
|
renderExtras(extrasState(true, true, false));
|
|
|
|
expect(screen.getByText("Extra Documents")).toBeInTheDocument();
|
|
expect(screen.queryByText("Aveta")).not.toBeInTheDocument();
|
|
});
|
|
|
|
it("keeps the persisted Aveta indicator when not editing", () => {
|
|
renderExtras(extrasState(false, true, false));
|
|
|
|
expect(screen.getByText("Aveta")).toBeInTheDocument();
|
|
});
|
|
});
|