diff --git a/src/constants/external-parameters.js b/src/constants/external-parameters.js new file mode 100644 index 000000000..686e29235 --- /dev/null +++ b/src/constants/external-parameters.js @@ -0,0 +1,6 @@ +const externalParameterStatus = { + NOT_SET: null, + ACTIVE: 1, + INACTIVE: 0, +}; +export { externalParameterStatus }; \ No newline at end of file diff --git a/src/layouts/quote/quote.spec.js b/src/layouts/quote/quote.spec.js index d9c1ffabf..c83801693 100644 --- a/src/layouts/quote/quote.spec.js +++ b/src/layouts/quote/quote.spec.js @@ -65,6 +65,24 @@ jest.mock("@/mixins/base-mixin", () => ({ }, })); +const mockExperimentSettings = experimentSettings; + +jest.mock("@/mixins/experiment-mixin.js", () => ({ + methods: { + getSettingValue(settingName) { + if (settingName === mockExperimentSettings.SERVICE_PACKAGE_DISCOUNT) { + return true; + } + if (settingName === mockExperimentSettings.INSURANCE_TAB_TO_DISPLAY_THRESHOLD_INTERNAL) { + return 300; + } else if (settingName === mockExperimentSettings.INSURANCE_TAB_TO_DISPLAY_THRESHOLD_EXTERNAL) { + return 500; + } + return "test"; + }, + }, +})); + const mockMixin = { methods: { filterOutFees: jest.fn().mockImplementation(() => { @@ -73,12 +91,6 @@ const mockMixin = { isFormValid: jest.fn().mockImplementation(() => { return true; }), - getSettingValue: jest.fn((settingName) => { - if (settingName === experimentSettings.SERVICE_PACKAGE_DISCOUNT) { - return true; - } - return false; - }), }, }; let mockTierOnePrice = 501; @@ -261,7 +273,7 @@ describe("quote.vue", () => { }; const { wrapper } = setupMocks({}); - //mock this to avoid needing to populate this.$route in an unrelated test + //mock this to avoid needing to populate this.$route in an unrelated test wrapper.vm.getDefaultIsInsuranceSelectedValue = jest.fn(); //Act @@ -309,7 +321,7 @@ describe("quote.vue", () => { wrapper.vm.$route = { query: { isInsurance: "false" } }; - const isServicePackageDiscount = mockMixin.methods.getSettingValue( + const isServicePackageDiscount = experimentMixin.methods.getSettingValue( experimentSettings.SERVICE_PACKAGE_DISCOUNT ); @@ -701,7 +713,7 @@ describe("quote.vue", () => { inactivePromos: [], }, }, - externalParameterState: { isExternalParameter: true }, + externalParameterState: { isExternalParameter: 1 }, externalParameterQuote: { isInsurance: true, servicePackage: "glassonly", @@ -758,8 +770,6 @@ function setupMocks({ customMountOptions }) { baseMixin.methods.ResetExternalParamsAndHideModal = jest.fn(); baseMixin.methods.isFormValid = jest.fn().mockReturnValue(true); mountOptions.global.mocks["$store"] = store; - store.getters.experimentSettings = "test value"; - mountOptions["attachTo"] = document.body; const wrapper = shallowMount(quote, mountOptions); diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index 6b67561ec..6a0a5de24 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -136,6 +136,8 @@ import { nextTick } from "vue"; import { packageNames } from "@/constants/package-names"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; import { containsRecalParts } from "@/helpers/recal-helper"; +import { externalParameterStatus } from "@/constants/external-parameters"; + defineRule("option-required", required(errorMessages.OPTION_REQUIRED)); const INSURANCE_TAB_TO_DISPLAY_THRESHOLD_DEFAULT = 300; @@ -336,13 +338,20 @@ export default { let internalThreshold = experimentMixin.methods.getSettingValue( experimentSettings.INSURANCE_TAB_TO_DISPLAY_THRESHOLD_INTERNAL ); - const isExternalParameter = store.getters.externalParameterState?.isExternalParameter; - if (isExternalParameter !== undefined) { - // user is from an external source (either has value or is null) + if (isExternalParameter === externalParameterStatus.NOT_SET) { + // there are no active or inactive external parameters; use internal threshold + if (internalThreshold) thresholdToUse = internalThreshold; - if (store.getters.externalParameterQuote.isInsurance == true) { + vm.isInsuranceSelected = getIsInsuranceSelectedValue( + vm.availableLineItems, + thresholdToUse + ); + baseMixin.methods.ResetExternalParamsAndHideModal(); + } else { + // user came from an external source + if (store.getters.externalParameterQuote?.isInsurance == true) { // did user intentionally select insurance? vm.isInsuranceSelected = true; vm.servicePackage = store.getters.externalParameterQuote.servicePackage; @@ -365,15 +374,6 @@ export default { ); baseMixin.methods.ResetExternalParamsAndHideModal(); } - } else { - // there are no external parameters; use internal threshold - if (internalThreshold) thresholdToUse = internalThreshold; - - vm.isInsuranceSelected = getIsInsuranceSelectedValue( - vm.availableLineItems, - thresholdToUse - ); - baseMixin.methods.ResetExternalParamsAndHideModal(); } }); }, @@ -571,7 +571,7 @@ export default { } }); this.$nextTick(() => { - const availablePackageNames = this.$refs.servicePackage.servicePackageAnswers; + const availablePackageNames = this.$refs.servicePackage?.servicePackageAnswers; var eventLabel = ""; availablePackageNames?.forEach((tier) => { if (tier) { diff --git a/src/router/index.js b/src/router/index.js index 4c57921b7..9d4417ff8 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -10,6 +10,7 @@ import { getQuerystringParameter } from "@/helpers/querystring-helper"; import { getDeviceIdValue } from "@/helpers/heritage-integration/cookie-helper"; import { showFmgLoadingModal } from "@/helpers/loading-modal-helper"; import { fmgPageValues, funnelStartPageName } from "@/router/router-constants/fmgPage-values"; +import { externalParameterStatus } from "@/constants/external-parameters"; // Heritage integration import { isSavedSessionStillActive } from "@/helpers/heritage-integration/session-helper"; @@ -264,7 +265,7 @@ router.beforeEach(async (to, from, next) => { ); // If alert event is on the bus, then display the alert if (alertEvent !== undefined || unknownAlertEvent !== undefined) { - store.commit(storeMutations.UPDATE_IS_EXTERNAL_PARAMETER, false); + store.commit(storeMutations.UPDATE_IS_EXTERNAL_PARAMETER, externalParameterStatus.INACTIVE); } } // fromPaymentToConfirmation workaround for navigating from an iframe but @@ -540,7 +541,7 @@ async function DisplayPageError() { type: globalEventTypes.Danger, } ); - store.commit(storeMutations.UPDATE_IS_EXTERNAL_PARAMETER, false); + store.commit(storeMutations.UPDATE_IS_EXTERNAL_PARAMETER, externalParameterStatus.INACTIVE); baseMixin.methods.dispatchStoreAction(storeActions.RESET_SAVE_SESSION_PROMISE); const pageError = getQuerystringParameter(queryStrings.PAGE_ERROR); @@ -639,7 +640,7 @@ function updateExternalParameterState() { externalParameterModel && externalParameterStyle ) { - store.commit(storeMutations.UPDATE_IS_EXTERNAL_PARAMETER, true); + store.commit(storeMutations.UPDATE_IS_EXTERNAL_PARAMETER, externalParameterStatus.ACTIVE); store.commit(storeMutations.UPDATE_EXTERNAL_PARAMETER_YEAR, externalParameterYear); store.commit(storeMutations.UPDATE_EXTERNAL_PARAMETER_MAKE, externalParameterMake); store.commit(storeMutations.UPDATE_EXTERNAL_PARAMETER_MODEL, externalParameterModel); diff --git a/src/store/index.js b/src/store/index.js index fedea9fd4..f100a09eb 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -42,6 +42,7 @@ import { coverageTypeEnum, } from "@/constants/insurance"; import { containsRecalParts } from "@/helpers/recal-helper"; +import { externalParameterStatus } from "@/constants/external-parameters"; // Export State const getDefaultState = () => { @@ -507,7 +508,7 @@ export const mutations = { saveExternalParameterState(externalParameterState); }, resetIsExternalParameter(state) { - externalParameterState.isExternalParameter = null; + externalParameterState.isExternalParameter = externalParameterStatus.INACTIVE; saveExternalParameterState(externalParameterState); }, @@ -3461,6 +3462,7 @@ async function resetScheduleIfUnavailable(context, order, pageNameToLog) { function createExternalParameterDefaultState() { // create default externalParameter state const externalParameterDefaultState = { + isExternalParameter: externalParameterStatus.NOT_SET, vehicle: { year: null, make: null,