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