From 0f261d6c16e686c3452085fa7b8f2f8217d05842 Mon Sep 17 00:00:00 2001 From: Alexandre Brandizzi Date: Thu, 23 Jul 2026 19:22:14 -0300 Subject: [PATCH] test(vendors): cover work order assignment flow --- e2e/vendors/vendor-operations.spec.ts | 83 +++++++++++++++++++ .../_components/work-order-form.tsx | 10 +-- 2 files changed, 86 insertions(+), 7 deletions(-) diff --git a/e2e/vendors/vendor-operations.spec.ts b/e2e/vendors/vendor-operations.spec.ts index efde75b5..1115fa07 100644 --- a/e2e/vendors/vendor-operations.spec.ts +++ b/e2e/vendors/vendor-operations.spec.ts @@ -187,4 +187,87 @@ test.describe("Vendor operations", () => { { vendorId: 7, trade: "Plumbing", sortOrder: 1 }, ]); }); + + test("creates a work order and assigns the selected technician with ETA", async ({ page }) => { + await authenticate(page); + let assignment: unknown; + + await page.route("**/api/Contact/GetLocations", (route) => + fulfillJson(route, { data: [{ Id: 10, Name: "St. Louis HQ" }] }), + ); + await page.route("**/api/Employee/Dropdown", (route) => fulfillJson(route, { data: [] })); + await page.route("**/api/DropdownOptions/ByCategory/**", (route) => + fulfillJson(route, { data: [] }), + ); + await page.route("**/api/vendor-operations/availability*", (route) => + fulfillJson(route, { + data: [ + { + id: 7, + companyName: "Gateway Plumbing", + contactName: "Taylor Tech", + availabilityStatus: "Available", + isPreferred: true, + conflicts: [], + }, + ], + }), + ); + await page.route("**/api/WorkOrder/AddWorkorder", (route) => + fulfillJson(route, { + data: { + Id: 900, + WorkerOrderTitle: "Boiler repair", + LocationId: 10, + Priority: "Sev 1", + Status: "Open", + Comments: [], + AuditLog: [], + Dispatches: [], + }, + }), + ); + await page.route("**/api/vendor-operations/work-orders/900/assignment", async (route) => { + assignment = route.request().postDataJSON(); + await fulfillJson(route, {}); + }); + await page.route("**/api/WorkOrder/GetWorkorderById*", (route) => + fulfillJson(route, { + data: { + Id: 900, + WorkerOrderTitle: "Boiler repair", + LocationId: 10, + Priority: "Sev 1", + Status: "Open", + Comments: [], + AuditLog: [], + Dispatches: [], + }, + }), + ); + + await page.goto("/workorders/new"); + await page.getByLabel("Title").fill("Boiler repair"); + await page.getByLabel("Location").click(); + await page.getByRole("option", { name: "St. Louis HQ" }).click(); + await page.getByLabel("Priority").click(); + await page.getByRole("option", { name: "Sev 1" }).click(); + await page.getByLabel("Scheduled").fill("2026-07-25"); + await page.getByLabel("Company + Technician").click(); + await page.getByRole("option", { name: /Gateway Plumbing ยท Taylor Tech/ }).click(); + await page.getByLabel("Assignment ETA").fill("2026-07-25T08:30"); + await page.getByLabel("Manual ETA override").check(); + await page.getByRole("button", { name: "Create" }).click(); + + await expect + .poll(() => assignment) + .toEqual({ + vendorId: 7, + scheduledStart: "2026-07-25T12:00:00.000Z", + scheduledEnd: "2026-07-25T14:00:00.000Z", + estimatedArrivalAt: "2026-07-25T11:30:00.000Z", + etaManualOverride: true, + }); + await expect(page).toHaveURL(/\/workorders\/900$/); + }); }); diff --git a/src/app/(protected)/workorders/_components/work-order-form.tsx b/src/app/(protected)/workorders/_components/work-order-form.tsx index 11520328..d179115c 100644 --- a/src/app/(protected)/workorders/_components/work-order-form.tsx +++ b/src/app/(protected)/workorders/_components/work-order-form.tsx @@ -116,8 +116,8 @@ export default function WorkOrderFormPage() { const isSaving = saveMutation.isPending; const isLoading = isEdit && isLoadingDetail; - const onSubmit = async (values: WorkOrderFormSchemaValues) => { - await saveMutation.mutateAsync({ + const onSubmit = (values: WorkOrderFormSchemaValues) => { + saveMutation.mutate({ workOrderId: isEdit ? id : undefined, values, vendorAssignment: @@ -179,11 +179,7 @@ export default function WorkOrderFormPage() { {isEdit ? `Edit Work Order ${detail?.internalWONumber ?? id}` : "Create a Work Order"} - void onSubmit(values))} - className="flex flex-col gap-8" - > + Work Order Details