diff --git a/src/constants/experiments.js b/src/constants/experiments.js index b470cc425..1cd1260a7 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -52,6 +52,12 @@ const experimentSettings = { // Claim and Coverage for 2.0 ENABLE_NON_CLAIM_AND_COVERAGE_FLOW: "EnableNonC&CFlow", NON_CLAIM_AND_COVERAGE_TEST_PARENT_ACCOUNT: "NonC&CTestParentAccount", + + // Service Package Name + SHOW_SERVICE_PACKAGE_NAME_TEST: "ShowServicePackageNameTest", + TIER_ONE: "TierOne", + TIER_TWO: "TierTwo", + TIER_THREE: "TierThree", }; const experimentTriggers = { diff --git a/src/helpers/service-package-helper.js b/src/helpers/service-package-helper.js index d3fc3f01b..f43680dd2 100644 --- a/src/helpers/service-package-helper.js +++ b/src/helpers/service-package-helper.js @@ -1,12 +1,20 @@ import { partTypeStrings } from "@/constants/part-type-strings"; import { damageLocationsSelected as glassLocations } from "@/constants/damage-locations-selected"; import { packageNames, externalParamPackageLabels } from "@/constants/package-names"; +import { experimentSettings } from "@/constants/experiments"; import baseMixin from "@/mixins/base-mixin.js"; import { getItemsWithoutRecalParts } from "@/helpers/recal-helper"; import { getPromosThatMatchLineItemsOnOrder, removeVapsPromosFromPromoArray, } from "@/helpers/promotions-helper"; +import * as experimentHelper from "@/helpers/experiment-helper"; + +const tierExperimentSettingKeys = { + [packageNames.TIER_ONE]: experimentSettings.TIER_ONE, + [packageNames.TIER_TWO]: experimentSettings.TIER_TWO, + [packageNames.TIER_THREE]: experimentSettings.TIER_THREE, +}; export function containsLineItemWithPartType(typeToFind, itemsToSearch) { const partTypeMatches = findLineItemsWithPartType(typeToFind, itemsToSearch); @@ -267,6 +275,27 @@ export function getPackageLabel(packageName) { } } +export function isServicePackageNameTestActive(experimentSettingsMap) { + return experimentHelper.hasSettingEqualTo( + experimentSettings.SHOW_SERVICE_PACKAGE_NAME_TEST, + "true", + experimentSettingsMap + ); +} + +export function getExperimentPackageDisplayName(tierName, experimentSettingsMap) { + if (!isServicePackageNameTestActive(experimentSettingsMap)) { + return null; + } + + const settingKey = tierExperimentSettingKeys[tierName]; + if (!settingKey) { + return null; + } + + return experimentHelper.getSettingValue(settingKey, experimentSettingsMap); +} + function maxTier(tierA, tierB) { if (tierA === packageNames.TIER_THREE || tierB === packageNames.TIER_THREE) { return packageNames.TIER_THREE; diff --git a/src/helpers/service-package-helper.spec.js b/src/helpers/service-package-helper.spec.js index 65ed91fe9..495436c8d 100644 --- a/src/helpers/service-package-helper.spec.js +++ b/src/helpers/service-package-helper.spec.js @@ -966,6 +966,68 @@ describe("service-package-helper.js", () => { expect(result).toEqual(packageNames.TIER_ONE); }); }); + + describe("getExperimentPackageDisplayName", () => { + const { experimentSettings } = require("@/constants/experiments"); + + it("Returns null when the experiment is not active", () => { + const result = servicePackageHelper.getExperimentPackageDisplayName( + packageNames.TIER_ONE, + {} + ); + + expect(result).toBeNull(); + }); + + it("Returns null when the test flag is not true", () => { + const result = servicePackageHelper.getExperimentPackageDisplayName( + packageNames.TIER_ONE, + { + [experimentSettings.SHOW_SERVICE_PACKAGE_NAME_TEST]: "false", + [experimentSettings.TIER_ONE]: "Essential", + } + ); + + expect(result).toBeNull(); + }); + + it("Returns the experiment display name for each tier when active", () => { + const experimentSettingsMap = { + [experimentSettings.SHOW_SERVICE_PACKAGE_NAME_TEST]: "true", + [experimentSettings.TIER_ONE]: "Essential", + [experimentSettings.TIER_TWO]: "Plus", + [experimentSettings.TIER_THREE]: "Full Service", + }; + + expect( + servicePackageHelper.getExperimentPackageDisplayName( + packageNames.TIER_ONE, + experimentSettingsMap + ) + ).toBe("Essential"); + expect( + servicePackageHelper.getExperimentPackageDisplayName( + packageNames.TIER_TWO, + experimentSettingsMap + ) + ).toBe("Plus"); + expect( + servicePackageHelper.getExperimentPackageDisplayName( + packageNames.TIER_THREE, + experimentSettingsMap + ) + ).toBe("Full Service"); + }); + + it("Returns null for an unknown tier", () => { + const result = servicePackageHelper.getExperimentPackageDisplayName("UnknownTier", { + [experimentSettings.SHOW_SERVICE_PACKAGE_NAME_TEST]: "true", + [experimentSettings.TIER_ONE]: "Essential", + }); + + expect(result).toBeNull(); + }); + }); }); // Constants diff --git a/src/layouts/quote/service-package-question/service-package-question.spec.js b/src/layouts/quote/service-package-question/service-package-question.spec.js index f87faeec8..1d0f78c1a 100644 --- a/src/layouts/quote/service-package-question/service-package-question.spec.js +++ b/src/layouts/quote/service-package-question/service-package-question.spec.js @@ -817,6 +817,79 @@ describe("service-package-question.vue, matching business rules for package disp expectedModifiedAnswers[packageNameKey].tierThree ); }); + it("should use experiment package names when ServicePackageNameTest is active", () => { + const getExperimentPackageLabelSpy = jest + .spyOn(servicePackageQuestion.methods, "getExperimentPackageLabel") + .mockImplementation((tierName) => { + const experimentPackageNames = { + [packageNames.TIER_ONE]: "Essential", + [packageNames.TIER_TWO]: "Plus", + [packageNames.TIER_THREE]: "Full Service", + }; + + return experimentPackageNames[tierName] ?? null; + }); + + const packageNameKey = "05_01_CSR_Quote_Standard_Repair"; + Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); + mockProps.availableLineItems.push(driverFrontWiperLineItem); + mockProps.availableLineItems.push(passengerFrontWiperLineItem); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: true, + glassToReplace: [], + }, + }, + hasAnyNonWindshieldGlassParts: false, + }, + }, + }, + }); + + expect(wrapper.vm.servicePackageAnswers[0].buttonLabel).toBe("Essential"); + expect(wrapper.vm.servicePackageAnswers[1].buttonLabel).toBe("Plus"); + expect(wrapper.vm.servicePackageAnswers[2].buttonLabel).toBe("Full Service"); + + getExperimentPackageLabelSpy.mockRestore(); + }); + it("should use CMS package names when ServicePackageNameTest is not active", () => { + const packageNameKey = "05_01_CSR_Quote_Standard_Repair"; + Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); + mockProps.availableLineItems.push(driverFrontWiperLineItem); + mockProps.availableLineItems.push(passengerFrontWiperLineItem); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: true, + glassToReplace: [], + }, + }, + hasAnyNonWindshieldGlassParts: false, + }, + }, + }, + }); + + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[0], + expectedModifiedAnswers[packageNameKey].tierOne + ); + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[1], + expectedModifiedAnswers[packageNameKey].tierTwo + ); + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[2], + expectedModifiedAnswers[packageNameKey].tierThree + ); + }); }); function runPackageAnswerExpectStatements(servicePackageAnswer, expectedOutput) { diff --git a/src/layouts/quote/service-package-question/service-package-question.vue b/src/layouts/quote/service-package-question/service-package-question.vue index 72472e195..4a54ee3f5 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -141,7 +141,7 @@ export default { const modifiedAnswers = cmsAnswersContent.map((answer) => ({ value: answer.Name, - buttonLabel: this.getHeaderTextFromCms(answer.SubWidgetName), + buttonLabel: this.getPackageButtonLabel(answer.Name, answer.SubWidgetName), buttonLabelSubCopy: this.getSubheaderTextFromCms(answer.SubWidgetName), buttonBodyCopy: this.getBodyTextFromCms(answer.SubWidgetName), //The package supports service-package-discount if it has the text value in CMS @@ -259,6 +259,29 @@ export default { } return this.servicePackageRadio; }, + getPackageButtonLabel(tierName, subWidgetName) { + return ( + this.getExperimentPackageLabel(tierName) ?? this.getHeaderTextFromCms(subWidgetName) + ); + }, + getExperimentPackageLabel(tierName) { + if ( + !experimentMixin.methods.hasSettingEqualTo( + experimentSettings.SHOW_SERVICE_PACKAGE_NAME_TEST, + "true" + ) + ) { + return null; + } + + const tierSettingKey = { + [packageNames.TIER_ONE]: experimentSettings.TIER_ONE, + [packageNames.TIER_TWO]: experimentSettings.TIER_TWO, + [packageNames.TIER_THREE]: experimentSettings.TIER_THREE, + }[tierName]; + + return tierSettingKey ? experimentMixin.methods.getSettingValue(tierSettingKey) : null; + }, getHeaderTextFromCms(cmsWidgetName) { return this.getCmsContent(cmsWidgetName, "HeaderText"); },