diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index 508f59bf7..44e43ff3e 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -39,6 +39,7 @@ const storeMutations = { UPDATE_REFERRAL_DATE: "updateReferralDate", UPDATE_REFERRAL_CORRELATION_ID: "updateReferralCorrelationId", UPDATE_PARENT_ACCT_NUMBER: "updateParentAcctNumber", + UPDATE_EON: "updateEON", UPDATE_SAVED_SESSION_ID: "updateSavedSessionId", UPDATE_CRM_CUSTOMER_ID: "updateCrmCustomerId", diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js index 3ebb7ded8..6079c5375 100644 --- a/src/helpers/heritage-integration/navigation-helper.js +++ b/src/helpers/heritage-integration/navigation-helper.js @@ -16,7 +16,7 @@ export async function getPageToRouteExistingOrderTo(toRoute = {}, existingHerita if (toRoute.query[queryStrings.START_TYPE] === 'fmg') { // If they have an existing order, return 'heritage' for the page name. if (existingHeritageOrder) { - return 'heritage'; + return fmgPageValues.HERITAGE; } return await getLatestPageForRedirection(); @@ -61,11 +61,16 @@ async function getLatestPageForRedirection() { // If this is a non-CTA navigation, determine where to send the user based on page prerequisites. // This also works if a user has a 'fmg' start_type query string but no current order. // That shouldn't happen, but it's possible. - const vehicleMakeComponent = (await lazyLoadComponent('vehicle-make')()).default; - const vehicleModelComponent = (await lazyLoadComponent('vehicle-model')()).default; - const vehicleStyleComponent = (await lazyLoadComponent('vehicle-style')()).default; - const vehicleDamageComponent = (await lazyLoadComponent('vehicle-damage')()).default; - + const vehicleMakeComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_MAKE); + const vehicleModelComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_MODEL); + const vehicleStyleComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_STYLE); + const vehicleDamageComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_DAMAGE); + const estimateComponent = await getLazyLoadedComponent(fmgPageValues.ESTIMATE); + const vinLookupComponent = await getLazyLoadedComponent(fmgPageValues.VIN_LOOKUP); + const partQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.PART_QUESTIONS); + const vehiclePartsComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_PARTS); + const moldingQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.MOLDING_QUESTIONS); + const capabilityQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.CAPABILITY_QUESTIONS); if (!vehicleMakeComponent.methods.arePagePrerequisitesValid()) { return fmgPageValues.VEHICLE_YEAR; @@ -75,15 +80,28 @@ async function getLatestPageForRedirection() { return fmgPageValues.VEHICLE_MODEL; } else if (!vehicleDamageComponent.methods.arePagePrerequisitesValid()) { return fmgPageValues.VEHICLE_STYLE; - } else if (store.getters.damage.isRepair == null || !store.getters.vehicle.carId) { + } else if (!estimateComponent.methods.arePagePrerequisitesValid()) { return fmgPageValues.VEHICLE_DAMAGE; } else { - if (store.getters.vehicle.vin) { + if (capabilityQuestionsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.CAPABILITY_QUESTIONS; + } + else if (moldingQuestionsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.MOLDING_QUESTIONS; + } + else if (vehiclePartsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.VEHICLE_PARTS; + } + else if (partQuestionsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.PART_QUESTIONS; + } + else if (vinLookupComponent.methods.arePagePrerequisitesValid()) { return fmgPageValues.VIN_LOOKUP; - } else { + } + else { return fmgPageValues.ESTIMATE; } - } + } } /* @@ -126,4 +144,8 @@ function isVinRelatedPage(toRoute) { fmgPageValue === fmgPageValues.ADDRESS_LOOKUP || fmgPageValue === fmgPageValues.ADDRESS_VEHICLES || fmgPageValue === fmgPageValues.ESTIMATE; +} + +async function getLazyLoadedComponent(pageName) { + return (await lazyLoadComponent(pageName)()).default; } \ No newline at end of file diff --git a/src/helpers/heritage-integration/navigation-helper.spec.js b/src/helpers/heritage-integration/navigation-helper.spec.js index 0e615aef5..eba5f5f49 100644 --- a/src/helpers/heritage-integration/navigation-helper.spec.js +++ b/src/helpers/heritage-integration/navigation-helper.spec.js @@ -5,6 +5,7 @@ import { storeActions } from "@/constants/store-actions"; import { setupMocksForJsFiles, getMockOrderInfo } from "@/helpers/unit-test-helper.js"; import { externalUrls } from "@/router/router-constants/externalUrl-values"; import { queryStrings } from "@/constants/query-strings"; +import { fmgPageValues } from "@/router/router-constants/fmgPage-values"; import store from "@/store"; import router from "@/router"; @@ -15,278 +16,269 @@ jest.mock("@/router/dynamic-routing/component-loader.js", () => ({ })); describe("getPageToRouteExistingOrderTo", () => { - - test("getPageToRouteExistingOrderTo, should return vehicle-year", async () => { + test("should return vehicle-year", async () => { // Arrange const toRoute = { query: {} }; // Mock out the lazy load calls for all components. - lazyLoadComponent - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(false) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(false) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(false) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(false) - } - } - } - }); + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: false + }) // Act const result = await getPageToRouteExistingOrderTo(toRoute, false); //Assert - expect(result).toBe('vehicle-year'); + expect(result).toBe(fmgPageValues.VEHICLE_YEAR); }); - test("getPageToRouteExistingOrderTo, should return vehicle-model", async () => { + test("should return vehicle-make", async () => { // Arrange const toRoute = { query: {} }; // Mock out the lazy load calls for all components. - lazyLoadComponent - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(false) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(false) - } - } - } - }); + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: true, + [fmgPageValues.VEHICLE_MODEL]: false + }) // Act const result = await getPageToRouteExistingOrderTo(toRoute, false); //Assert - expect(result).toBe('vehicle-model'); + expect(result).toBe(fmgPageValues.VEHICLE_MAKE); }); - test("getPageToRouteExistingOrderTo, should return vehicle-damage", async () => { + test("should return vehicle-model", async () => { // Arrange const toRoute = { query: {} }; // Mock out the lazy load calls for all components. - lazyLoadComponent - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }); - - store.getters.damage.isRepair = undefined; - store.getters.vehicle.carId = 'C00000'; + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: true, + [fmgPageValues.VEHICLE_MODEL]: true, + [fmgPageValues.VEHICLE_STYLE]: false, + }) // Act const result = await getPageToRouteExistingOrderTo(toRoute, false); //Assert - expect(result).toBe('vehicle-damage'); + expect(result).toBe(fmgPageValues.VEHICLE_MODEL); }); - test("getPageToRouteExistingOrderTo, should return vin-lookup", async () => { + test("should return vehicle-style", async () => { // Arrange const toRoute = { query: {} }; // Mock out the lazy load calls for all components. - lazyLoadComponent - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }); - - store.getters.damage.isRepair = true; - store.getters.vehicle.carId = 'C00000'; - store.getters.vehicle.vin = "1FADP3F26DL212886" + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: true, + [fmgPageValues.VEHICLE_MODEL]: true, + [fmgPageValues.VEHICLE_STYLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: false, + }) // Act const result = await getPageToRouteExistingOrderTo(toRoute, false); //Assert - expect(result).toBe('vin-lookup'); + expect(result).toBe(fmgPageValues.VEHICLE_STYLE); }); - test("getPageToRouteExistingOrderTo, should return estimate", async () => { + test("should return vehicle-damage", async () => { // Arrange const toRoute = { query: {} }; // Mock out the lazy load calls for all components. - lazyLoadComponent - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }) - .mockReturnValueOnce(() => { - return { - default: { - methods: { - arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(true) - } - } - } - }); + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: true, + [fmgPageValues.VEHICLE_MODEL]: true, + [fmgPageValues.VEHICLE_STYLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: false + }) - store.getters.damage.isRepair = true; - store.getters.vehicle.carId = 'C00000'; - store.getters.vehicle.vin = null; // Act const result = await getPageToRouteExistingOrderTo(toRoute, false); //Assert - expect(result).toBe('estimate'); + expect(result).toBe(fmgPageValues.VEHICLE_DAMAGE); }); - test("getPageToRouteExistingOrderTo, existing order, should return heritage", async () => { + test("user has YMMS and no vehicle questions > should return vin-lookup", async () => { + // Arrange + const toRoute = { + query: {} + }; + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: true, + [fmgPageValues.VEHICLE_MODEL]: true, + [fmgPageValues.VEHICLE_STYLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: false, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: false, + [fmgPageValues.VIN_LOOKUP]: true, + }) + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute, false); + + //Assert + expect(result).toBe(fmgPageValues.VIN_LOOKUP); + }); + + test("user has YMMS but no questions or carId > should return estimate", async () => { + // Arrange + const toRoute = { + query: {} + }; + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: true, + [fmgPageValues.VEHICLE_MODEL]: true, + [fmgPageValues.VEHICLE_STYLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: false, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: false, + [fmgPageValues.VIN_LOOKUP]: false, + }) + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute, false); + + //Assert + expect(result).toBe(fmgPageValues.ESTIMATE); + }); + + test("user has capability questions and molding questions > should return capability questions", async () => { + // Arrange + const toRoute = { + query: {} + }; + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: true, + [fmgPageValues.VEHICLE_MODEL]: true, + [fmgPageValues.VEHICLE_STYLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: true, + [fmgPageValues.MOLDING_QUESTIONS]: true, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: false, + [fmgPageValues.VIN_LOOKUP]: false, + }) + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute, false); + + //Assert + expect(result).toBe(fmgPageValues.CAPABILITY_QUESTIONS); + }); + + test("user has molding questions and part questions > should return molding questions", async () => { + // Arrange + const toRoute = { + query: {} + }; + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: true, + [fmgPageValues.VEHICLE_MODEL]: true, + [fmgPageValues.VEHICLE_STYLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: true, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: true, + [fmgPageValues.VIN_LOOKUP]: false, + }) + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute, false); + + //Assert + expect(result).toBe(fmgPageValues.MOLDING_QUESTIONS); + }); + + test("user has vehicle parts questions > should return vehicle-parts", async () => { + // Arrange + const toRoute = { + query: {} + }; + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: true, + [fmgPageValues.VEHICLE_MODEL]: true, + [fmgPageValues.VEHICLE_STYLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: false, + [fmgPageValues.VEHICLE_PARTS]: true, + [fmgPageValues.PART_QUESTIONS]: true, + [fmgPageValues.VIN_LOOKUP]: false, + }) + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute, false); + + //Assert + expect(result).toBe(fmgPageValues.VEHICLE_PARTS); + }); + + test("user has part questions > should return part-questions", async () => { + // Arrange + const toRoute = { + query: {} + }; + + // Mock out the lazy load calls for all components. + mockLazyLoadComponentReturnValues({ + [fmgPageValues.VEHICLE_MAKE]: true, + [fmgPageValues.VEHICLE_MODEL]: true, + [fmgPageValues.VEHICLE_STYLE]: true, + [fmgPageValues.VEHICLE_DAMAGE]: true, + [fmgPageValues.ESTIMATE]: true, + [fmgPageValues.CAPABILITY_QUESTIONS]: false, + [fmgPageValues.MOLDING_QUESTIONS]: false, + [fmgPageValues.VEHICLE_PARTS]: false, + [fmgPageValues.PART_QUESTIONS]: true, + [fmgPageValues.VIN_LOOKUP]: false, + }) + + // Act + const result = await getPageToRouteExistingOrderTo(toRoute, false); + + //Assert + expect(result).toBe(fmgPageValues.PART_QUESTIONS); + }); + + test("existing order > should return heritage", async () => { // Arrange const toRoute = { query: { @@ -298,7 +290,7 @@ describe("getPageToRouteExistingOrderTo", () => { const result = await getPageToRouteExistingOrderTo(toRoute, true); // Assert - expect(result).toBe("heritage"); + expect(result).toBe(fmgPageValues.HERITAGE); }) }); @@ -401,4 +393,22 @@ describe("navigateToHeritageFunnel", () => { expect(router.navigateToExternalUrl).toHaveBeenCalled(); saveOrderFunction.mockRestore(); }); -}); \ No newline at end of file +}); + +/** + * `arePagePrerequisitesValidObject` is an object where the keys are fmgPageValue names and the values are booleans that indicate + * whether arePagePrerequisitesValid is true or false + */ +function mockLazyLoadComponentReturnValues(arePagePrerequisitesValidObject = {}) { + lazyLoadComponent.mockImplementation((pageName) => { + return async () => { + return Promise.resolve({ + default: { + methods: { + arePagePrerequisitesValid: jest.fn().mockReturnValueOnce(arePagePrerequisitesValidObject[pageName]) + } + } + }) + } + }) +} diff --git a/src/helpers/heritage-integration/session-helper.js b/src/helpers/heritage-integration/session-helper.js index ca50a4e7b..b71602f3c 100644 --- a/src/helpers/heritage-integration/session-helper.js +++ b/src/helpers/heritage-integration/session-helper.js @@ -31,16 +31,12 @@ export function isSavedSessionStillActive() { const savedSessionTimeStamp = new Date(getFunnelCookie().SavedSessionTimeoutDate); const isSavedSessionTimedOut = (new Date(new Date().toUTCString()) > savedSessionTimeStamp); - if (isSavedSessionTimedOut) { - return false; - } - - return true; + return !isSavedSessionTimedOut; } } /* -Function to get the date for the saved session timeout. +Function to calculate the date for the saved session timeout. */ export function getDateForSavedSessionTimeout() { diff --git a/src/layouts/estimate/estimate.vue b/src/layouts/estimate/estimate.vue index 3949d4c41..85f277482 100644 --- a/src/layouts/estimate/estimate.vue +++ b/src/layouts/estimate/estimate.vue @@ -80,7 +80,7 @@ export default { }, methods: { arePagePrerequisitesValid() { - if(store.getters.damage.isRepair!=null){ + if(store.getters.damage.isRepair != null){ return true; } return false; diff --git a/src/layouts/part-questions/part-questions.vue b/src/layouts/part-questions/part-questions.vue index cfaa97fc8..1f8160adf 100644 --- a/src/layouts/part-questions/part-questions.vue +++ b/src/layouts/part-questions/part-questions.vue @@ -183,7 +183,8 @@ export default { } }, arePagePrerequisitesValid() { - return Object.keys(store.getters.pageData(fmgPageValues.PART_QUESTIONS)).length > 0; + const partQuestionsFromPageData = store.getters.pageData(fmgPageValues.PART_QUESTIONS); + return partQuestionsFromPageData && Object.keys(partQuestionsFromPageData).length > 0; }, }, watch: { diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 7d61814f8..23d317815 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -155,7 +155,7 @@ export default { }, methods: { arePagePrerequisitesValid() { - if(store.getters.vehicle.carId){ + if (store.getters.vehicle.carId) { return true; } return false; diff --git a/src/layouts/vehicle-make/vehicle-make.vue b/src/layouts/vehicle-make/vehicle-make.vue index 8cd77c545..309e74863 100644 --- a/src/layouts/vehicle-make/vehicle-make.vue +++ b/src/layouts/vehicle-make/vehicle-make.vue @@ -76,7 +76,7 @@ export default { ); }, arePagePrerequisitesValid() { - if (store.getters.vehicle.year){ + if (store.getters.vehicle.year){ return true; } return false; diff --git a/src/layouts/vehicle-parts/vehicle-parts.spec.js b/src/layouts/vehicle-parts/vehicle-parts.spec.js index 9f766c7e9..bd7911da4 100644 --- a/src/layouts/vehicle-parts/vehicle-parts.spec.js +++ b/src/layouts/vehicle-parts/vehicle-parts.spec.js @@ -11,6 +11,7 @@ import { nextTick } from "vue"; import baseMixin from "@/mixins/base-mixin.js"; import store from "@/store"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; +import { navigationScenarios } from "@/router/router-constants/navigation-scenarios"; // Mock our module for promises. jest.mock("@/helpers/layout-helper.js", () => ({ @@ -145,7 +146,7 @@ describe("vehicle-parts.vue", () => { test("Initial data, should populate this.glassParts", async () => { //Arrange - store.getters.pageData.mockReturnValueOnce(basePartResponse); + store.getters.pageData.mockReturnValue(basePartResponse); store.getters.lineItems = { glassParts: [{ partNumber: 'DB12209YPYNOEM' }] } const { wrapper } = setupMocks({ @@ -178,12 +179,8 @@ describe("vehicle-parts.vue", () => { expect(wrapper.vm.glassParts).toEqual({ "Rear-Stationary": { "Rear": ['DB12209YPYNOEM'] } }); }); - test("BackButtonAction triggers a router.navigate change", async () => { - + test("User had part questions > BackButtonAction triggers a router.navigate change with correct scenario", async () => { //Arrange - store.getters.pageData.mockReturnValueOnce(basePartResponse); - store.getters.lineItems = { glassParts: null } - const { wrapper } = setupMocks({ mountOptionsMockData: { router: { @@ -196,7 +193,25 @@ describe("vehicle-parts.vue", () => { } }, store: { - getters: store.getters + getters: { + pageData: () => { + return { + partsOrQuestions: [ + { + glassName: "Stationary", + glassLocation: "Rear", + parts: null, + partQuestions: [{ + testProperty: "some value" + }] + } + ] + } + }, + lineItems: { + glassParts: null + } + } }, } }); @@ -212,7 +227,46 @@ describe("vehicle-parts.vue", () => { wrapper.vm.backButtonAction(); //Assert - expect(wrapper.vm.$router.navigate).toHaveBeenCalled(); + expect(wrapper.vm.$router.navigate).toHaveBeenCalledWith(navigationScenarios.CLICKED_BACK_WITH_PART_QUESTION_ANSWERS, wrapper.vm.$route); + + }); + + test("User did not have part questions > BackButtonAction triggers a router.navigate change with correct scenario", async () => { + //Arrange + const { wrapper } = setupMocks({ + mountOptionsMockData: { + router: { + navigate: jest.fn(), + navigate: jest.fn() + }, + route: { + query: { + fmgPage: 'vehicle-parts', + } + }, + store: { + getters: { + pageData: () => basePartResponse, + lineItems: { + glassParts: null + } + } + }, + } + }); + + //Act + vehicleParts.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-parts" } }, + undefined, + (c) => c(wrapper.vm) + ); + + wrapper.vm.backButtonAction(); + + //Assert + expect(wrapper.vm.$router.navigate).toHaveBeenCalledWith(navigationScenarios.CLICKED_BACK_WITHOUT_PART_QUESTION_ANSWERS, wrapper.vm.$route); }); diff --git a/src/layouts/vehicle-parts/vehicle-parts.vue b/src/layouts/vehicle-parts/vehicle-parts.vue index 27a92ddf4..c7f1424a1 100644 --- a/src/layouts/vehicle-parts/vehicle-parts.vue +++ b/src/layouts/vehicle-parts/vehicle-parts.vue @@ -67,6 +67,7 @@ import store from "@/store"; import { storeMutations } from "@/constants/store-mutations.js"; import vehicleQuestionsMixin from "@/mixins/vehicle-questions-mixin"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; +import { assertParenthesizedExpression } from "@babel/types"; export default { name: "vehicle-parts", @@ -126,7 +127,7 @@ export default { return { glassName: g.glassName, glassLocation: g.glassLocation, - colorAnswers: g.parts.reduce((arr, p) => { + colorAnswers: g.parts?.reduce((arr, p) => { arr.push({ ColorAnswerText: p.color, FeatureAnswers: [ @@ -155,7 +156,7 @@ export default { methods: { arePagePrerequisitesValid() { // Check if isRepair is populated and if the pageData we need is here (Parts data) - return store.getters.damage.isRepair != null && + return store.getters.damage.isRepair != null && store.getters.pageData(fmgPageValues.VEHICLE_PARTS) && Object.keys(store.getters.pageData(fmgPageValues.VEHICLE_PARTS)).length !== 0; }, backButtonAction() { @@ -175,7 +176,6 @@ export default { this.PartsFromApi.partsOrQuestions )) { for (let [partKey, partValue] of Object.entries(value.parts)) { - const currentPart = this.PartsFromApi.partsOrQuestions[key].parts[partKey]; const isMatched = this.selectedGlassPartNumbers.some( @@ -184,9 +184,9 @@ export default { if (isMatched) { matchedParts.push({ - "glassLocation": value.glassLocation, - "glassName": value.glassName, - "parts": [currentPart] + glassLocation: value.glassLocation, + glassName: value.glassName, + parts: [currentPart] }); } } diff --git a/src/mixins/vehicle-questions-mixin.js b/src/mixins/vehicle-questions-mixin.js index 4331529d4..1a28fe028 100644 --- a/src/mixins/vehicle-questions-mixin.js +++ b/src/mixins/vehicle-questions-mixin.js @@ -8,12 +8,12 @@ export default { return partsOrQuestions?.some(pq => pq.parts?.length > 1); }, hasChildPartQuestions(partsOrQuestions) { - return partsOrQuestions.some(pq => { + return partsOrQuestions?.some(pq => { return pq.parts?.some(part => part.childPartQuestions?.length > 0); }); }, hasCapabilityQuestions(partsOrQuestions) { - return partsOrQuestions.some(pq => { + return partsOrQuestions?.some(pq => { return pq.parts?.some(part => part.requiresCapabilityQuestions === true); }); }, diff --git a/src/router/router-constants/fmgPage-values.js b/src/router/router-constants/fmgPage-values.js index 404a89de9..d924e30de 100644 --- a/src/router/router-constants/fmgPage-values.js +++ b/src/router/router-constants/fmgPage-values.js @@ -14,7 +14,8 @@ const fmgPageValues = { REVEAL: "reveal", ESTIMATE: "estimate", ADDRESS_VEHICLES: "address-vehicles", - QUOTE: "quote" + QUOTE: "quote", + HERITAGE: "heritage" }; export { fmgPageValues }; diff --git a/src/store/index.js b/src/store/index.js index f2257d9e9..968837218 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -60,6 +60,7 @@ const getDefaultState = () => { referralDate: null, referralCorrelationId: null, accountNumber: 0, + eon: null }, applicationUser: { eventBus: [], @@ -139,6 +140,9 @@ export const mutations = { updateParentAcctNumber(state, parentAcctNumber) { state.order.accountNumber = parentAcctNumber; }, + updateEON(state, eon) { + state.order.eon = eon; + }, updateIsInsurance(state, isInsurance) { state.order.payment.isInsurance = isInsurance; }, @@ -267,6 +271,9 @@ export const mutations = { state.order.lineItems.glassParts = null; state.order.damage.partQuestionAnswers = null; state.applicationUser.pageData[fmgPageValues.PART_QUESTIONS] = null; + state.applicationUser.pageData[fmgPageValues.VEHICLE_PARTS] = null; + state.applicationUser.pageData[fmgPageValues.MOLDING_QUESTIONS] = null; + state.applicationUser.pageData[fmgPageValues.CAPABILITY_QUESTIONS] = null; }, resetState(state) { Object.assign(state, getDefaultState()); @@ -279,6 +286,14 @@ export const mutations = { state.order.referralNumber = orderInformation.referralNumber; state.order.referralDate = orderInformation.referralDate; state.order.referralCorrelationId = orderInformation.referralCorrelationId; + state.order.eon = orderInformation.eon; + + if (state.order.vehicle.vin !== orderInformation.vehicle?.vin) { + state.applicationUser.pageData[fmgPageValues.PART_QUESTIONS] = null; + state.applicationUser.pageData[fmgPageValues.VEHICLE_PARTS] = null; + state.applicationUser.pageData[fmgPageValues.MOLDING_QUESTIONS] = null; + state.applicationUser.pageData[fmgPageValues.CAPABILITY_QUESTIONS] = null; + } state.order.vehicle = Object.assign(state.order.vehicle, { year: orderInformation.vehicle?.year, @@ -504,10 +519,11 @@ export const actions = { }, // Misc Actions - updateStoreWithSaveOrderResponse(context, { referralNumber, referralDate, referralCorrelationId, accountNumber, savedSessionId, crmCustomerId }) { + updateStoreWithSaveOrderResponse(context, { referralNumber, referralDate, referralCorrelationId, eon, accountNumber, savedSessionId, crmCustomerId }) { context.commit(storeMutations.UPDATE_REFERRAL_NUMBER, referralNumber); context.commit(storeMutations.UPDATE_REFERRAL_DATE, referralDate); context.commit(storeMutations.UPDATE_REFERRAL_CORRELATION_ID, referralCorrelationId); + context.commit(storeMutations.UPDATE_EON, eon); context.commit(storeMutations.UPDATE_PARENT_ACCT_NUMBER, accountNumber); context.commit(storeMutations.UPDATE_SAVED_SESSION_ID, savedSessionId); context.commit(storeMutations.UPDATE_CRM_CUSTOMER_ID, crmCustomerId); @@ -574,10 +590,11 @@ export const actions = { }, // Misc Actions - setReferralInformation(context, { referralNumber, referralDate, referralCorrelationId }) { + setReferralInformation(context, { referralNumber, referralDate, referralCorrelationId, eon }) { context.commit(storeMutations.UPDATE_REFERRAL_NUMBER, referralNumber); context.commit(storeMutations.UPDATE_REFERRAL_DATE, referralDate); context.commit(storeMutations.UPDATE_REFERRAL_CORRELATION_ID, referralCorrelationId); + context.commit(storeMutations.UPDATE_EON, eon); }, GetExperimentsByUser(context, { userId }) { @@ -650,6 +667,7 @@ export const actions = { const damage = context.getters.damage; const order = context.state.order; const applicationUser = context.getters.applicationUser; + const lineItems = context.state.order.lineItems; return globalMethods.callHttpClient({ method: endpoints.SaveOrder.method, @@ -680,6 +698,9 @@ export const actions = { customer: { emailAddress: order.customer.emailAddress, }, + lineItems: { + glassParts: lineItems.glassParts + }, serviceLocation: { streetAddress: order.serviceLocation.address, city: order.serviceLocation.city, @@ -693,7 +714,6 @@ export const actions = { lastPage: applicationUser.lastPageVisited, crmCustomerId: applicationUser.crmCustomerId, savedSessionId: applicationUser.savedSessionId, - }, }); }, @@ -708,8 +728,8 @@ export const actions = { accountNumber: accountNumber?.toString() }, }).then((response) => { - // clear the state if the existing referral number does not equal what is returned from loadOrder - if (context.state.order.referralNumber != response.data.referralNumber) { + // clear the state if the existing EON does not equal what is returned from loadOrder + if (context.state.order.eon && context.state.order.eon != response.data.eon) { context.commit(storeMutations.RESET_STATE); } context.commit(storeMutations.UPDATE_STATE_WITH_ORDER_INFORMATION, response.data); @@ -736,6 +756,7 @@ export const actions = { context.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); context.dispatch(storeActions.RESET_REGISTRATION_STATE_AND_DEPENDENCIES); + context.dispatch(storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES); //Save new values context.commit(storeMutations.UPDATE_YEAR, year); @@ -756,6 +777,7 @@ export const actions = { context.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); context.dispatch(storeActions.RESET_REGISTRATION_STATE_AND_DEPENDENCIES); + context.dispatch(storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES); //Save new values context.commit(storeMutations.UPDATE_MAKE, make); @@ -775,6 +797,7 @@ export const actions = { context.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); context.dispatch(storeActions.RESET_REGISTRATION_STATE_AND_DEPENDENCIES); + context.dispatch(storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES); //Save new values context.commit(storeMutations.UPDATE_MODEL, model); @@ -792,6 +815,7 @@ export const actions = { context.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); context.dispatch(storeActions.RESET_REGISTRATION_STATE_AND_DEPENDENCIES); + context.dispatch(storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES); //Save new values context.commit(storeMutations.UPDATE_STYLE, style); @@ -822,6 +846,7 @@ export const actions = { //Reset dependent state when changing if (vehicleInfo.vin !== context.state.order.vehicle.vin) { context.dispatch(storeActions.RESET_REGISTRATION_STATE_AND_DEPENDENCIES); + context.dispatch(storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES); if (!isSelectedGlassAvailableForVehicle) { context.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); @@ -840,6 +865,7 @@ export const actions = { if (!isSelectedGlassAvailableForVehicle) { context.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); + context.dispatch(storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES); } //Save new values @@ -855,6 +881,7 @@ export const actions = { if (!isSelectedGlassAvailableForVehicle) { context.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); + context.dispatch(storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES); } //Save new values @@ -880,6 +907,7 @@ export const actions = { if (!isSelectedGlassAvailableForVehicle) { context.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); + context.dispatch(storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES); } //Save new values diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 29f8a88ed..84b8a46d7 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -575,12 +575,13 @@ describe("Actions", () => { lastPageVisited: "test-page", crmCustomerId: "xxx-xxx-xxx", savedSessionId: "xxx-xxx-xxx" - } + }, }; context.state = { order: { serviceLocation: {}, - customer: {} + customer: {}, + lineItems: {} }, }; @@ -793,13 +794,27 @@ describe("Actions", () => { // Act - const payload = { isCarIdDifferent: true, isSelectedGlassAvailableForVehicle: false, vehicleInfo: { carId: 'C010101', vin: "XXXXX" }, registrationInfo: { zipCode: "80020" }, serviceLocationInfo: { state: "CO" }, customerEmail: "test@safleite.com" }; + const payload = { + isCarIdDifferent: true, + isSelectedGlassAvailableForVehicle: false, + vehicleInfo: { + carId: 'C010101', vin: "XXXXX" + }, + registrationInfo: { + zipCode: "80020" + }, + serviceLocationInfo: { + state: "CO" + }, + customerEmail: "test@safleite.com" + }; actions.saveVinLookup(context, payload); // Assert expect(dispatch).toHaveBeenNthCalledWith(1, storeActions.RESET_REGISTRATION_STATE_AND_DEPENDENCIES); - expect(dispatch).toHaveBeenNthCalledWith(2, storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); + expect(dispatch).toHaveBeenNthCalledWith(2, storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES); + expect(dispatch).toHaveBeenNthCalledWith(3, storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); expect(commit).toBeCalledWith(storeMutations.UPDATE_VEHICLE, payload.vehicleInfo); expect(commit).toBeCalledWith(storeMutations.UPDATE_REGISTRATION, payload.registrationInfo);