shoc-frontend-new/src/test/app/(protected)/workorders/editable-wo-number-cell-sh-placeholder.test.tsx

105 lines
3.4 KiB
TypeScript

import { fireEvent, screen, waitFor } from "@testing-library/react";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { toast } from "react-toastify";
import { EditableWONumberCell } from "@/app/(protected)/workorders/_components/list/table/cells/editable-wo-number-cell";
import { workOrdersApi } from "@/domain/work-orders/api/work-orders-api";
import { renderWithProviders } from "@/test/test-utils";
vi.mock("react-toastify", () => {
const toastFn = Object.assign(vi.fn(), { error: vi.fn(), success: vi.fn() });
return { toast: toastFn };
});
vi.mock("@/domain/work-orders/api/work-orders-api", () => ({
workOrdersApi: { findByWoNumber: vi.fn() },
}));
function renderCell(value: string, currentId: string | number) {
const onSave = vi.fn();
renderWithProviders(
<EditableWONumberCell
value={value}
rescheduleCount={0}
currentId={currentId}
allOrders={[]}
onSave={onSave}
/>,
);
return onSave;
}
function typeAndCommit(nextValue: string) {
fireEvent.click(screen.getByText(/./, { selector: "span" }));
const input = screen.getByLabelText("Work order number");
fireEvent.change(input, { target: { value: nextValue } });
fireEvent.keyDown(input, { key: "Enter" });
}
describe("EditableWONumberCell SH placeholder numbers (SH-320)", () => {
beforeEach(() => {
vi.mocked(workOrdersApi.findByWoNumber).mockResolvedValue(null as never);
vi.mocked(toast).mockClear();
vi.mocked(toast.error).mockClear();
});
it("saves a freshly typed SH number on a brand-new inline work order", async () => {
const onSave = renderCell("", "draft");
typeAndCommit("SH00001");
await waitFor(() => expect(onSave).toHaveBeenCalledWith("SH00001"));
expect(toast).not.toHaveBeenCalled();
expect(toast.error).not.toHaveBeenCalled();
});
it("keeps a typed SH prefix instead of stripping it to digits", () => {
renderCell("", "draft");
fireEvent.click(screen.getByText("-"));
const input = screen.getByLabelText("Work order number");
fireEvent.change(input, { target: { value: "sh00001" } });
expect(input).toHaveValue("SH00001");
});
it("does not treat an unsaved inline draft number as a real number to protect", async () => {
const onSave = renderCell("12345678901", "draft");
typeAndCommit("SH00002");
await waitFor(() => expect(onSave).toHaveBeenCalledWith("SH00002"));
});
it("blocks replacing a saved real APM number with an SH number", async () => {
const onSave = renderCell("12345678901", 42);
typeAndCommit("SH00001");
await waitFor(() =>
expect(toast.error).toHaveBeenCalledWith(
"Cannot replace an APM work order number with an internal number",
),
);
expect(onSave).not.toHaveBeenCalled();
expect(screen.getByText("12345678901")).toBeInTheDocument();
});
it("lets a saved SH number be replaced by a real 11-digit number", async () => {
const onSave = renderCell("SH00001", 42);
typeAndCommit("12345678901");
await waitFor(() => expect(onSave).toHaveBeenCalledWith("12345678901"));
});
it("still rejects a numeric number that is not 11 digits", () => {
const onSave = renderCell("", "draft");
typeAndCommit("12345");
expect(toast).toHaveBeenCalledWith(
"Work order number must be 11 digits or an SH number (e.g. SH00001)",
);
expect(onSave).not.toHaveBeenCalled();
});
});