From 36b8ed0ac1c8f2ad8fc708786400ffef56d24e1e Mon Sep 17 00:00:00 2001 From: AdamCaouetteSafelite Date: Fri, 24 Oct 2025 16:11:05 -0400 Subject: [PATCH 1/9] CASH-1712: rename for clarity --- src/layouts/schedule/schedule.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 716c819e2..81d4315b6 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -624,7 +624,7 @@ export default { vm.showPricingByDay = showPricingByDay; vm.preSelectedDate = preSelectedDate; vm.appointmentType = appointmentType; - vm.setData( + vm.setDataOnLoad( resultMap.zipCodeData, resultMap.serviceabilityDetails, resultMap.mobileFeePart, @@ -966,7 +966,7 @@ export default { } }, - setData(zipCodeData, serviceabilityDetails, mobileFeePart, shopProviderData) { + setDataOnLoad(zipCodeData, serviceabilityDetails, mobileFeePart, shopProviderData) { if (zipCodeData) { this.zipContainsMilitaryBase = zipCodeData.containsMilitaryBase; this.zipCodeCtu = zipCodeData.zipCodeCtu; From 4405c1c3f0323ca01ef0c76c13ee221c0ebc6287 Mon Sep 17 00:00:00 2001 From: AdamCaouetteSafelite Date: Fri, 24 Oct 2025 16:18:11 -0400 Subject: [PATCH 2/9] CASH-1712 - restrict showAnotherMonth logic to be more specific to avoid loading next month if only one appointment type is available --- src/layouts/schedule/schedule.vue | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 81d4315b6..c5c697d35 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -1217,6 +1217,8 @@ export default { async initializeDatePicker() { this.selectedDate = null; + const includeMobileTimeSlots = this.isServiceableMobile; + const includeInshopTimeSlots = this.isServiceableInshop || this.isServiceableDropoff; const datePickerInitialData = await this.$refs.datePicker.loadInitialData({ // setup config options for date-picker selectableDatesSetting: "custom", @@ -1225,8 +1227,8 @@ export default { preSelectedDate: this.preSelectedDate, providerNumber: this.selectedProvider?.providerNumber, zipCode: this.zipCode, - includeMobileTimeSlots: this.isServiceableMobile, - includeInshopTimeSlots: this.isServiceableInshop || this.isServiceableDropoff, + includeMobileTimeSlots: includeMobileTimeSlots, + includeInshopTimeSlots: includeInshopTimeSlots, }); datePickerInitialData.pricingByDayBasePrice = this.pricingByDayBasePrice; datePickerInitialData.pricingByDayUpcharge = this.pricingByDayUpcharge; @@ -1242,8 +1244,8 @@ export default { } else { // if no date is preselected on load, make sure there are some dates available if ( - this.selectableDatesInshop.days.length < 1 || - this.selectableDatesMobile.days.length < 1 + (includeInshopTimeSlots && this.selectableDatesInshop.days.length < 1) || + (includeMobileTimeSlots && this.selectableDatesMobile.days.length < 1) ) { await this.$nextTick(); await this.$refs.datePicker.showAnotherMonth(); From 55d0ae9a7e2ec3ce78d0d096c01af7679b3bd1ae Mon Sep 17 00:00:00 2001 From: AdamCaouetteSafelite Date: Fri, 24 Oct 2025 16:22:17 -0400 Subject: [PATCH 3/9] CASH-1712 - attempt to prevent repetitive api calls and initDatePicker when toggling appt types --- src/layouts/schedule/schedule.vue | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index c5c697d35..e882a2652 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -1743,7 +1743,6 @@ export default { this.lastSelectedInshopOrDropoffProvider = this.selectedProvider; } this.appointmentType = AppointmentTypeStrings.MOBILE; - this.updateSelectedProvider(); } else if (newAppointmentType) { if (this.appointmentType != AppointmentTypeStrings.MOBILE) { // Clear last shop selected if appointment type was changed in any manner other than from Mobile @@ -1757,9 +1756,6 @@ export default { } else { this.appointmentType = AppointmentTypeStrings.IN_SHOP_OR_DROP_OFF; } - - // make sure a selectedProvider exists - this.updateSelectedProvider(this.lastSelectedInshopOrDropoffProvider); } else { this.appointmentType = null; } From e693f9e449f42e29639be073701d292031cc3f12 Mon Sep 17 00:00:00 2001 From: AdamCaouetteSafelite Date: Tue, 28 Oct 2025 15:52:07 -0400 Subject: [PATCH 4/9] CASH-1712: more precise approach to fixing forced refresh of date picker --- src/layouts/schedule/schedule.vue | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index e882a2652..a670d7c5d 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -1669,15 +1669,10 @@ export default { this.selectedProvider = new Provider(); this.updateSelectedProvider(); }, - updateSelectedProvider(newProvider) { - if (newProvider) { - const didProviderNumberChange = - this.selectedProvider.providerNumber !== newProvider.providerNumber; - this.selectedProvider = newProvider; + updateSelectedProvider(newShopProvider) { - if (didProviderNumberChange) { - this.initializeDatePicker(); - } + if (newShopProvider) { + this.selectedProvider = newShopProvider; } else if (this.appointmentType === this.appointmentTypeStrings.MOBILE) { this.selectedProvider = { providerNumber: this.shopProviderData.mobileProviderNumber.toString(), @@ -1743,6 +1738,7 @@ export default { this.lastSelectedInshopOrDropoffProvider = this.selectedProvider; } this.appointmentType = AppointmentTypeStrings.MOBILE; + this.updateSelectedProvider(); } else if (newAppointmentType) { if (this.appointmentType != AppointmentTypeStrings.MOBILE) { // Clear last shop selected if appointment type was changed in any manner other than from Mobile @@ -1756,6 +1752,8 @@ export default { } else { this.appointmentType = AppointmentTypeStrings.IN_SHOP_OR_DROP_OFF; } + // make sure a selectedProvider exists + this.updateSelectedProvider(this.lastSelectedInshopOrDropoffProvider); } else { this.appointmentType = null; } From cdeede1ed68124b059aa5288e6ad55fc8de63d82 Mon Sep 17 00:00:00 2001 From: AdamCaouetteSafelite Date: Tue, 28 Oct 2025 16:05:50 -0400 Subject: [PATCH 5/9] CASH-1712: missed save for merge conflict; committing conflict resolve --- src/layouts/schedule/schedule.vue | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 1690d831d..106602bdd 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -579,13 +579,8 @@ export default { vm.showPricingByDay = false; // Pricing By Day is not used in this version vm.preSelectedDate = preSelectedDate; vm.appointmentType = appointmentType; -<<<<<<< HEAD vm.setDataOnLoad( resultMap.zipCodeData, -======= - vm.setData( - zipCodeData, ->>>>>>> release/2025.11.06 resultMap.serviceabilityDetails, pricedMobileFeePart, shopProviderData.data @@ -1630,7 +1625,6 @@ export default { this.updateSelectedProvider(); }, updateSelectedProvider(newShopProvider) { - if (newShopProvider) { this.selectedProvider = newShopProvider; } else if (this.appointmentType === this.appointmentTypeStrings.MOBILE) { From c32494309ccd95a2db524424e0593413e8a19486 Mon Sep 17 00:00:00 2001 From: AdamCaouetteSafelite Date: Tue, 28 Oct 2025 17:41:27 -0400 Subject: [PATCH 6/9] CASH-1712: correct misunderstood use of zipCodeData var (not part of resultMap) --- src/layouts/schedule/schedule.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 106602bdd..8b275f924 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -580,7 +580,7 @@ export default { vm.preSelectedDate = preSelectedDate; vm.appointmentType = appointmentType; vm.setDataOnLoad( - resultMap.zipCodeData, + zipCodeData, resultMap.serviceabilityDetails, pricedMobileFeePart, shopProviderData.data From cf0816dca33757a5a1cf5f445d60e345d586b815 Mon Sep 17 00:00:00 2001 From: AdamCaouetteSafelite Date: Wed, 29 Oct 2025 09:23:08 -0400 Subject: [PATCH 7/9] CASH-1712: remove old obsolete files that never should've been committed --- src/layouts/schedule/schedule-june-2025.vue | 782 ------------------ src/layouts/schedule/schedule.specDISABLED.js | 616 -------------- 2 files changed, 1398 deletions(-) delete mode 100644 src/layouts/schedule/schedule-june-2025.vue delete mode 100644 src/layouts/schedule/schedule.specDISABLED.js diff --git a/src/layouts/schedule/schedule-june-2025.vue b/src/layouts/schedule/schedule-june-2025.vue deleted file mode 100644 index 0464b2914..000000000 --- a/src/layouts/schedule/schedule-june-2025.vue +++ /dev/null @@ -1,782 +0,0 @@ - - - - - - - - - - - diff --git a/src/layouts/schedule/schedule.specDISABLED.js b/src/layouts/schedule/schedule.specDISABLED.js deleted file mode 100644 index 9d25152c8..000000000 --- a/src/layouts/schedule/schedule.specDISABLED.js +++ /dev/null @@ -1,616 +0,0 @@ -// Components -import schedule from "@/layouts/schedule/schedule.vue"; - -// Supporting Files -import { shallowMount } from "@vue/test-utils"; -import { getMountOptions } from "@/helpers/unit-test-helper.js"; -import store from "@/store"; -import router from "@/router"; -import baseMixin from "../../mixins/base-mixin"; - -// Mock basemixin -jest.mock("@/mixins/base-mixin.js", () => ({ - methods: { - dispatchStoreAction: jest.fn().mockImplementation((storeAction) => { - if (storeAction === "getShopTimeSlots" || storeAction === "getMobileTimeSlots") { - return { - data: { - estimatedServiceMinutesMinimum: 90, - estimatedServiceMinutesMaximum: 120, - days: [ - { - date: "2023-12-01", - timeSlots: [ - { - id: "06747-01820-S-B*20424*7 AM", - startTime: "07:00", - endTime: "08:00", - offerPremium: false, - }, - ], - }, - ], - }, - }; - } - if (storeAction === "getMobilePremiumFee") { - return Promise.resolve({ - data: { - partNumber: "EARLY BIRD", - description: null, - partType: "EARLY BIRD", - laborAmount: 0, - sellingPrice: 14.99, - kitPrice: 0, - }, - }); - } - if (storeAction === "priceOrderItemsAndSaveServerData") { - return Promise.resolve([ - { - partNumber: "EARLY BIRD", - description: null, - partType: "EARLY BIRD", - laborAmount: 0, - sellingPrice: 14.99, - kitPrice: 0, - }, - ]); - } - if (storeAction === "saveSupportingItemsSuppressingStateResetting") { - return Promise.resolve([ - { - partNumber: "EARLY BIRD", - description: null, - partType: "EARLY BIRD", - laborAmount: 0, - sellingPrice: 14.99, - kitPrice: 0, - }, - ]); - } - }), - dispatchStoreActionWithLogging: jest.fn().mockImplementation((storeAction) => { - if (storeAction === "getShopTimeSlots" || storeAction === "getMobileTimeSlots") { - return { - data: { - estimatedServiceMinutesMinimum: 90, - estimatedServiceMinutesMaximum: 120, - days: [ - { - date: "2023-12-01", - timeSlots: [ - { - id: "06747-01820-S-B*20424*7 AM", - startTime: "07:00", - endTime: "08:00", - offerPremium: false, - }, - ], - }, - ], - }, - }; - } - if (storeAction === "getMobilePremiumFee") { - return Promise.resolve({ - data: { - partNumber: "EARLY BIRD", - description: null, - partType: "EARLY BIRD", - laborAmount: 0, - sellingPrice: 14.99, - kitPrice: 0, - }, - }); - } - if (storeAction === "priceOrderItemsAndSaveServerData") { - return Promise.resolve([ - { - partNumber: "EARLY BIRD", - description: null, - partType: "EARLY BIRD", - laborAmount: 0, - sellingPrice: 14.99, - kitPrice: 0, - }, - ]); - } - if (storeAction === "saveSupportingItemsSuppressingStateResetting") { - return Promise.resolve([ - { - partNumber: "EARLY BIRD", - description: null, - partType: "EARLY BIRD", - laborAmount: 0, - sellingPrice: 14.99, - kitPrice: 0, - }, - ]); - } - }), - filterOutCertainPartTypesOrNumbers: jest.fn(), - hasSubmittedOrder: jest.fn(), - getTotalPriceOfAllLineItemsAndChildParts: jest.fn(), - getTotalLineItemPrice: jest.fn(), - }, -})); - -// Mock fetchCmsContentForPage -jest.mock("@/helpers/cms-content-helper", () => ({ - fetchCmsContentForPage: () => Promise.resolve("content"), - splitCopyOnCMSPlaceHolder: jest.fn(() => ["A", "B"]), -})); - -beforeEach(() => { - jest.restoreAllMocks(); - jest.clearAllMocks(); - store.getters = { - applicationUser: { - experiments: [], - }, - order: { - schedule: { - date: "2019-01-01", - startTime: "09:00", - endTime: "10:00", - routeCode: "000", - }, - lineItems: { - glassParts: [ - { - partNumber: "ABC123", - }, - ], - supportingItems: [], - }, - serviceLocation: { - appointmentType: "Inshop", - zipCode: "12345", - zipCodeCtu: "01234", - provider: { - providerNumber: "123", - }, - }, - damage: { - isRepair: false, - }, - referralNumber: "1234567", - policy: { - policyNumber: "123", - }, - }, - payment: { - isInsurance: true, - }, - lineItems: { - glassParts: [], - supportingItems: [], - }, - experimentSettings: {}, - vehicle: { - carId: "123", - }, - }; -}); -afterEach(() => { - store.getters = {}; - jest.restoreAllMocks(); - jest.clearAllMocks(); -}); - -describe("schedule.vue...", () => { - describe("initial load", () => { - test("should pass arePagePrerequisitesValid with a mobile CASH order and no providerNumber", () => { - // Arrange - const { wrapper } = setupMocks({}); - store.getters.order.serviceLocation.appointmentType = "Mobile"; - store.getters.order.serviceLocation.provider.policyNumber = null; - store.getters.payment.isInsurance = false; - - // Act - const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); - - // Assert - expect(arePagePrerequisitesValid).toBe(true); - }); - - test("should pass arePagePrerequisitesValid with an inshop order and providerNumber", () => { - // Arrange - const { wrapper } = setupMocks({}); - - // Act - const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); - - // Assert - expect(arePagePrerequisitesValid).toBe(true); - }); - - test("should fail arePagePrerequisitesValid with a replace with no glass parts", async () => { - // Arrange - const { wrapper } = setupMocks({}); - store.getters.order.lineItems.glassParts = []; - - // Act - const arePagePrerequisitesValid2 = await wrapper.vm.arePagePrerequisitesValid(); - - // Assert - expect(arePagePrerequisitesValid2).toBe(false); - }); - - test("should fail arePagePrerequisitesValid without isInsurance", () => { - // Arrange - const { wrapper } = setupMocks({}); - store.getters.payment.isInsurance = null; - - // Act - const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); - - // Assert - expect(arePagePrerequisitesValid).toBe(false); - }); - - test("should return timeslots when getMoreScheduleData is called", async () => { - // Arrange - const { wrapper } = setupMocks({}); - wrapper.vm.selectableDatesInshop = { - days: [], - }; - wrapper.vm.selectableDatesMobile = { - days: [], - }; - - // Act - const newShopTimeSlots = await wrapper.vm.getMoreScheduleData( - "2023-01-01", - "2023-01-31" - ); - - // Assert - expect(newShopTimeSlots).toStrictEqual({ - inshopTimeSlotsData: { - days: [ - { - date: "2023-12-01", - timeSlots: [ - { - endTime: "08:00", - id: "06747-01820-S-B*20424*7 AM", - offerPremium: false, - startTime: "07:00", - }, - ], - }, - ], - estimatedServiceMinutesMinimum: 90, - estimatedServiceMinutesMaximum: 120, - }, - mobileTimeSlotsData: { - days: [ - { - date: "2023-12-01", - timeSlots: [ - { - endTime: "08:00", - id: "06747-01820-S-B*20424*7 AM", - offerPremium: false, - startTime: "07:00", - }, - ], - }, - ], - estimatedServiceMinutesMinimum: 90, - estimatedServiceMinutesMaximum: 120, - }, - }); - }); - - test("should call API service in day ranges of 34 or less when getMoreScheduleData is called with large date ranges", async () => { - // Arrange - const { wrapper } = setupMocks({}); - wrapper.vm.selectableDatesInshop = { - days: [], - }; - wrapper.vm.selectableDatesMobile = { - days: [], - }; - - // Act - await wrapper.vm.getMoreScheduleData.call( - wrapper.vm, - "2023-01-01", - "2023-03-31", - "Inshop", - "123" - ); - - // Assert - expect(baseMixin.methods.dispatchStoreActionWithLogging).toHaveBeenCalledTimes(6); - expect(baseMixin.methods.dispatchStoreActionWithLogging).toHaveBeenCalledWith( - "getShopTimeSlots", - expect.anything(), - expect.anything(), - expect.anything() - ); - }); - - describe("beforeRouteEnter function... ", () => { - // TODO: restore this test (temporarily removed it until CASH-845 is in QA then looping back) - xtest("should call next() and call all functions within next", async () => { - // Arrange - const { wrapper } = setupMocks({}); - wrapper.vm.selectableDatesInshop = { - days: [], - }; - wrapper.vm.updateFooterButtonText = jest.fn(); - wrapper.vm.setDisplayWaitList = jest.fn(); - const nextFunction = jest.fn((c) => { - c(wrapper.vm); - }); - - // Act - await schedule.beforeRouteEnter.call( - wrapper.vm, - { query: { fmgPage: "schedule" } }, - undefined, - nextFunction - ); - - // Assert - expect(nextFunction).toHaveBeenCalled(); - expect(wrapper.vm.setCmsContent).toHaveBeenCalledWith("content"); - expect(wrapper.vm.$refs.datePicker.initializeComponent).toHaveBeenCalledWith( - expect.objectContaining({ - calendarViewDirection: "future", - }) - ); - expect(wrapper.vm.$refs.locationAlerts.initializeComponent).toHaveBeenCalled(); - expect(wrapper.vm.selectableDatesInshop).toStrictEqual( - expect.objectContaining({ - days: expect.any(Array), - estimatedServiceMinutesMaximum: expect.any(Number), - estimatedServiceMinutesMinimum: expect.any(Number), - }) - ); - expect(wrapper.vm.mobilePremiumAppointmentFee).toStrictEqual( - expect.objectContaining({ - partNumber: expect.any(String), - }) - ); - expect(wrapper.vm.updateFooterButtonText).toHaveBeenCalled(); - expect(wrapper.vm.setDisplayWaitList).toHaveBeenCalled(); - }); - }); - - describe("computed properties...", () => { - test("timeSlotsForSelectedDate should return timeslots if selected date is available", () => { - // Arrange - const { wrapper } = setupMocks({}); - wrapper.vm.selectableDatesInshop = { - days: [ - { - date: "2022-11-11", - timeSlots: [ - { - id: "1820I-01820-M-I*20425*AM", - startTime: "08:00", - endTime: "12:00", - offerPremium: true, - }, - { - id: "1820I-01820-M-I*20425*PM", - startTime: "12:00", - endTime: "17:00", - offerPremium: false, - }, - ], - }, - ], - }; - wrapper.setData({ - selectedDate: "2022-11-11", - }); - - // Act - const testValue = wrapper.vm.timeSlotsForSelectedDate; - - // Assert - expect(testValue).toStrictEqual( - expect.objectContaining({ - date: "2022-11-11", - }) - ); - }); - - test("timeSlotsForSelectedDate should be null if no date has been selected", () => { - // Arrange - const { wrapper } = setupMocks({}); - wrapper.vm.selectableDatesInshop = { - days: [ - { - date: "2022-11-11", - timeSlots: [ - { - id: "1820I-01820-M-I*20425*AM", - startTime: "08:00", - endTime: "12:00", - offerPremium: true, - }, - { - id: "1820I-01820-M-I*20425*PM", - startTime: "12:00", - endTime: "17:00", - offerPremium: false, - }, - ], - }, - ], - }; - wrapper.setData({ - selectedDate: undefined, - }); - - // Act - const testValue = wrapper.vm.timeSlotsForSelectedDate; - - // Assert - expect(testValue).toBe(null); - }); - }); - }); - - describe("schedule page methods...", () => { - test("getServiceZipCtuCodeFromStore should return zipCodeCtu", () => { - // Arrange - const { wrapper } = setupMocks({}); - wrapper.vm.selectableDatesInshop = { - days: [], - }; - - // Act - const testValue = wrapper.vm.getServiceZipCtuCodeFromStore(); - - // Assert - expect(testValue).toStrictEqual("01234"); - }); - - test("getDisplayTextForMilitaryTime should return the correctly formatted string", () => { - // Arrange - const { wrapper } = setupMocks({}); - wrapper.vm.selectableDatesInshop = { - days: [], - }; - const timeInput1 = "15:00"; - const timeInput2 = "15:30"; - - // Act - const testOutput1 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput1); - const testOutput2 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput2); - const testOutput3 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput1, true); - const testOutput4 = wrapper.vm.getDisplayTextForMilitaryTime(timeInput2, true); - - // Assert - expect(testOutput1).toBe("3:00 PM"); - expect(testOutput2).toBe("3:30 PM"); - expect(testOutput3).toBe("3 PM"); - expect(testOutput4).toBe("3:30 PM"); - }); - - test("Clicking back should fire correct navigation", () => { - // Arrange - const { wrapper } = setupMocks({}); - wrapper.vm.selectableDatesInshop = { - days: [], - }; - wrapper.vm.$router.navigateWithoutSaving = jest.fn(); - - // Act - wrapper.vm.backButtonAction(); - - // Assert - expect(wrapper.vm.$router.navigateWithoutSaving).toBeCalledWith( - "CLICKED_BACK", - "schedule" - ); - }); - }); - - // TODO: restore this test (temporarily removed it until CASH-845 is in QA then looping back) - xtest("forwardButtonAction should call route method navigateWithoutSaving", async () => { - // Arrange - const { wrapper } = setupMocks({}); - wrapper.vm.dispatchStoreAction = jest.fn(() => { - return { - data: [], - }; - }); - wrapper.vm.$router.navigateWithSaving = jest.fn(() => { - return {}; - }); - - // Act - await wrapper.vm.forwardButtonAction(); - - // Assert - expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled(); - }); - - test("for Inshop appts, updateSupportingItems should call store action to save supporting items WITHOUT the EARLY BIRD supporting item", async () => { - // Arrange - store.getters.order.serviceLocation.appointmentType = "Inshop"; - store.getters.lineItems.supportingItems = [ - { - partNumber: "EARLY BIRD", - description: null, - partType: "EARLY BIRD", - laborAmount: 0, - sellingPrice: 0, - kitPrice: 0, - }, - ]; - const { wrapper } = setupMocks({}); - wrapper.vm.dispatchStoreAction = jest.fn(() => { - return { - data: [], - }; - }); - wrapper.vm.mobilePremiumAppointmentFee = 14.99; - wrapper.setData({ - selectedTimeSlot: { - date: "2019-01-01", - startTime: "09:00", - endTime: "10:00", - routeCode: null, - isPremiumAppointment: true, - }, - }); - - // Act - await wrapper.vm.updateSupportingItems(); - - // Assert - expect(wrapper.vm.dispatchStoreAction).toBeCalledWith( - "saveSupportingItemsSuppressingStateResetting", - expect.not.arrayContaining([ - expect.objectContaining({ - partType: "EARLY BIRD", - }), - ]), - expect.anything() - ); - }); -}); - -const mockCmsContent = {}; - -function setupMocks({ customMountOptions }) { - const mountOptions = getMountOptions({ - ...customMountOptions, - route: { name: "schedule" }, - }); - - mountOptions.global.mocks["$store"] = store; - mountOptions.global.mocks["$router"] = router; - mountOptions["attachTo"] = document.body; - mountOptions.mixins = [ - { - methods: { - getCmsContent: jest.fn().mockImplementation((widgetName, fieldName) => { - if (mockCmsContent[widgetName] && mockCmsContent[widgetName][fieldName]) - return mockCmsContent[widgetName][fieldName]; - }), - }, - }, - ]; - mountOptions.global.mocks.pageName = "schedule"; - - const wrapper = shallowMount(schedule, mountOptions); - - wrapper.vm.setCmsContent = jest.fn(); - wrapper.vm.$refs.datePicker.initializeComponent = jest.fn(); - wrapper.vm.$refs.datePicker.loadInitialData = jest.fn(); - wrapper.vm.$refs.locationAlerts.initializeComponent = jest.fn(); - wrapper.vm.$refs.navbar.updateButtonText = jest.fn(); - - return { wrapper }; -} From fb7204d986dce34d3b3a20de7b2ef57359defb2a Mon Sep 17 00:00:00 2001 From: AdamCaouetteSafelite Date: Wed, 29 Oct 2025 09:55:32 -0400 Subject: [PATCH 8/9] CASH-1712: move the providedNumberChange check into the specific condition where we need to reinit --- src/layouts/schedule/schedule.vue | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 8b275f924..40968a4e3 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -1133,6 +1133,7 @@ export default { this.resetWaitlist(); this.preSelectedDate = null; this.shopProviderData = shopQuestionPopUpData.shopProviderData; + const oldProvider = this.selectedProvider; const selectedProvider = this.shopProviderData.shopProviders.find((shopProvider) => { return shopProvider.providerNumber === shopQuestionPopUpData.selectedProviderNumber; }); @@ -1144,7 +1145,12 @@ export default { selectedProvider ); } else { - this.updateSelectedProvider(selectedProvider); + const didProviderNumberChange = + oldProvider.providerNumber !== selectedProvider.providerNumber; + if (didProviderNumberChange) { + this.updateSelectedProvider(selectedProvider); + this.initializeDatePicker(); + } } }, async getMoreScheduleData(startDate, endDate) { From d09a30ae4f1af8c42e58eebf5b6e7b3c05e02bd2 Mon Sep 17 00:00:00 2001 From: AdamCaouetteSafelite Date: Wed, 29 Oct 2025 10:15:58 -0400 Subject: [PATCH 9/9] CASH-1712: add null check --- src/layouts/schedule/schedule.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 40968a4e3..0a0a78d68 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -1146,7 +1146,7 @@ export default { ); } else { const didProviderNumberChange = - oldProvider.providerNumber !== selectedProvider.providerNumber; + oldProvider?.providerNumber !== selectedProvider.providerNumber; if (didProviderNumberChange) { this.updateSelectedProvider(selectedProvider); this.initializeDatePicker();