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: '