csr-731 | Before large test rewrite

This commit is contained in:
Scott Kiener 2022-11-14 12:26:42 -05:00
parent 4c38290e8d
commit 33692d3046
4 changed files with 686 additions and 1 deletions

View file

@ -1,4 +1,4 @@
import { shallowMount } from "@vue/test-utils";
import { shallowMount, mount } from "@vue/test-utils";
import buttonQuestion from "@/common-components/button-question/button-question";
import { getMountOptions } from "@/helpers/unit-test-helper.js";
@ -115,6 +115,29 @@ describe("buttonQuestion.vue", () => {
"2020",
]);
});
test("should accept an imported component for buttonTypeObject and successfully add it to components", async ()=> {
// Arrange
const mockComponent = {
name: 'mockComponent',
methods: {
mockComponentMethod() {return 'mockComponentMethod return value'}
}
};
const wrapper = await shallowMount(
buttonQuestion,
setupMocks({propsData: {'buttonTypeString': 'mockComponent', 'buttonTypeObject': mockComponent}})
);
// Act
const componentList = wrapper.vm.$options.components;
const componentExists = !!componentList.mockComponent;
const componentNameMatches = componentList.mockComponent.name === mockComponent.name;
const componentMethodMatches = componentList.mockComponent.methods.mockComponentMethod() === mockComponent.methods.mockComponentMethod();
// Assert
expect(componentExists && componentNameMatches && componentMethodMatches).toBe(true);
});
});
describe("buttonsInfo", () => {

View file

@ -0,0 +1,279 @@
export const mockProcessedCmsContent = {
"05_01_CSR_Quote_Standard_Repair" : {
EconomyServicePackage: {
HeaderText: 'Economy service',
SubheaderText: '',
BodyText: '<ul><li>Expert windshield repair</li><li>Exclusive resin sealant</li><li>Nationwide lifetime guarantee</li></ul>',
Image: '',
FooterText: '{if:custom:frontWipersApplicableForTierTwo}New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.{else}{if:custom:rearWiperApplicableForTierTwo}New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.{end}{end}'
},
StandardServicePackage: {
HeaderText: 'Standard service',
SubheaderText: 'MOST POPULAR',
BodyText: '<ul><li>Expert windshield repair</li><li>Exclusive resin sealant</li><li>Nationwide lifetime guarantee</li><li>{if:custom:frontWipersApplicableForTierTwo}{if:custom:rearWiperApplicableForTierTwo}New {textLink:EstimateFrontWiperModal,front wiper blades}{else}New {textLink:EstimateFrontWiperModal,wiper blades}{end}{end}</li><li>{if:custom:rearWiperApplicableForTierTwo}New {textLink:EstimateRearWiperModal,rear wiper blade}{end}</li></ul>',
Image: '',
FooterText: ''
},
PremiumServicePackage: {
HeaderText: 'Premium service',
SubheaderText: '',
BodyText: '<ul><li>Expert windshield repair</li><li>Exclusive resin sealant</li><li>Nationwide lifetime guarantee</li><li>{if:custom:frontWipersApplicableForTierThree}{if:custom:rearWiperApplicableForTierThree}New {textLink:EstimateFrontWiperModal,front wiper blades}{else}New {textLink:EstimateFrontWiperModal,wiper blades}{end}{end}</li><li>{if:custom:rearWiperApplicableForTierThree}New {textLink:EstimateRearWiperModal,rear wiper blade}{end}</li><li>{if:custom:rainDefenseApplicableForTierThree}{textLink:EstimateRainDefenseModal,Rain Defense}&trade; treatment{end}</li></ul>',
Image: '',
FooterText: ''
}
},
"05_01_CSR_Quote_Recal": {
EconomyServicePackage: {
HeaderText: 'Economy service',
SubheaderText: '',
BodyText: '<ul><li>New replacement windshield</li><li>Expert installation{if:custom:isRecalibrationOnOrder} and {textLink:EstimateRecalModal,recalibration}{end}</li><li>Nationwide lifetime warranty</li></ul>',
Image: '',
FooterText: '{if:custom:frontWipersApplicableForTierTwo}New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.{else}{if:custom:rearWiperApplicableForTierTwo}New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.{end}{end}'
},
StandardServicePackage: {
HeaderText: 'Standard service',
SubheaderText: 'MOST POPULAR',
BodyText: '<ul><li>New replacement windshield</li><li>Expert installation{if:custom:isRecalibrationOnOrder} and {textLink:EstimateRecalModal,recalibration}{end}</li><li>Nationwide lifetime warranty</li><li>{if:custom:frontWipersApplicableForTierTwo}{if:custom:rearWiperApplicableForTierTwo}New {textLink:EstimateFrontWiperModal,front wiper blades}{else}New {textLink:EstimateFrontWiperModal,wiper blades}{end}{end}</li><li>{if:custom:rearWiperApplicableForTierTwo}New {textLink:EstimateRearWiperModal,rear wiper blade}{end}</li></ul>',
Image: '',
FooterText: ''
},
PremiumServicePackage: {
HeaderText: 'Premium service',
SubheaderText: '',
BodyText: '<ul><li>New replacement windshield</li><li>Expert installation{if:custom:isRecalibrationOnOrder} and {textLink:EstimateRecalModal,recalibration}{end}</li><li>Nationwide lifetime warranty</li><li>{if:custom:frontWipersApplicableForTierThree}{if:custom:rearWiperApplicableForTierThree}New {textLink:EstimateFrontWiperModal,front wiper blades}{else}New {textLink:EstimateFrontWiperModal,wiper blades}{end}{end}</li><li>{if:custom:rearWiperApplicableForTierThree}New {textLink:EstimateRearWiperModal,rear wiper blade}{end}</li><li>{if:custom:rainDefenseApplicableForTierThree}{textLink:EstimateRainDefenseModal,Rain Defense}&trade; treatment{end}</li></ul>',
Image: '',
FooterText: ''
}
},
"05_01_CSR_Quote_RearGlass": {
EconomyServicePackage: {
HeaderText: 'Economy service',
SubheaderText: '',
BodyText: '<ul><li>New replacement glass</li><li>Expert installation{if:custom:isRecalibrationOnOrder} and {textLink:EstimateRecalModal,recalibration}{end}</li><li>Nationwide lifetime warranty</li></ul>',
Image: '',
FooterText: '{if:custom:frontWipersApplicableForTierTwo}New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.{else}{if:custom:rearWiperApplicableForTierTwo}New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.{end}{end}'
},
StandardServicePackage: {
HeaderText: 'Standard service',
SubheaderText: 'MOST POPULAR',
BodyText: '<ul><li>New replacement glass</li><li>Expert installation{if:custom:isRecalibrationOnOrder} and {textLink:EstimateRecalModal,recalibration}{end}</li><li>Nationwide lifetime warranty</li><li>{if:custom:frontWipersApplicableForTierTwo}{if:custom:rearWiperApplicableForTierTwo}New {textLink:EstimateFrontWiperModal,front wiper blades}{else}New {textLink:EstimateFrontWiperModal,wiper blades}{end}{end}</li><li>{if:custom:rearWiperApplicableForTierTwo}New {textLink:EstimateRearWiperModal,rear wiper blade}{end}</li></ul>',
Image: '',
FooterText: ''
},
PremiumServicePackage: {
HeaderText: 'Premium service',
SubheaderText: '',
BodyText: '<ul><li>New replacement glass</li><li>Expert installation{if:custom:isRecalibrationOnOrder} and {textLink:EstimateRecalModal,recalibration}{end}</li><li>Nationwide lifetime warranty</li><li>{if:custom:frontWipersApplicableForTierThree}{if:custom:rearWiperApplicableForTierThree}New {textLink:EstimateFrontWiperModal,front wiper blades}{else}New {textLink:EstimateFrontWiperModal,wiper blades}{end}{end}</li><li>{if:custom:rearWiperApplicableForTierThree}New {textLink:EstimateRearWiperModal,rear wiper blade}{end}</li><li>{if:custom:rainDefenseApplicableForTierThree}{textLink:EstimateRainDefenseModal,Rain Defense}&trade; treatment{end}</li></ul>',
Image: '',
FooterText: ''
}
}
};
export const inputQuestionWidgetAnswers = {
CashServicePackageQuestionWidget: {
"Answers": [
{
"Name": "TierOne",
"SubWidgetName": "EconomyServicePackage"
},
{
"Name": "TierTwo",
"SubWidgetName": "StandardServicePackage"
},
{
"Name": "TierThree",
"SubWidgetName": "PremiumServicePackage"
}
]
},
InsuranceServicePackageQuestionWidget: {
"Answers": [
{
"Name": "TierOne",
"SubWidgetName": "EconomyServicePackage"
},
{
"Name": "TierTwo",
"SubWidgetName": "StandardServicePackage"
},
{
"Name": "TierThree",
"SubWidgetName": "PremiumServicePackage"
}
]
}
};
export const mockCmsContent = {
"Result": [
{
"Name": "CashServicePackageQuestionWidget",
"Model": {
"QuestionText": "",
"Answers": [
{
"Name": "TierOne",
"Text": "",
"SubText": "",
"AnswerImageUrl": "",
"SubWidgetName": "EconomyServicePackage"
},
{
"Name": "TierTwo",
"Text": "",
"SubText": "",
"AnswerImageUrl": "",
"SubWidgetName": "StandardServicePackage"
},
{
"Name": "TierThree",
"Text": "",
"SubText": "",
"AnswerImageUrl": "",
"SubWidgetName": "PremiumServicePackage"
}
]
}
},
{
"Name": "InsuranceServicePackageQuestionWidget",
"Model": {
"QuestionText": "",
"Answers": [
{
"Name": "TierOne",
"Text": "",
"SubText": "",
"AnswerImageUrl": "",
"SubWidgetName": "EconomyServicePackage"
},
{
"Name": "TierTwo",
"Text": "",
"SubText": "",
"AnswerImageUrl": "",
"SubWidgetName": "StandardServicePackage"
},
{
"Name": "TierThree",
"Text": "",
"SubText": "",
"AnswerImageUrl": "",
"SubWidgetName": "PremiumServicePackage"
}
]
}
},
{
"Name": "EconomyServicePackage",
"Model": {
"HeaderText": "Economy service",
"SubheaderText": "",
"BodyText": "<ul><li>{if:globalState:order.damage.isRepair}Expert windshield repair{else}New replacement {if:globalState:getters.hasAnyNonWindshieldGlassParts}glass{else}windshield{end}{end}</li><li>{if:globalState:order.damage.isRepair}Exclusive resin sealant{else}Expert installation{if:custom:isRecalibrationOnOrder} and {textLink:EstimateRecalModal,recalibration}{end}{end}</li><li>Nationwide lifetime {if:globalState:order.damage.isRepair}guarantee{else}warranty{end}</li></ul>",
"Image": "",
"FooterText": "{if:custom:frontWipersApplicableForTierTwo}New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.{else}{if:custom:rearWiperApplicableForTierTwo}New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.{end}{end}"
}
},
{
"Name": "StandardServicePackage",
"Model": {
"HeaderText": "Standard service",
"SubheaderText": "MOST POPULAR",
"BodyText": "<ul><li>{if:globalState:order.damage.isRepair}Expert windshield repair{else}New replacement {if:globalState:getters.hasAnyNonWindshieldGlassParts}glass{else}windshield{end}{end}</li><li>{if:globalState:order.damage.isRepair}Exclusive resin sealant{else}Expert installation{if:custom:isRecalibrationOnOrder} and {textLink:EstimateRecalModal,recalibration}{end}{end}</li><li>Nationwide lifetime {if:globalState:order.damage.isRepair}guarantee{else}warranty{end}</li><li>{if:custom:frontWipersApplicableForTierTwo}{if:custom:rearWiperApplicableForTierTwo}New {textLink:EstimateFrontWiperModal,front wiper blades}{else}New {textLink:EstimateFrontWiperModal,wiper blades}{end}{end}</li><li>{if:custom:rearWiperApplicableForTierTwo}New {textLink:EstimateRearWiperModal,rear wiper blade}{end}</li></ul>",
"Image": "",
"FooterText": ""
}
},
{
"Name": "PremiumServicePackage",
"Model": {
"HeaderText": "Premium service",
"SubheaderText": "",
"BodyText": "<ul><li>{if:globalState:order.damage.isRepair}Expert windshield repair{else}New replacement {if:globalState:getters.hasAnyNonWindshieldGlassParts}glass{else}windshield{end}{end}</li><li>{if:globalState:order.damage.isRepair}Exclusive resin sealant{else}Expert installation{if:custom:isRecalibrationOnOrder} and {textLink:EstimateRecalModal,recalibration}{end}{end}</li><li>Nationwide lifetime {if:globalState:order.damage.isRepair}guarantee{else}warranty{end}</li><li>{if:custom:frontWipersApplicableForTierThree}{if:custom:rearWiperApplicableForTierThree}New {textLink:EstimateFrontWiperModal,front wiper blades}{else}New {textLink:EstimateFrontWiperModal,wiper blades}{end}{end}</li><li>{if:custom:rearWiperApplicableForTierThree}New {textLink:EstimateRearWiperModal,rear wiper blade}{end}</li><li>{if:custom:rainDefenseApplicableForTierThree}{textLink:EstimateRainDefenseModal,Rain Defense}&trade; treatment{end}</li></ul>",
"Image": "",
"FooterText": ""
}
}
]};
export const expectedModifiedAnswers = {
"05_01_CSR_Quote_Standard_Repair" : {
tierOne: {
value: 'TierOne',
buttonLabel: 'Economy service',
buttonLabelSubCopy: '',
buttonBodyCopy: '<ul><li>Expert windshield repair</li><li>Exclusive resin sealant</li><li>Nationwide lifetime guarantee</li></ul>',
buttonAuxillaryCopy: '$500.22',
buttonFooterCopy: 'New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.'
},
tierTwo: {
value: 'TierTwo',
buttonLabel: 'Standard service',
buttonLabelSubCopy: 'MOST POPULAR',
buttonBodyCopy: '<ul><li>Expert windshield repair</li><li>Exclusive resin sealant</li><li>Nationwide lifetime guarantee</li><li>New {textLink:EstimateFrontWiperModal,wiper blades}</li><li></li></ul>',
buttonAuxillaryCopy: '$585.90',
buttonFooterCopy: ''
},
tierThree: {
value: 'TierThree',
buttonLabel: 'Premium service',
buttonLabelSubCopy: '',
buttonBodyCopy: '<ul><li>Expert windshield repair</li><li>Exclusive resin sealant</li><li>Nationwide lifetime guarantee</li><li>New {textLink:EstimateFrontWiperModal,wiper blades}</li><li></li><li>{textLink:EstimateRainDefenseModal,Rain Defense}&trade; treatment</li></ul>',
buttonAuxillaryCopy: '$621.40',
buttonFooterCopy: ''
}
},
"05_01_CSR_Quote_Recal": {
tierOne: {
value: 'TierOne',
buttonLabel: 'Economy service',
buttonLabelSubCopy: '',
buttonBodyCopy: '<ul><li>New replacement windshield</li><li>Expert installation and {textLink:EstimateRecalModal,recalibration}</li><li>Nationwide lifetime warranty</li></ul>',
buttonAuxillaryCopy: '$500.22',
buttonFooterCopy: 'New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.'
},
tierTwo: {
value: 'TierTwo',
buttonLabel: 'Standard service',
buttonLabelSubCopy: 'MOST POPULAR',
buttonBodyCopy: '<ul><li>New replacement windshield</li><li>Expert installation and {textLink:EstimateRecalModal,recalibration}</li><li>Nationwide lifetime warranty</li><li>New {textLink:EstimateFrontWiperModal,wiper blades}</li><li></li></ul>',
buttonAuxillaryCopy: '$585.90',
buttonFooterCopy: ''
},
tierThree: {
value: 'TierThree',
buttonLabel: 'Premium service',
buttonLabelSubCopy: '',
buttonBodyCopy: '<ul><li>New replacement windshield</li><li>Expert installation and {textLink:EstimateRecalModal,recalibration}</li><li>Nationwide lifetime warranty</li><li>New {textLink:EstimateFrontWiperModal,wiper blades}</li><li></li><li>{textLink:EstimateRainDefenseModal,Rain Defense}&trade; treatment</li></ul>',
buttonAuxillaryCopy: '$621.40',
buttonFooterCopy: ''
}
},
"05_01_CSR_Quote_RearGlass": {
tierOne: {
value: 'TierOne',
buttonLabel: 'Economy service',
buttonLabelSubCopy: '',
buttonBodyCopy: '<ul><li>New replacement glass</li><li>Expert installation</li><li>Nationwide lifetime warranty</li></ul>',
buttonAuxillaryCopy: '$350.22',
buttonFooterCopy: 'New wiper blades are not included with Economy service. Because chips can disrupt the glass surface, we recommend new wipers after a repair.'
},
tierTwo: {
value: 'TierTwo',
buttonLabel: 'Standard service',
buttonLabelSubCopy: 'MOST POPULAR',
buttonBodyCopy: '<ul><li>New replacement glass</li><li>Expert installation</li><li>Nationwide lifetime warranty</li><li></li><li>New {textLink:EstimateRearWiperModal,rear wiper blade}</li></ul>',
buttonAuxillaryCopy: '$374.70',
buttonFooterCopy: ''
},
tierThree: {
value: 'TierThree',
buttonLabel: 'Premium service',
buttonLabelSubCopy: '',
buttonBodyCopy: '<ul><li>New replacement glass</li><li>Expert installation</li><li>Nationwide lifetime warranty</li><li>New {textLink:EstimateFrontWiperModal,front wiper blades}</li><li>New {textLink:EstimateRearWiperModal,rear wiper blade}</li><li></li></ul>',
buttonAuxillaryCopy: '$460.38',
buttonFooterCopy: ''
}
},
}

View file

@ -0,0 +1,255 @@
import {shallowMount, mount} from "@vue/test-utils";
import servicePackageQuestion from "./service-package-question";
import { getMountOptions } from "@/helpers/unit-test-helper.js";
import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
import {dispatch} from "@/store";
import store from "@/store";
import { mockCmsContent, expectedModifiedAnswers, mockProcessedCmsContent, inputQuestionWidgetAnswers } from "./service-package-question-test-helper"
jest.mock("@/store", () => ({
commit: jest.fn(),
dispatch: jest.fn(),
getters: {
order: {
damage: {
glassToReplace: [
{glassLocation: "Rear"}
]
},
},
hasAnyNonWindshieldGlassParts: true
},
// order: {
// damage: {
// isRepair: false
// }
// },
state: { // I think I can drop this when everything is done, but it's needed for generating the expected stuff from cms-content-helper
order: {
damage: {
isRepair: false,
},
glassToReplace: [
{glassLocation: "Rear"}
]
}
}
}));
// describe("service-package-question.vue", () => {
// it("should emit captured value", () => {
// // Arrange
// const wrapper = setupMocks({});
// // Act
// wrapper.componentVM.selectedValues = "newValue";
// // Assert
// expect(wrapper.emitted()["update:modelValue"][0][0]).toEqual("newValue");
// });
// it("should return insurance answers from servicePackageAnswers when isInsuranceSelected = true", () => {
// // Arrange
// let modifiedProps = JSON.parse(JSON.stringify(mockProps)); // create a copy
// modifiedProps['isInsuranceSelected'] = true;
// const wrapper = setupMocks({props: modifiedProps});
// //Arrange
// expect(wrapper.vm.servicePackageAnswers[0].buttonLabel).toBe(mockCmsContent.insuranceGroupContentWidget.HeaderText);
// });
// it("should map cms content to a correctly customizied answers object", ()=> {
// // Arrange
// const expectedValue = mockCmsContent.cashAnswers.Answers[0].Name;
// // This round about way of referencing the mocked content mimics how it is referenced by the code
// // hopefully helpful for diagnosing why this test might be failing in the future
// const subWidgetName = mockCmsContent.cashAnswers.Answers[0].SubWidgetName;
// const cmsWidget = mockCmsContent[subWidgetName];
// const expectedButtonLabel = cmsWidget.HeaderText;
// const expectedButtonLabelSubCopy = cmsWidget.SubheaderText
// const expectedButtonBodyCopy = cmsWidget.BodyText;
// const expectedButtonAuxillaryCopy = "500.22"; // combined price of windshield + recal
// const expectedButtonFooterCopy = cmsWidget.FooterText;
// const wrapper = setupMocks({});
// // Assert
// const economyServicePackageAnswers = wrapper.vm.servicePackageAnswers[0];
// expect(economyServicePackageAnswers.value).toBe(expectedValue);
// expect(economyServicePackageAnswers.buttonLabel).toBe(expectedButtonLabel);
// expect(economyServicePackageAnswers.buttonLabelSubCopy).toBe(expectedButtonLabelSubCopy);
// expect(economyServicePackageAnswers.buttonBodyCopy).toBe(expectedButtonBodyCopy);
// expect(economyServicePackageAnswers.buttonAuxillaryCopy.includes(expectedButtonAuxillaryCopy)).toBe(true);
// expect(economyServicePackageAnswers.buttonFooterCopy).toBe(expectedButtonFooterCopy);
// });
// it("should not send a standard package answer if no VAPS are eligible for standard", () => {
// // Arrange
// let modifiedProps = JSON.parse(JSON.stringify(mockProps)); // create a copy
// modifiedProps['lineItems'].splice(1,3);
// const wrapper = setupMocks({props: modifiedProps});
// // Assert
// expect(wrapper.vm.servicePackageAnswers.length).toEqual(2);
// });
// it("should not send a standard package answer if no VAPS are eligible for standard", () => {
// // Arrange
// let modifiedProps = JSON.parse(JSON.stringify(mockProps)); // create a copy
// modifiedProps['lineItems'].splice(1,3);
// const wrapper = setupMocks({props: modifiedProps});
// // Assert
// expect(wrapper.vm.servicePackageAnswers.length).toEqual(2);
// });
// });
describe("service-package-question.vue, matching business rules for package display", () => {
// mock scenarios in figma:
// https://www.figma.com/file/Spt9hBtGj8r8PFFGNIN3G5/New-Funnel?node-id=100%3A11383
dispatch.mockImplementation(() => Promise.resolve({ data: mockCmsContent }));
beforeEach( async ()=> {
//processedCmsContent = await fetchCmsContentForPage('testPage');
//console.log(processedCmsContent);
processedCmsContent = inputQuestionWidgetAnswers;
mockMixin = {
methods: {
getCmsContent: jest.fn((widgetName, cmsFieldName) => {
return processedCmsContent[widgetName][cmsFieldName];
})
},
};
mockProps = {
'modelValue': 'initialValue',
'isInsuranceSelected': false,
'insuranceCmsWidgetName': 'InsuranceServicePackageQuestionWidget',
'cashCmsWidgetName': 'CashServicePackageQuestionWidget',
'availableLineItems': [
{
partNumber : "001",
Description : "Windshield with Recal",
partType : "Windshield",
Quantity : "1",
BasePartNumber : "001",
Color : "Green",
CanSafeliteRecalibrate: true,
price : 350.22
},
{
"partNumber": "SBB16",
"description": "SAFELITE BEAM BLADE 16",
"partType": "FRONT WIPER",
"price": 32.64,
},
{
"partNumber": "SBB26",
"description": "SAFELITE BEAM BLADE 26",
"partType": "FRONT WIPER",
"price": 53.04,
},
{
"partNumber": "SBBR12A",
"description": "SAFELITE REAR BLADE 12A",
"partType": "REAR WIPER",
"price": 24.48,
},
{
"partNumber": "RAIN DEFENSE",
"description": null,
"partType": "RAIN DEFENSE",
"price": 35.50,
},
]
};
})
it("should match the 05_01_CSR_Quote_Standard_Repair mock", () => {
// Arrange
const packageNameKey = "05_01_CSR_Quote_Standard_Repair";
Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]);
const wrapper = setupMocks({});
// Assert
// economy answer
runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[0], expectedModifiedAnswers[packageNameKey].tierOne);
// standard answer
runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[1], expectedModifiedAnswers[packageNameKey].tierTwo);
// premium answer
runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[2], expectedModifiedAnswers[packageNameKey].tierThree);
});
it.only("should match the 05_01_CSR_Quote_Recal mock", () => {
// Arrange
const packageNameKey = "05_01_CSR_Quote_Recal";
mockProps.availableLineItems.push(
{
partNumber : "RECAL STATIC",
Description : "Recalibration",
partType : "recalibration",
Quantity : "1",
price : 150.00,
},
);
Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]);
const wrapper = setupMocks({
customMountOptions: {
store: {
getters: {
order: {
damage: {
glassToReplace: [
{glassLocation: "Windshield"}
]
},
},
hasAnyNonWindshieldGlassParts: false
},
},
},
});
// Assert
// economy answer
runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[0], expectedModifiedAnswers[packageNameKey].tierOne);
// standard answer
runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[1], expectedModifiedAnswers[packageNameKey].tierTwo);
// premium answer
runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[2], expectedModifiedAnswers[packageNameKey].tierThree);
});
it("should match the 05_01_CSR_Quote_RearGlass mock", () => {
// Arrange
const packageNameKey = "05_01_CSR_Quote_RearGlass";
Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]);
const wrapper = setupMocks({});
//console.log(wrapper.vm.servicePackageAnswers);
// Assert
// economy answer
runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[0], expectedModifiedAnswers[packageNameKey].tierOne);
// standard answer
runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[1], expectedModifiedAnswers[packageNameKey].tierTwo);
// premium answer
runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[2], expectedModifiedAnswers[packageNameKey].tierThree);
});
});
function runPackageAnswerExpectStatements(servicePackageAnswer, expectedOutput) {
expect(servicePackageAnswer.buttonLabel).toBe(expectedOutput.buttonLabel);
expect(servicePackageAnswer.buttonLabelSubCopy).toBe(expectedOutput.buttonLabelSubCopy);
expect(servicePackageAnswer.buttonBodyCopy).toBe(expectedOutput.buttonBodyCopy);
expect(servicePackageAnswer.buttonFooterCopy).toBe(expectedOutput.buttonFooterCopy);
}
function setupMocks({ customMountOptions, props = mockProps }) {
const mountOptions = getMountOptions({
...customMountOptions
});
console.log(mountOptions.global);
// Modify/augment default mount options
mountOptions.global.mocks["$store"] = store;
mountOptions.global.mixins = [mockMixin];
mountOptions.propsData = props;
const wrapper = shallowMount(servicePackageQuestion, mountOptions);
return wrapper;
}
///////////////
// Constants //
///////////////
let processedCmsContent;
let mockMixin;
let mockProps;

View file

@ -0,0 +1,128 @@
import { mount } from "@vue/test-utils";
import servicePackageRadio from "./service-package-radio";
import inputButtonWrapperMixin from "@/mixins/input-button-wrapper-mixin";
describe("service-package-radio.vue", () => {
it("Should include buttonLabel in html", async () => {
// Arrange
let { wrapper } = setupMocks({
mountOptionsMockData: {
propsData: mockProps,
},
});
// Act
const outputHtml = wrapper.html();
// Assert
expect(outputHtml).toEqual(expect.stringContaining(mockProps['buttonLabel']));
});
it("Should include buttonLabelAuxillaryCopy in html", async () => {
// Arrange
let { wrapper } = setupMocks({
mountOptionsMockData: {
propsData: mockProps,
},
});
// Act
const outputHtml = wrapper.html();
// Assert
expect(outputHtml).toEqual(expect.stringContaining(mockProps['buttonLabelAuxillaryCopy']));
});
it("Should include buttonLabelSubCopy in html", async () => {
// Arrange
let { wrapper } = setupMocks({
mountOptionsMockData: {
propsData: mockProps,
},
});
// Act
const outputHtml = wrapper.html();
// Assert
expect(outputHtml).toEqual(expect.stringContaining(mockProps['buttonLabelSubCopy']));
});
it("Should include buttonFooterCopy in html", async () => {
// Arrange
let { wrapper } = setupMocks({
mountOptionsMockData: {
propsData: mockProps,
},
});
// Act
const outputHtml = wrapper.html();
// Assert
expect(outputHtml).toEqual(expect.stringContaining(mockProps['buttonFooterCopy']));
});
it("Should get 5 strings from getArrayOfListItemsFromRawCmsCopy when provided with a <ul><li>...</li>(x5)</ul> buttonBodyCopy", async () => {
// Arrange
let { wrapper } = setupMocks({
mountOptionsMockData: {
propsData: mockProps,
},
});
// Act
const results = wrapper.vm.getArrayOfListItemsFromRawCmsCopy(wrapper.vm.buttonBodyCopy);
// Assert
expect(results.length).toBe(5);
});
it("Should get strings from getArrayOfListItemsFromRawCmsCopy without <ul> or <li> tags when provided with a <ul><li>...</li></ul> buttonBodyCopy", async () => {
// Arrange
let { wrapper } = setupMocks({
mountOptionsMockData: {
propsData: mockProps,
},
});
// Act
const results = wrapper.vm.getArrayOfListItemsFromRawCmsCopy(wrapper.vm.buttonBodyCopy);
// Assert
const fileredResults = results.filter(result => {
return result.includes("<ul>") || result.includes("</ul>") || result.includes("<li>") || result.includes("</li>")
})
expect(fileredResults.length).toBe(0);
});
it("Should get 5 strings from getArrayOfListItemsFromRawCmsCopy when buttonBodyCopy has 6 total <li>...</li>, but one is empty ", async () => {
// Arrange
const moddedProps = mockProps;
moddedProps['buttonBodyCopy'] = "<ul><li>buttonBodyCopy test copy</li><li>2</li><li>3</li><li>4</li><li>5</li><li></li></ul>";
let { wrapper } = setupMocks({
mountOptionsMockData: {
propsData: moddedProps,
},
});
// Act
const results = wrapper.vm.getArrayOfListItemsFromRawCmsCopy(wrapper.vm.buttonBodyCopy);
// Assert
expect(results.length).toBe(5);
});
});
const mockProps = {
buttonLabel: "buttonLabel test copy",
buttonLabelAuxillaryCopy: "buttonLabelAuxillaryCopy test copy",
buttonLabelSubCopy: "buttonLabelSubCopy test copy",
buttonBodyCopy: "<ul><li>buttonBodyCopy test copy</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>",
buttonFooterCopy: "buttonFooterCopy test copy"
}
function setupMocks({ mountOptionsMockData = {} }) {
const wrapper = mount(servicePackageRadio, {
...mountOptionsMockData,
mixins: [inputButtonWrapperMixin],
});
return { wrapper };
}