From 8384d9a237000d5d371e69317b54697aa34b79e8 Mon Sep 17 00:00:00 2001 From: scottkiener-at-safelite Date: Tue, 7 Jul 2026 13:10:06 -0400 Subject: [PATCH] CASH-2916 | Update unit tests --- src/layouts/scheduling/scheduling.spec.js | 65 ++++++++++++++++++++++ src/store/store.spec.js | 66 +++++++++++++++++++++++ 2 files changed, 131 insertions(+) diff --git a/src/layouts/scheduling/scheduling.spec.js b/src/layouts/scheduling/scheduling.spec.js index 788c93281..001c22746 100644 --- a/src/layouts/scheduling/scheduling.spec.js +++ b/src/layouts/scheduling/scheduling.spec.js @@ -2,6 +2,7 @@ import { shallowMount } from "@vue/test-utils"; import scheduling from "./scheduling"; import { getMountOptions } from "@/helpers/unit-test-helper.js"; import { settleAllPromises } from "@/helpers/layout-helper"; +import store from "@/store"; jest.mock("@/store", () => ({ dispatch: jest.fn().mockResolvedValue(null), @@ -107,5 +108,69 @@ describe("scheduling.vue", () => { await expect(wrapper.vm.handleRequestMoreDates()).resolves.toBeUndefined(); wrapper.unmount(); }); + + test("batches inshop provider requests into a single getShopTimeSlotsV2 call", async () => { + store.dispatch.mockClear(); + settleAllPromises.mockResolvedValueOnce({ + inshopTimeSlots: { + providerTimeSlots: [ + { providerNumber: "05018", days: [{ date: "2026-07-22", timeSlots: [] }] }, + { providerNumber: "05019", days: [{ date: "2026-07-22", timeSlots: [] }] }, + ], + }, + }); + + const { wrapper } = setupMocks(); + wrapper.vm.inShopProvidersAndTimeslots = [ + { provider: { providerNumber: "05018" }, timeSlots: { days: [] } }, + { provider: { providerNumber: "05019" }, timeSlots: { days: [] } }, + ]; + wrapper.vm.datePickerEndDate = "2026-07-21"; + + await wrapper.vm.handleRequestMoreDates(); + + const shopTimeSlotDispatches = store.dispatch.mock.calls.filter( + ([actionName]) => actionName === "getShopTimeSlotsV2" + ); + expect(shopTimeSlotDispatches).toHaveLength(1); + expect(shopTimeSlotDispatches[0][1].payload.providerNumbers).toEqual(["05018", "05019"]); + expect(shopTimeSlotDispatches[0][1].payload.endDate).toBeDefined(); + wrapper.unmount(); + }); + + test("maps batched inshop providerTimeSlots back onto provider entries", async () => { + settleAllPromises.mockResolvedValueOnce({ + inshopTimeSlots: { + providerTimeSlots: [ + { + providerNumber: "05018", + days: [{ date: "2026-07-22", timeSlots: [{ id: "slot-a" }] }], + }, + { + providerNumber: "05019", + days: [{ date: "2026-07-22", timeSlots: [{ id: "slot-b" }] }], + }, + ], + }, + }); + + const { wrapper } = setupMocks(); + wrapper.vm.inShopProvidersAndTimeslots = [ + { provider: { providerNumber: "05018" }, timeSlots: { days: [] } }, + { provider: { providerNumber: "05019" }, timeSlots: { days: [] } }, + ]; + wrapper.vm.datePickerEndDate = "2026-07-21"; + + await wrapper.vm.handleRequestMoreDates(); + + expect(wrapper.vm.inShopProvidersAndTimeslots[0].timeSlots.days).toHaveLength(1); + expect(wrapper.vm.inShopProvidersAndTimeslots[0].timeSlots.days[0].timeSlots[0].id).toBe( + "slot-a" + ); + expect(wrapper.vm.inShopProvidersAndTimeslots[1].timeSlots.days[0].timeSlots[0].id).toBe( + "slot-b" + ); + wrapper.unmount(); + }); }); }); diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 860b81718..1753ed621 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -3,6 +3,7 @@ import store from "@/store"; import { mutations, state, actions, getters } from "@/store"; import { storeMutations } from "@/constants/store-mutations"; import { storeActions } from "@/constants/store-actions"; +import { endpoints } from "@/constants/endpoints.js"; import { sessionStorageKeyConstants } from "@/constants/session-storage"; import { experimentTriggers } from "@/constants/experiments"; import { routeData } from "@/router/constants/routes"; @@ -3631,6 +3632,71 @@ describe("Actions", () => { ); }); }); + + describe("v2 time slot actions", () => { + const buildTimeSlotContext = () => ({ + state, + getters: { + payment: { billToAccountNumber: "87291" }, + }, + }); + + it("getShopTimeSlotsV2 calls v2 shop endpoint with providerNumbers and endDate", async () => { + const context = buildTimeSlotContext(); + + globalMethods.callHttpClient.mockResolvedValue({ data: { providerTimeSlots: [] } }); + + await actions.getShopTimeSlotsV2(context, { + payload: { + startDate: "2026-07-07", + endDate: "2026-07-21", + shopAppointmentType: "InshopOrDropoff", + providerNumbers: ["05018", "05019"], + }, + pageNameToLog: "scheduling", + }); + + expect(globalMethods.callHttpClient).toHaveBeenCalledWith( + expect.objectContaining({ + method: endpoints.GetShopTimeSlotsV2.method, + endpoint: endpoints.GetShopTimeSlotsV2.url, + payload: expect.objectContaining({ + startDate: "2026-07-07", + endDate: "2026-07-21", + providerNumbers: ["05018", "05019"], + shopAppointmentType: "InshopOrDropoff", + }), + }) + ); + }); + + it("getMobileTimeSlotsV2 calls v2 mobile endpoint with endDate", async () => { + const context = buildTimeSlotContext(); + + globalMethods.callHttpClient.mockResolvedValue({ data: { days: [] } }); + + await actions.getMobileTimeSlotsV2(context, { + payload: { + startDate: "2026-07-07", + endDate: "2026-07-21", + zipCode: "43235", + }, + pageNameToLog: "scheduling", + }); + + expect(globalMethods.callHttpClient).toHaveBeenCalledWith( + expect.objectContaining({ + method: endpoints.GetMobileTimeSlotsV2.method, + endpoint: endpoints.GetMobileTimeSlotsV2.url, + payload: expect.objectContaining({ + startDate: "2026-07-07", + endDate: "2026-07-21", + zipCode: "43235", + }), + }) + ); + }); + }); }); describe("submittedStateRevision", () => {