mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-07 16:19:01 +00:00
fix(work-orders): search one-character WO numbers for duplicates
This commit is contained in:
parent
5f20fd5263
commit
4f0f70428f
2 changed files with 33 additions and 7 deletions
|
|
@ -193,13 +193,13 @@ export const workOrdersApi = {
|
||||||
|
|
||||||
findByWoNumber: async (woNumber: string): Promise<WorkOrderTableRow | undefined> => {
|
findByWoNumber: async (woNumber: string): Promise<WorkOrderTableRow | undefined> => {
|
||||||
const normalized = woNumber.trim();
|
const normalized = woNumber.trim();
|
||||||
// board/search contract: only send search when length >= 2.
|
// Search every non-empty WO# — backend advanced search accepts 1-character queries, and
|
||||||
const minLength = 2;
|
// wizard/create allow single-digit numbers (SH-189 must not bypass remote uniqueness).
|
||||||
// Safety cap — if hit before exhausting results, fail closed (do not treat as unique).
|
if (!normalized) {
|
||||||
const safetyMaxPages = 50;
|
|
||||||
if (normalized.length < minLength) {
|
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
// Safety cap — if hit before exhausting results, fail closed (do not treat as unique).
|
||||||
|
const safetyMaxPages = 50;
|
||||||
|
|
||||||
// `board/search` is fuzzy and paginated (0-based); exhaust pages for an exact WO#.
|
// `board/search` is fuzzy and paginated (0-based); exhaust pages for an exact WO#.
|
||||||
const pageSize = 100;
|
const pageSize = 100;
|
||||||
|
|
|
||||||
|
|
@ -364,12 +364,38 @@ describe("workOrdersApi.findByWoNumber", () => {
|
||||||
expect(result).toMatchObject({ id: 999, woNumber: "10000009999" });
|
expect(result).toMatchObject({ id: 999, woNumber: "10000009999" });
|
||||||
});
|
});
|
||||||
|
|
||||||
it("skips remote search for single-character WO numbers", async () => {
|
it("skips remote search for empty WO numbers", async () => {
|
||||||
const result = await workOrdersApi.findByWoNumber("1");
|
const result = await workOrdersApi.findByWoNumber(" ");
|
||||||
expect(apiGet).not.toHaveBeenCalled();
|
expect(apiGet).not.toHaveBeenCalled();
|
||||||
expect(result).toBeUndefined();
|
expect(result).toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("finds a one-character WO number duplicate outside loaded board rows", async () => {
|
||||||
|
apiGet.mockResolvedValue({
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
id: 7,
|
||||||
|
woNumber: "9",
|
||||||
|
lifecycleStatusLabel: "Incomplete",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
totalCount: 1,
|
||||||
|
page: 0,
|
||||||
|
pageSize: 100,
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = await workOrdersApi.findByWoNumber("9");
|
||||||
|
|
||||||
|
expect(apiGet).toHaveBeenCalledTimes(1);
|
||||||
|
const searchParams = apiGet.mock.calls[0]?.[1]?.searchParams as URLSearchParams;
|
||||||
|
expect(Object.fromEntries(searchParams)).toEqual({
|
||||||
|
search: "9",
|
||||||
|
page: "0",
|
||||||
|
pageSize: "100",
|
||||||
|
});
|
||||||
|
expect(result).toMatchObject({ id: 7, woNumber: "9" });
|
||||||
|
});
|
||||||
|
|
||||||
it("throws when the safety page limit is hit before exhausting results", async () => {
|
it("throws when the safety page limit is hit before exhausting results", async () => {
|
||||||
apiGet.mockResolvedValue({
|
apiGet.mockResolvedValue({
|
||||||
items: Array.from({ length: 100 }, (_, index) => ({
|
items: Array.from({ length: 100 }, (_, index) => ({
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue