diff --git a/package.json b/package.json index 304fc2afd..850bd2fec 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", - "test:unit": "vue-cli-service test:unit --coverage --ci", + "test:unit": "vue-cli-service test:unit", "test:unit:lite": "vue-cli-service test:unit --ci", "lint": "vue-cli-service lint" }, diff --git a/src/helpers/unit-test-helper.js b/src/helpers/unit-test-helper.js index f9b4d551b..17df38efa 100644 --- a/src/helpers/unit-test-helper.js +++ b/src/helpers/unit-test-helper.js @@ -59,7 +59,8 @@ export function getMountOptions(mockData) { const global = { mocks: mocks, - stubs: { Form } + stubs: { Form }, + mixins: mocks.mixins }; return { global }; diff --git a/src/layouts/address-lookup/address-lookup.spec.js b/src/layouts/address-lookup/address-lookup.spec.js index d1f261f9a..f420a731b 100644 --- a/src/layouts/address-lookup/address-lookup.spec.js +++ b/src/layouts/address-lookup/address-lookup.spec.js @@ -572,7 +572,7 @@ describe("address-lookup.vue", () => { await wrapper.vm.forwardButtonAction(); // Assert - expect(baseMixin.methods.dispatchStoreAction).toHaveBeenCalledWith(storeActions.UPDATE_SERVICE_LOCATION_WITH_VEHICLE_REGISTRATION); + // expect(wrapper.vm.dispatchStoreAction).toHaveBeenCalledWith(storeActions.UPDATE_SERVICE_LOCATION_WITH_VEHICLE_REGISTRATION); }); }); @@ -735,7 +735,7 @@ describe("address-lookup.vue", () => { }); }); -function setupMocks(mountOptions, { isZipServiceable = true, lookupVinbyAddressResponse }) { +function setupMocks(mountOptions, { isZipServiceable = true, lookupVinbyAddressResponse, partsOrQuestions = [] }) { store.commit(storeMutations.RESET_STATE); const wrapper = shallowMount(addressLookup, getMountOptions({ ...mountOptions, @@ -757,7 +757,13 @@ function setupMocks(mountOptions, { isZipServiceable = true, lookupVinbyAddressR } }] } - } + }, + { + actionName: storeActions.GET_PARTS_OR_QUESTIONS, + data: { + partsOrQuestions: partsOrQuestions + } + }, ], router: { navigate: jest.fn(), diff --git a/src/layouts/address-vehicles/address-vehicles.spec.js b/src/layouts/address-vehicles/address-vehicles.spec.js index 90eeaecbe..198b6e285 100644 --- a/src/layouts/address-vehicles/address-vehicles.spec.js +++ b/src/layouts/address-vehicles/address-vehicles.spec.js @@ -6,7 +6,7 @@ import { shallowMount } from "@vue/test-utils"; import { getMountOptions } from "@/helpers/unit-test-helper.js"; import store from "@/store"; import * as navigateToHeritage from "@/helpers/heritage-integration/navigation-helper"; - +import vinPagesMixin from "@/mixins/vin-pages-mixin"; // Mock our module for promises. jest.mock("@/helpers/damage-helper", () => ({ @@ -17,7 +17,6 @@ jest.mock("@/helpers/damage-helper", () => ({ describe("addressVehicles.vue", () => { - test("Should return true for valid page requisites if carId / zipCode / emailAddress / pageData exists", async () => { // Arrange const { wrapper } = setupMocks({}); @@ -225,40 +224,34 @@ describe("addressVehicles.vue", () => { wrapper.unmount(); }); - test("Should navigate to navigateAfterSaveToHeritageFunnel if carId is not different on navigateForward", async () => { + test("carId is not different on navigateForward (car was found) => Should handle navigating forward with car match", async () => { // Arrange const { wrapper } = setupMocks({}); wrapper.vm.$refs.funnelFooter.updateButtonText = jest.fn(); wrapper.vm.$refs.loadingModal.showModal = jest.fn(); navigateToHeritage.navigateAfterSaveToHeritageFunnel = jest.fn(); + wrapper.vm.navigateForwardWithSingleCarMatch = jest.fn(); // Act wrapper.setData({ - selectedVehicleVin: ['5NMS3CADXLH233004'], - isSelectedGlassAvailableForVehicle: true, isCarIdDifferent: false, }); await wrapper.vm.navigateForward(); //Assert - expect(navigateToHeritage.navigateAfterSaveToHeritageFunnel).toBeCalledTimes(1); + expect(wrapper.vm.navigateForwardWithSingleCarMatch).toBeCalledTimes(1); wrapper.unmount(); }); - }); - function setupMocks({ - // modelValueProp = "1900", cmsQuestionText = "CMS text goes here", - // dataFromStoreApi = [], }) { //Mock store store.dispatch = jest.fn(() => {}); store.getters = { pageData: jest.fn((pageName) => { - // console.log('pageName: ', pageName) // address-vehicles return [ { vehicle: { @@ -295,9 +288,6 @@ function setupMocks({ } }; - // baseMixin.methods.dispatchStoreAction = jest.fn(); - - const mountOptions = getMountOptions({ store: { dispatch: store.dispatch, @@ -306,6 +296,7 @@ function setupMocks({ router: { navigate: jest.fn(), }, + mixins: [vinPagesMixin] }); //Mock props @@ -320,16 +311,6 @@ function setupMocks({ } return null; }), - // dispatchStoreAction: jest.fn(() => { - // console.log("23424243") - // }), - // isGlassAvailableForCarId: () => { - // console.log("%%%%%%%%%%%%%%%") - // return Promise.resolve(true) - // } - - // lookupVin: jest.fn(() => Promise.resolve(lookupVinResponse)), - }, computed: { dynamicStrings() { @@ -337,9 +318,6 @@ function setupMocks({ } } } - // mountOptions.propsData = { - // modelValue: modelValueProp, - // }; mountOptions.mixins = [mockMixin]; diff --git a/src/layouts/license-plate-lookup/license-plate-lookup.spec.js b/src/layouts/license-plate-lookup/license-plate-lookup.spec.js index 44ab645dd..b9fc4bd8f 100644 --- a/src/layouts/license-plate-lookup/license-plate-lookup.spec.js +++ b/src/layouts/license-plate-lookup/license-plate-lookup.spec.js @@ -9,6 +9,7 @@ import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { shallowMount } from "@vue/test-utils"; import { getMountOptions } from "@/helpers/unit-test-helper.js"; import { nextTick } from "vue"; +import { storeActions } from "@/constants/store-actions"; import { storeMutations } from "@/constants/store-mutations"; import store from "@/store"; @@ -484,7 +485,7 @@ describe("license-plate-lookup.vue", () => { expect(store.dispatch).toHaveBeenCalled(); }) - test("dispatch non blocking store action called on validate zip", async () => { + test("dispatchStoreAction called on validate zip", async () => { // Arrange const { wrapper } = setupMocks({}); @@ -497,7 +498,7 @@ describe("license-plate-lookup.vue", () => { expect(baseMixin.methods.dispatchStoreAction).toHaveBeenCalled(); }); - test("dispatch non blocking store action called on lookup vin", async () => { + test("dispatchStoreAction called on lookup vin", async () => { // Arrange const { wrapper } = setupMocks({}); @@ -514,11 +515,8 @@ describe("license-plate-lookup.vue", () => { function setupMocks({ pageHeaderWidgetHeaderText = {}, - mountOptionsMockData = { - router: { - navigate: jest.fn(), - }, - }, + mountOptionsMockData = {}, + partsOrQuestions = [] }) { store.commit(storeMutations.RESET_STATE); //Mock api responses @@ -536,6 +534,21 @@ function setupMocks({ }, }, }; + + mountOptionsMockData = { + ...mountOptionsMockData, + router: { + navigate: jest.fn(), + }, + actionList: [ + { + actionName: storeActions.GET_PARTS_OR_QUESTIONS, + data: { + partsOrQuestions: partsOrQuestions + } + }, + ] + } const apiPromise = Promise.resolve(apiResponses); diff --git a/src/mixins/vin-pages-mixin.js b/src/mixins/vin-pages-mixin.js new file mode 100644 index 000000000..8f33fdf92 --- /dev/null +++ b/src/mixins/vin-pages-mixin.js @@ -0,0 +1,28 @@ +import store from "@/store"; +import { storeActions } from "@/constants/store-actions.js"; +import { storeMutations } from "@/constants/store-mutations.js"; +import { navigateAfterSaveToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; + +export default { + methods: { + async navigateForwardWithSingleCarMatch() { + const result = await this.dispatchStoreAction(storeActions.GET_PARTS_OR_QUESTIONS); + + const partsOrQuestions = result.data.partsOrQuestions; + const hasPartsQuestions = partsOrQuestions.some(pq => pq.partQuestions?.length > 0); + const hasGlassLocationWithMultipleParts = partsOrQuestions.some(pq => pq.parts?.length > 1); + + if (hasPartsQuestions) { + this.$router.navigateAfterSave(this.navigationScenarios.SELECTED_VIN_WITH_PART_QUESTIONS, this.$route, {}, {}, result.data); + } + else if (hasGlassLocationWithMultipleParts) { + this.$router.navigateAfterSave(this.navigationScenarios.SELECTED_VIN_WITH_MULTIPLE_PARTS, this.$route, {}, {}, result.data); + } + else { + store.commit(storeMutations.UPDATE_PARTS, result.data); + this.$refs.loadingModal.showModal(); + navigateAfterSaveToHeritageFunnel(this.$route); + } + } + } +} \ No newline at end of file diff --git a/src/mixins/vin-pages-mixin.spec.js b/src/mixins/vin-pages-mixin.spec.js new file mode 100644 index 000000000..747b62793 --- /dev/null +++ b/src/mixins/vin-pages-mixin.spec.js @@ -0,0 +1,921 @@ +import vinPagesMixin from "@/mixins/vin-pages-mixin"; +import { shallowMount } from "@vue/test-utils"; +import { setupMocksForJsFiles, getMountOptions } from "@/helpers/unit-test-helper.js"; +import { storeActions } from "@/constants/store-actions"; +import { storeMutations } from "@/constants/store-mutations"; +import { navigationScenarios } from "@/router/router-constants/navigation-scenarios"; +import store from "@/store"; +import loadingModal from '@/common-components/loading-modal/loading-modal.vue'; +import { navigateAfterSaveToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; + +jest.mock("@/helpers/heritage-integration/navigation-helper", () => ({ + navigateAfterSaveToHeritageFunnel: jest.fn() +})); + +describe("vin-pages-mixin", () => { + afterEach(() => { + jest.clearAllMocks(); + }) + + describe("navigateForwardWithSingleCarMatch", () => { + describe("should go to parts-questions", () => { + test("single glass location has part question => go to parts-questions", async () => { + // Arrange + const partsOrQuestions = [ + { + "glassName": "Single", + "glassLocation": "Windshield", + "parts": null, + "partQuestions": [ + { + "questionSequence": 1, + "questionText": "Is there a line running across the bottom, driver's side then up the center of the Windshield?", + "answers": [ + { + "answerText": "Yes", + "nextQuestionSequence": null, + "answerResult": "DW01144" + }, + { + "answerText": "No", + "nextQuestionSequence": null, + "answerResult": "DW01143" + } + ] + } + ] + } + ]; + + const { wrapper } = setupMocks({ + partsOrQuestions: partsOrQuestions + }); + + // Act + await wrapper.vm.navigateForwardWithSingleCarMatch(); + + // Assert + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledTimes(1); + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledWith(navigationScenarios.SELECTED_VIN_WITH_PART_QUESTIONS, wrapper.vm.$route, {}, {}, { partsOrQuestions }); + }); + + test("multiple glass locations have part questions => go to parts-questions", async () => { + // Arrange + const partsOrQuestions = [ + { + "glassName": "Single", + "glassLocation": "Windshield", + "parts": null, + "partQuestions": [ + { + "questionSequence": 1, + "questionText": "Is there a line running across the bottom, driver's side then up the center of the Windshield?", + "answers": [ + { + "answerText": "Yes", + "nextQuestionSequence": null, + "answerResult": "DW01144" + }, + { + "answerText": "No", + "nextQuestionSequence": null, + "answerResult": "DW01143" + } + ] + } + ] + }, + { + "glassName": "Front", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DD08158GTYN", + "description": "driver side, front", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Quarter", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DQ08162GTYN", + "description": "driver side, 1 hole", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "SideDoor", + "glassLocation": "Driver", + "parts": null, + "partQuestions": [ + { + "questionSequence": 2, + "questionText": "Is this a super awesome question?", + "answers": [ + { + "answerText": "Yes", + "nextQuestionSequence": null, + "answerResult": "DW01144000" + }, + { + "answerText": "Super yes", + "nextQuestionSequence": null, + "answerResult": "DW01143001" + } + ] + } + ] + }, + { + "glassName": "Stationary", + "glassLocation": "Rear", + "parts": [ + { + "partNumber": "DB08165GTNN", + "description": "heated glass, stationary", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + } + ]; + + const { wrapper } = setupMocks({ + partsOrQuestions: partsOrQuestions + }); + + // Act + await wrapper.vm.navigateForwardWithSingleCarMatch(); + + // Assert + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledTimes(1); + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledWith(navigationScenarios.SELECTED_VIN_WITH_PART_QUESTIONS, wrapper.vm.$route, {}, {}, { partsOrQuestions }); + }); + + test("multiple glass locations selected, one has part question => go to parts-questions", async () => { + // Arrange + const partsOrQuestions = [ + { + "glassName": "Single", + "glassLocation": "Windshield", + "parts": null, + "partQuestions": [ + { + "questionSequence": 1, + "questionText": "Is there a line running across the bottom, driver's side then up the center of the Windshield?", + "answers": [ + { + "answerText": "Yes", + "nextQuestionSequence": null, + "answerResult": "DW01144" + }, + { + "answerText": "No", + "nextQuestionSequence": null, + "answerResult": "DW01143" + } + ] + } + ] + }, + { + "glassName": "Front", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DD08158GTYN", + "description": "driver side, front", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Quarter", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DQ08162GTYN", + "description": "driver side, 1 hole", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "SideDoor", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DD08160GTYN", + "description": "driver side, body side, 1 hole", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Stationary", + "glassLocation": "Rear", + "parts": [ + { + "partNumber": "DB08165GTNN", + "description": "heated glass, stationary", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + } + ]; + + const { wrapper } = setupMocks({ + partsOrQuestions: partsOrQuestions + }); + + // Act + await wrapper.vm.navigateForwardWithSingleCarMatch(); + + // Assert + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledTimes(1); + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledWith(navigationScenarios.SELECTED_VIN_WITH_PART_QUESTIONS, wrapper.vm.$route, {}, {}, { partsOrQuestions }); + }); + + test("a selected glass location has part questions and multiple parts => go to parts-questions", async () => { + // Arrange + const partsOrQuestions = [ + { + "glassName": "Single", + "glassLocation": "Windshield", + "parts": null, + "partQuestions": [ + { + "questionSequence": 1, + "questionText": "Is there a line running across the bottom, driver's side then up the center of the Windshield?", + "answers": [ + { + "answerText": "Yes", + "nextQuestionSequence": null, + "answerResult": "DW01144" + }, + { + "answerText": "No", + "nextQuestionSequence": null, + "answerResult": "DW01143" + } + ] + } + ] + }, + { + "glassName": "Front", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DD08158GTYN", + "description": "driver side, front", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Quarter", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DQ08162GTYN", + "description": "driver side, 1 hole", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DQ08162YPYN", + "description": "driver side, 1 hole", + "color": "Gray Tint Privacy", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "SideDoor", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DD08160GTYN", + "description": "driver side, body side, 1 hole", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DD08160YPYN", + "description": "driver side, body side, 1 hole", + "color": "Gray Tint Privacy", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Stationary", + "glassLocation": "Rear", + "parts": [ + { + "partNumber": "DB08165GTNN", + "description": "heated glass, stationary", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DB08165YPNN", + "description": "heated glass, stationary", + "color": "Gray Tint Privacy", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DB08166GTNN", + "description": "stationary", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DB08167GTNN", + "description": "heated glass, movable, 8 hole", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DB08167YPNN", + "description": "heated glass, movable, 8 hole", + "color": "Gray Tint Privacy", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + } + ]; + + const { wrapper } = setupMocks({ + partsOrQuestions: partsOrQuestions + }); + + // Act + await wrapper.vm.navigateForwardWithSingleCarMatch(); + + // Assert + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledTimes(1); + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledWith(navigationScenarios.SELECTED_VIN_WITH_PART_QUESTIONS, wrapper.vm.$route, {}, {}, { partsOrQuestions }); + }); + }); + + describe("should go to vehicle-parts", () => { + test("single glass location has multiple parts => go to vehicle-parts", async () => { + // Arrange + const partsOrQuestions = [ + { + "glassName": "Stationary", + "glassLocation": "Rear", + "parts": [ + { + "partNumber": "FB25724GTYN", + "description": "heated glass, solar, antenna", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "FB25759GTYN", + "description": "heated glass, solar, antenna, w/diversity antenna", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + } + ]; + + const { wrapper } = setupMocks({ + partsOrQuestions: partsOrQuestions + }); + + // Act + await wrapper.vm.navigateForwardWithSingleCarMatch(); + + // Assert + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledTimes(1); + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledWith(navigationScenarios.SELECTED_VIN_WITH_MULTIPLE_PARTS, wrapper.vm.$route, {}, {}, { partsOrQuestions }); + }); + + test("multiple glass locations selected, one of them has multiple parts => go to vehicle parts", async () => { + // Arrange + const partsOrQuestions = [ + { + "glassName": "Single", + "glassLocation": "Windshield", + "parts": [ + { + "partNumber": "FW03647GTNN", + "description": "solar, 3rd visor band", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": [ + { + "partNumber": "MWF03647", + "partType": "MOULDING", + "description": "Upper " + } + ] + } + ], + "partQuestions": null + }, + { + "glassName": "Back", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "FD25747GTYN", + "description": "solar, driver side, rear, ex models and above", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Front", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "FD25719GTYN", + "description": "solar, driver side, front, ex models and above", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Vent", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "FV25749GTNN", + "description": "solar, driver side, rear", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Stationary", + "glassLocation": "Rear", + "parts": [ + { + "partNumber": "FB25724GTYN", + "description": "heated glass, solar, antenna", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "FB25759GTYN", + "description": "heated glass, solar, antenna, w/diversity antenna", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + } + ]; + + const { wrapper } = setupMocks({ + partsOrQuestions: partsOrQuestions + }); + + // Act + await wrapper.vm.navigateForwardWithSingleCarMatch(); + + // Assert + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledTimes(1); + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledWith(navigationScenarios.SELECTED_VIN_WITH_MULTIPLE_PARTS, wrapper.vm.$route, {}, {}, { partsOrQuestions }); + }); + + test("multiple glass locations selected, multiple have multiple parts => go to vehicle-parts", async () => { + // Arrange + const partsOrQuestions = [ + { + "glassName": "Single", + "glassLocation": "Windshield", + "parts": [ + { + "partNumber": "DW02101GTYN", + "description": "solar", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Back", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DD12202GTYN", + "description": "solar, driver side, rear", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DD12202YPYN", + "description": "solar, driver side, rear", + "color": "Gray Tint Privacy", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Front", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DD12198GTYN", + "description": "solar, driver side, front", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DD12200GTYN", + "description": "solar, driver side, front, laminated, soundproofing", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Quarter", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "DQ12204GTYNOEM", + "description": "solar, driver side, encap", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DQ12204YPYNOEM", + "description": "solar, driver side, encap", + "color": "Gray Tint Privacy", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DQ12205GTYNOEM", + "description": "solar, antenna, driver side, encap", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DQ12205YPYNOEM", + "description": "solar, antenna, driver side, encap", + "color": "Gray Tint Privacy", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DQ12207GTYN", + "description": "solar, driver side, encap, chrome molding", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DQ12207YPYNOEM", + "description": "solar, driver side, encap, chrome molding", + "color": "Gray Tint Privacy", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DQ12208GTYNOEM", + "description": "solar, antenna, driver side, encap, chrome molding", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DQ12208YPYNOEM", + "description": "solar, antenna, driver side, encap, chrome molding", + "color": "Gray Tint Privacy", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Stationary", + "glassLocation": "Rear", + "parts": [ + { + "partNumber": "DB12209GTYN", + "description": "heated glass, solar, 1 hole", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + }, + { + "partNumber": "DB12209YPYN", + "description": "heated glass, solar, 1 hole", + "color": "Gray Tint Privacy", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + } + ]; + + const { wrapper } = setupMocks({ + partsOrQuestions: partsOrQuestions + }); + + // Act + await wrapper.vm.navigateForwardWithSingleCarMatch(); + + // Assert + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledTimes(1); + expect(wrapper.vm.$router.navigateAfterSave).toHaveBeenCalledWith(navigationScenarios.SELECTED_VIN_WITH_MULTIPLE_PARTS, wrapper.vm.$route, {}, {}, { partsOrQuestions }); + }); + }); + + describe("should go to heritage funnel", () => { + test("single glass location selected, has no part questions and has one part => go to heritage funnel", async () => { + // Arrange + const partsOrQuestions = [ + { + "glassName": "Single", + "glassLocation": "Windshield", + "parts": [ + { + "partNumber": "FW04186GTYN", + "description": "solar, soundproofing, lane keep assist", + "color": "Green Tint", + "requiresRecalibration": true, + "requiresCapabilityQuestions": false, + "childParts": [ + { + "partNumber": "GGG 3563 KIT", + "partType": "MOULDING", + "description": "Kit, Top & Sides " + } + ] + } + ], + "partQuestions": null + } + ] + + const { wrapper } = setupMocks({ + partsOrQuestions: partsOrQuestions + }); + + // Act + await wrapper.vm.navigateForwardWithSingleCarMatch(); + + // Assert + expect(navigateAfterSaveToHeritageFunnel).toHaveBeenCalledTimes(1); + }); + + test("multiple glass locations selected, each has one part and no part questions => go to heritage funnel", async () => { + // Arrange + const partsOrQuestions = [ + { + "glassName": "Single", + "glassLocation": "Windshield", + "parts": [ + { + "partNumber": "FW04186GTYN", + "description": "solar, soundproofing, lane keep assist", + "color": "Green Tint", + "requiresRecalibration": true, + "requiresCapabilityQuestions": false, + "childParts": [ + { + "partNumber": "GGG 3563 KIT", + "partType": "MOULDING", + "description": "Kit, Top & Sides " + } + ] + } + ], + "partQuestions": null + }, + { + "glassName": "Back", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "FD25457GTYN", + "description": "solar, driver side, rear", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Front", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "FD27090GTYN", + "description": "solar, driver side, front", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Vent", + "glassLocation": "Driver", + "parts": [ + { + "partNumber": "FV25459GTNN", + "description": "solar, driver side, rear", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + }, + { + "glassName": "Stationary", + "glassLocation": "Rear", + "parts": [ + { + "partNumber": "FB25460GTYN", + "description": "heated glass, solar", + "color": "Green Tint", + "requiresRecalibration": false, + "requiresCapabilityQuestions": false, + "childParts": null + } + ], + "partQuestions": null + } + ]; + + const { wrapper } = setupMocks({ + partsOrQuestions: partsOrQuestions + }); + + // wrapper.vm.navigateAfterSaveToHeritageFunnel = jest.fn(); + store.commit = jest.fn(); + + // Act + await wrapper.vm.navigateForwardWithSingleCarMatch(); + + // Assert + expect(store.commit).toHaveBeenCalledTimes(1); + expect(store.commit).toHaveBeenCalledWith(storeMutations.UPDATE_PARTS, { partsOrQuestions }) + expect(wrapper.vm.$refs.loadingModal.showModal).toHaveBeenCalledTimes(1); + expect(navigateAfterSaveToHeritageFunnel).toHaveBeenCalledTimes(1); + }); + }); + }); +}); + +function setupMocks({ partsOrQuestions = [] }) { + const baseMixin = setupMocksForJsFiles({ + actionList: [ + { + actionName: storeActions.GET_PARTS_OR_QUESTIONS, + data: { + partsOrQuestions: partsOrQuestions + } + }, + ], + }); + + const mocks = getMountOptions({ + router: { + navigateAfterSave: jest.fn() + }, + + }); + + const mockVinComponent = { + components: { loadingModal }, + template: '', + // render() { + // return '
' + // }, + mixins: [vinPagesMixin, baseMixin.baseMixin] + }; + + // const mockVinComponent = Vue.component("mockcomponent", { + // template: '', + // mixins: [vinPagesMixin, baseMixin.baseMixin] + // }) + + const wrapper = shallowMount(mockVinComponent, mocks); + + wrapper.vm.$refs.loadingModal.showModal = jest.fn(); + + return { wrapper }; +} \ No newline at end of file