mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-07 16:19:01 +00:00
118 lines
3.3 KiB
TypeScript
118 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();
|
||
|
|
});
|
||
|
|
});
|