Merge pull request #3254 from Safelite/feature/CASH-2948
CASH-2948: ServicePackageNameTest experiment
This commit is contained in:
commit
4864784828
5 changed files with 194 additions and 1 deletions
|
|
@ -52,6 +52,12 @@ const experimentSettings = {
|
||||||
// Claim and Coverage for 2.0
|
// Claim and Coverage for 2.0
|
||||||
ENABLE_NON_CLAIM_AND_COVERAGE_FLOW: "EnableNonC&CFlow",
|
ENABLE_NON_CLAIM_AND_COVERAGE_FLOW: "EnableNonC&CFlow",
|
||||||
NON_CLAIM_AND_COVERAGE_TEST_PARENT_ACCOUNT: "NonC&CTestParentAccount",
|
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 = {
|
const experimentTriggers = {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,20 @@
|
||||||
import { partTypeStrings } from "@/constants/part-type-strings";
|
import { partTypeStrings } from "@/constants/part-type-strings";
|
||||||
import { damageLocationsSelected as glassLocations } from "@/constants/damage-locations-selected";
|
import { damageLocationsSelected as glassLocations } from "@/constants/damage-locations-selected";
|
||||||
import { packageNames, externalParamPackageLabels } from "@/constants/package-names";
|
import { packageNames, externalParamPackageLabels } from "@/constants/package-names";
|
||||||
|
import { experimentSettings } from "@/constants/experiments";
|
||||||
import baseMixin from "@/mixins/base-mixin.js";
|
import baseMixin from "@/mixins/base-mixin.js";
|
||||||
import { getItemsWithoutRecalParts } from "@/helpers/recal-helper";
|
import { getItemsWithoutRecalParts } from "@/helpers/recal-helper";
|
||||||
import {
|
import {
|
||||||
getPromosThatMatchLineItemsOnOrder,
|
getPromosThatMatchLineItemsOnOrder,
|
||||||
removeVapsPromosFromPromoArray,
|
removeVapsPromosFromPromoArray,
|
||||||
} from "@/helpers/promotions-helper";
|
} 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) {
|
export function containsLineItemWithPartType(typeToFind, itemsToSearch) {
|
||||||
const partTypeMatches = findLineItemsWithPartType(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) {
|
function maxTier(tierA, tierB) {
|
||||||
if (tierA === packageNames.TIER_THREE || tierB === packageNames.TIER_THREE) {
|
if (tierA === packageNames.TIER_THREE || tierB === packageNames.TIER_THREE) {
|
||||||
return packageNames.TIER_THREE;
|
return packageNames.TIER_THREE;
|
||||||
|
|
|
||||||
|
|
@ -966,6 +966,68 @@ describe("service-package-helper.js", () => {
|
||||||
expect(result).toEqual(packageNames.TIER_ONE);
|
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
|
// Constants
|
||||||
|
|
|
||||||
|
|
@ -817,6 +817,79 @@ describe("service-package-question.vue, matching business rules for package disp
|
||||||
expectedModifiedAnswers[packageNameKey].tierThree
|
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) {
|
function runPackageAnswerExpectStatements(servicePackageAnswer, expectedOutput) {
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,7 @@ export default {
|
||||||
|
|
||||||
const modifiedAnswers = cmsAnswersContent.map((answer) => ({
|
const modifiedAnswers = cmsAnswersContent.map((answer) => ({
|
||||||
value: answer.Name,
|
value: answer.Name,
|
||||||
buttonLabel: this.getHeaderTextFromCms(answer.SubWidgetName),
|
buttonLabel: this.getPackageButtonLabel(answer.Name, answer.SubWidgetName),
|
||||||
buttonLabelSubCopy: this.getSubheaderTextFromCms(answer.SubWidgetName),
|
buttonLabelSubCopy: this.getSubheaderTextFromCms(answer.SubWidgetName),
|
||||||
buttonBodyCopy: this.getBodyTextFromCms(answer.SubWidgetName),
|
buttonBodyCopy: this.getBodyTextFromCms(answer.SubWidgetName),
|
||||||
//The package supports service-package-discount if it has the text value in CMS
|
//The package supports service-package-discount if it has the text value in CMS
|
||||||
|
|
@ -259,6 +259,29 @@ export default {
|
||||||
}
|
}
|
||||||
return this.servicePackageRadio;
|
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) {
|
getHeaderTextFromCms(cmsWidgetName) {
|
||||||
return this.getCmsContent(cmsWidgetName, "HeaderText");
|
return this.getCmsContent(cmsWidgetName, "HeaderText");
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue