shoc-frontend-new/src/test/app/(protected)/workorders/slide-over-schedule-range.test.tsx
Arthur Bassi c71d9482ec feat(work-orders): align Schedule On clear with shared demotion path
Board Clear uses empty-week patch; slide-over Save derives Pending via mergeAutoSchedulePatch.
2026-09-09 15:44:49 -03:00

166 lines
4.9 KiB
TypeScript

import { fireEvent, screen } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { SlideOverInfoTabEditView } from "@/app/(protected)/workorders/_components/detail/tabs/slide-over-info-tab-edit-view";
import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row";
import { pad2, todayIso } from "@/domain/work-orders/utils/wizard-date-utils";
import { renderWithProviders } from "@/test/test-utils";
vi.mock("@/app/(protected)/workorders/_components/list/table/cells/site-cell", () => ({
SiteCell: () => null,
}));
vi.mock(
"@/app/(protected)/workorders/_components/list/table/cells/editable-wo-number-cell",
() => ({
EditableWONumberCell: () => null,
}),
);
vi.mock("@/app/(protected)/workorders/_components/list/table/cells/type-cell", () => ({
TypeCell: () => null,
}));
vi.mock("@/app/(protected)/workorders/_components/list/table/cells/assigned-to-cell", () => ({
AssignedToCell: () => null,
}));
vi.mock("@/app/(protected)/workorders/_components/list/table/cells/appt-time-cell", () => ({
ApptTimeCell: () => null,
}));
vi.mock("@/app/(protected)/workorders/_components/list/table/cells/pm-type-cell", () => ({
PMTypeCell: () => null,
}));
vi.mock("@/app/(protected)/workorders/_components/list/table/cells/vendor-cell", () => ({
VendorCell: () => null,
}));
vi.mock("@/app/(protected)/workorders/_components/list/table/cells/status-cell", () => ({
StatusCell: () => null,
}));
function currentMonthIso(day: number): string {
const [y, m] = todayIso().split("-").map(Number);
return `${y}-${pad2(m)}-${pad2(day)}`;
}
function baseRow(overrides: Partial<WorkOrderTableRow> = {}): WorkOrderTableRow {
return {
id: 42,
woNumber: "WO-42",
site: "SEA1",
type: "PM",
severity: null,
dispatcherId: "u1",
dispatcherName: "Dispatcher",
scheduledOn: "",
completedDate: "",
targetWeek: "",
dayGroup: "",
dayLabel: "",
location: "Seattle",
locationId: "loc-1",
pm: "HVAC",
serviceNotes: "",
extraServices: [],
company: "Vendor Co",
tech: "Tech",
techPhone: "",
vendorId: "v1",
apptStart: "",
apptEnd: "",
apptTime: "",
status: "Incomplete",
docStatus: "No",
pocName: "",
pocPhone: "",
pocNotes: "",
additionalContacts: [],
dueDate: "",
rescheduleCount: 0,
carriedOver: 0,
isAddOn: false,
originalWeek: "",
originalDate: "",
isPastDue: false,
scheduleWeekOnly: false,
mediaCount: 0,
title: "",
priority: "",
primaryDispatchId: null,
rowVersion: "v1",
dispatchRowVersion: "",
flagColor: null,
...overrides,
};
}
describe("SlideOverInfoTabEditView — Schedule On range", () => {
it("patches range start/end and schedMode from the DateCell", async () => {
const onDraftChange = vi.fn();
renderWithProviders(
<SlideOverInfoTabEditView
draft={baseRow()}
users={[]}
sites={[]}
vendors={[]}
pmTypes={[]}
allOrders={[]}
onDraftChange={onDraftChange}
/>,
);
const scheduleRow = screen.getByText("Schedule On").closest("div");
fireEvent.click(scheduleRow!.querySelector("button")!);
fireEvent.click(await screen.findByRole("button", { name: "Range" }));
fireEvent.click(screen.getByRole("button", { name: "5" }));
fireEvent.click(screen.getByRole("button", { name: "20" }));
fireEvent.click(screen.getByRole("button", { name: /^done$/i }));
expect(onDraftChange).toHaveBeenCalledWith(
expect.objectContaining({
scheduledOn: currentMonthIso(5),
scheduleEnd: currentMonthIso(20),
schedMode: "range",
scheduleWeekOnly: false,
targetWeek: "",
}),
);
}, 10_000);
it("clears every schedule field in the draft", async () => {
const onDraftChange = vi.fn();
renderWithProviders(
<SlideOverInfoTabEditView
draft={baseRow({
scheduledOn: currentMonthIso(5),
scheduleEnd: currentMonthIso(20),
schedMode: "range",
scheduleWeekOnly: false,
targetWeek: currentMonthIso(1),
dayGroup: "09/05",
dayLabel: "Sat",
isPastDue: true,
status: "Scheduled",
})}
users={[]}
sites={[]}
vendors={[]}
pmTypes={[]}
allOrders={[]}
onDraftChange={onDraftChange}
/>,
);
const scheduleRow = screen.getByText("Schedule On").closest("div");
fireEvent.click(scheduleRow!.querySelector("button")!);
fireEvent.click(await screen.findByRole("button", { name: /clear/i }));
expect(onDraftChange).toHaveBeenCalledWith(
expect.objectContaining({
scheduledOn: "",
scheduleWeekOnly: false,
targetWeek: "",
scheduleEnd: "",
schedMode: undefined,
dayGroup: "",
dayLabel: "",
isPastDue: false,
}),
);
});
});