test(vendors): e2e asserts additive PATCH and no destructive PUT from add flow (SH-250, SH-246)

This commit is contained in:
Codex Review Integration 2026-08-18 13:13:04 -03:00
parent a710e21281
commit 4d1f02b87d

View file

@ -65,6 +65,8 @@ interface MockState {
listUrls: string[]; listUrls: string[];
createdBody?: Record<string, unknown>; createdBody?: Record<string, unknown>;
updatedBody?: Record<string, unknown>; updatedBody?: Record<string, unknown>;
patchedBody?: Record<string, unknown>;
patchedCompanyId?: string;
deletedId?: string; deletedId?: string;
} }
@ -175,6 +177,52 @@ async function mockVendorApi(
return; return;
} }
if (request.method() === "PATCH" && pathCompanyId) {
state.patchedBody = request.postDataJSON();
state.patchedCompanyId = pathCompanyId;
const anchor = vendorRecords.find((vendor) => String(vendor.CompanyId) === pathCompanyId);
if (!anchor) {
await fulfillJson(route, { message: "Vendor roster not found" }, 404);
return;
}
const added = Array.isArray(state.patchedBody.addTechnicians)
? (state.patchedBody.addTechnicians as Array<Record<string, unknown>>)
: [];
await fulfillJson(route, {
companyId: anchor.CompanyId,
rowVersion: "rv-patched",
name: anchor.CompanyName,
companyPhone: anchor.CompanyPhone,
email: anchor.Email,
address: anchor.Address,
city: anchor.City,
state: anchor.State,
zip: anchor.Zip,
googleMapsUrl: anchor.GoogleMapsUrl,
notes: anchor.Notes,
technicians: [
...vendorRecords
.filter((vendor) => vendor.CompanyId === anchor.CompanyId)
.map((vendor) => ({
id: vendor.Id,
contactName: vendor.ContactName,
phone: vendor.Phone,
email: vendor.Email,
preferredContact: vendor.PreferredContact ?? "Phone",
tradeSpecialties: vendor.TradeSpecialties,
isActive: vendor.IsActive,
totalJobs: vendor.TotalJobs,
})),
...added.map((technician, index) => ({
id: 900 + index,
totalJobs: 0,
...technician,
})),
],
});
return;
}
if (request.method() === "PUT" && pathCompanyId) { if (request.method() === "PUT" && pathCompanyId) {
state.updatedBody = request.postDataJSON(); state.updatedBody = request.postDataJSON();
const technicians = Array.isArray(state.updatedBody.technicians) const technicians = Array.isArray(state.updatedBody.technicians)
@ -409,6 +457,11 @@ test.describe("Vendor directory prototype parity", () => {
"https://maps.google.com/gateway", "https://maps.google.com/gateway",
); );
await expect(page.getByLabel("Preferred Contact")).toHaveCount(0); await expect(page.getByLabel("Preferred Contact")).toHaveCount(0);
await expect(page.getByLabel("Technician name (optional)")).toHaveCount(1);
await expect(page.getByLabel("Technician name (optional)")).toHaveValue("");
await expect(
page.getByRole("dialog", { name: /Add Vendor/ }).getByText("Adam Whyte"),
).toHaveCount(0);
await page.getByRole("button", { name: "Add technician" }).click(); await page.getByRole("button", { name: "Add technician" }).click();
await page.getByLabel("Technician name (optional)").last().fill("New Technician"); await page.getByLabel("Technician name (optional)").last().fill("New Technician");
const tradeInput = page.getByRole("combobox", { name: "Add Trade" }).last(); const tradeInput = page.getByRole("combobox", { name: "Add Trade" }).last();
@ -420,27 +473,26 @@ test.describe("Vendor directory prototype parity", () => {
await page.getByLabel("Notes (optional)").fill("Created in browser E2E"); await page.getByLabel("Notes (optional)").fill("Created in browser E2E");
await page.getByRole("button", { name: "Add Vendor", exact: true }).last().click(); await page.getByRole("button", { name: "Add Vendor", exact: true }).last().click();
await expect(page.getByRole("dialog", { name: /Add Vendor/ })).toHaveCount(0); await expect(page.getByRole("dialog", { name: /Add Vendor/ })).toHaveCount(0);
expect(state.updatedBody).toMatchObject({ expect(state.patchedCompanyId).toBe("101");
name: "Gateway Plumbing", expect(state.patchedBody).toMatchObject({ rowVersion: "rv-1" });
companyPhone: "(314) 555-0100", expect(state.patchedBody?.companyFields).toEqual({ notes: "Created in browser E2E" });
notes: "Created in browser E2E", expect(state.patchedBody?.addTechnicians).toEqual([
rowVersion: "rv-1", expect.objectContaining({
}); contactName: "New Technician",
expect(state.updatedBody?.technicians).toEqual( tradeSpecialties: "Plumbing, HVAC",
expect.arrayContaining([ }),
expect.objectContaining({ ]);
contactName: "New Technician", const patchedTechnicians = Array.isArray(state.patchedBody?.addTechnicians)
tradeSpecialties: "Plumbing, HVAC", ? (state.patchedBody.addTechnicians as Array<Record<string, unknown>>)
}),
]),
);
const submittedTechnicians = Array.isArray(state.updatedBody?.technicians)
? (state.updatedBody.technicians as Array<Record<string, unknown>>)
: []; : [];
const newTechnician = submittedTechnicians.find( const newTechnician = patchedTechnicians.find(
(technician) => technician.contactName === "New Technician", (technician) => technician.contactName === "New Technician",
); );
expect(newTechnician?.preferredContact).toBeUndefined(); expect(newTechnician?.preferredContact).toBeUndefined();
expect(patchedTechnicians.some((technician) => technician.contactName === "Adam Whyte")).toBe(
false,
);
expect(state.updatedBody).toBeUndefined();
await page.getByRole("button", { name: "View vendor Gateway Plumbing" }).click(); await page.getByRole("button", { name: "View vendor Gateway Plumbing" }).click();
const detailDrawer = page.locator(".MuiDrawer-paper").last(); const detailDrawer = page.locator(".MuiDrawer-paper").last();