diff --git a/src/constants/experiments.js b/src/constants/experiments.js index 18676ce4..b5af7dbc 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -4,7 +4,11 @@ const experimentUniverses = Object.freeze({ const experimentSettings = Object.freeze({ GOOGLE_CUSTOM_DIMENSION_INDEX: 'Google Custom Dimension Index', - ISS_DISPLAY_PAY_IN_ADVANCE: 'DisplayPIAInsurance' + ISS_DISPLAY_PAY_IN_ADVANCE: 'DisplayPIAInsurance', + ISS_FEATURE_TOGGLE_IS_MOBILE_FEE_HIDDEN: 'HideMobileFee', + ISS_FEATURE_TOGGLE_IS_MOBILE_FEE_OVERRIDDEN: 'OverrideMobileFee', + ISS_FEATURE_TOGGLE_IS_RECYCLE_FEE_HIDDEN: 'HideRecycleFee', + ISS_FEATURE_TOGGLE_IS_RECYCLE_FEE_OVERRIDDEN: 'OverrideRecycleFee' }); const experimentTriggers = Object.freeze({ diff --git a/src/helpers/experiment-helper.js b/src/helpers/experiment-helper.js new file mode 100644 index 00000000..861b2ad2 --- /dev/null +++ b/src/helpers/experiment-helper.js @@ -0,0 +1,24 @@ +/* eslint-disable max-len */ +import { experimentSettings } from '@/constants/experiments'; + +export function hasExperimentSetting(storeExperimentSettings, settingName) { + return Object.hasOwn(storeExperimentSettings, settingName); +} + +export function getExperimentSettingValue(storeExperimentSettings, settingName) { + return hasExperimentSetting(storeExperimentSettings, settingName) + ? storeExperimentSettings[settingName] + : null; +} + +export function getFeatureTogglesQueryString(storeExperimentSettings) { + const isMobileFeeHidden = getExperimentSettingValue(storeExperimentSettings, experimentSettings.ISS_FEATURE_TOGGLE_IS_MOBILE_FEE_HIDDEN) === 'true'; + const isMobileFeeOverridden = getExperimentSettingValue(storeExperimentSettings, experimentSettings.ISS_FEATURE_TOGGLE_IS_MOBILE_FEE_OVERRIDDEN) === 'true'; + const isRecycleFeeHidden = getExperimentSettingValue(storeExperimentSettings, experimentSettings.ISS_FEATURE_TOGGLE_IS_RECYCLE_FEE_HIDDEN) === 'true'; + const isRecycleFeeOverridden = getExperimentSettingValue(storeExperimentSettings, experimentSettings.ISS_FEATURE_TOGGLE_IS_RECYCLE_FEE_OVERRIDDEN) === 'true'; + + return `FeatureToggles.IsMobileFeeHidden=${isMobileFeeHidden}` + + `&FeatureToggles.IsMobileFeeOverridden=${isMobileFeeOverridden}` + + `&FeatureToggles.IsRecycleFeeHidden=${isRecycleFeeHidden}` + + `&FeatureToggles.IsRecycleFeeOverridden=${isRecycleFeeOverridden}`; +} diff --git a/src/iss-components/cart-dropdown/cart-dropdown.spec.js b/src/iss-components/cart-dropdown/cart-dropdown.spec.js index 265a3e13..dcf6ddc7 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.spec.js +++ b/src/iss-components/cart-dropdown/cart-dropdown.spec.js @@ -3,7 +3,7 @@ import { createTestingPinia } from '@pinia/testing'; import cartDropdown from '@/iss-components/cart-dropdown/cart-dropdown.vue'; // Supporting Files -import {getEnumName, getMountOptions} from '@/helpers/unit-test-helper.js'; +import { getEnumName, getMountOptions } from '@/helpers/unit-test-helper.js'; import { useMainStore, getDefaultState } from '@/store'; import { formatAmountInDollars } from '@/helpers/text-helper.js'; import partTypeStrings from '@/constants/part-type-strings'; @@ -43,6 +43,7 @@ function getMountedComponent(mainInitialState = {}, initialData = {}, propsData }); useMainStore(testingPinia); + mountOptions.global.mixins[0].methods.getSettingValue = jest.fn(() => 'false'); mountOptions.global.plugins = [testingPinia]; mountOptions.data = () => (initialData); mountOptions.propsData = propsData; @@ -1338,7 +1339,6 @@ describe('cart-dropdown component', () => { const { wrapper } = getMountedComponent(storeData); formatAmountInDollars.mockReturnValueOnce(dollarAmount); - // Act const result = wrapper.vm.getDisplayed(0); diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index c7eb6a57..887a99f5 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -163,6 +163,7 @@ import { formatAmountInDollars } from '@/helpers/text-helper.js'; import { getHighestFullySatisfiedTier, getPackageContents } from '@/helpers/service-package-helper.js'; // Constants +import { experimentSettings } from '@/constants/experiments'; import partTypeStrings from '@/constants/part-type-strings.js'; import cartItemType from '@/constants/cart-item-type.js'; import widgetFields from '@/constants/cms-widget-fields.js'; @@ -322,10 +323,12 @@ export default { } }); const items = vapsCartItemsNotInPackage.filter((item) => item != null); - if (this.recycleFeeCartItem) { + const isRecycleFeeHidden = this.getSettingValue(experimentSettings.ISS_FEATURE_TOGGLE_IS_RECYCLE_FEE_HIDDEN) === 'true'; + const isMobileFeeHidden = this.getSettingValue(experimentSettings.ISS_FEATURE_TOGGLE_IS_MOBILE_FEE_HIDDEN) === 'true'; + if (this.recycleFeeCartItem && !isRecycleFeeHidden) { items.push(this.recycleFeeCartItem); } - if (this.mobileFeeCartItem) { + if (this.mobileFeeCartItem && !isMobileFeeHidden) { items.push(this.mobileFeeCartItem); } return items; diff --git a/src/layouts/order-confirmation/order-confirmation.spec.js b/src/layouts/order-confirmation/order-confirmation.spec.js index abd7c86b..80cead3a 100644 --- a/src/layouts/order-confirmation/order-confirmation.spec.js +++ b/src/layouts/order-confirmation/order-confirmation.spec.js @@ -9,8 +9,8 @@ import { fetchCmsContentForPage } from '@/helpers/cms-content-helper'; import { mount } from '@vue/test-utils'; import { createTestingPinia } from '@pinia/testing'; import { nextTick } from 'vue'; -import coverageStatuses from "@/constants/coverage-statuses"; -import coverageType from "@/constants/coverage-type"; +import coverageStatuses from '@/constants/coverage-statuses'; +import coverageType from '@/constants/coverage-type'; jest.mock('@/helpers/layout-helper.js', () => jest.fn()); @@ -173,6 +173,7 @@ function getMountedComponent(mainInitialState = {}, initialData = {}, methodToRu useMainStore(testingPinia); methodToRun(); + mountOptions.global.mixins[0].methods.getSettingValue = jest.fn(() => 'false'); mountOptions.global.plugins = [testingPinia]; mountOptions.mixins = [mockMixin]; mountOptions.data = () => ( diff --git a/src/store/index.js b/src/store/index.js index c36f5887..3ba9011f 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -28,6 +28,7 @@ import partNumberStrings from '@/constants/part-number-strings'; import { getLineItemsFlattened } from '@/helpers/line-items-helper'; import { buildQueryStringParameterFromArrayOfComplexObjects, getLineItemQueryString, getTaxLineItemQueryString } from '@/helpers/querystring-helper'; import coverageType from '@/constants/coverage-type'; +import { getFeatureTogglesQueryString } from '@/helpers/experiment-helper'; const storeId = 'main'; @@ -1034,6 +1035,7 @@ export const useMainStore = defineStore({ async getInsurancePriceOrderItems(availableLineItems) { const { serviceLocation, currentDeductible } = this.order; const lineItemsQueryString = getLineItemQueryString(availableLineItems, 'lineItems'); + const featureTogglesQueryString = getFeatureTogglesQueryString(this.experimentSettings); let queryString = `ParentAccountNumber=${this.order.parentAccountNumber}` @@ -1041,6 +1043,7 @@ export const useMainStore = defineStore({ + `&CTU=${serviceLocation.zipCodeCtu}` + `&Deductible=${currentDeductible ?? 0}` + `&ZipCode=${serviceLocation.zipCode}` + + `&${featureTogglesQueryString}` + `${lineItemsQueryString}`; const lineItemServerData = this.order.lineItems?.serverData;