diff --git a/jest.config.js b/jest.config.js index c5401c28f..146264edd 100644 --- a/jest.config.js +++ b/jest.config.js @@ -17,10 +17,8 @@ module.exports = { "!src/layouts/capability-questions/**/*.vue", "!src/layouts/part-questions/**/*.vue", "!src/layouts/reveal/**/*.vue", - "!src/layouts/quote/**/*.vue", "!src/ux-components/text-link/**/*.vue", "!src/common-components/question-chain/**/*.vue", - "!src/layouts/quote/**/*.vue", // Temporary "!src/layouts/vin-lookup/**/*.vue", //Temporary for Quote page testing "!src/common-components/funnel-header/menu-modal/**/*.vue", // END diff --git a/src/common-components/button-question/button-question.spec.js b/src/common-components/button-question/button-question.spec.js index 8a8696c43..132e5edb9 100644 --- a/src/common-components/button-question/button-question.spec.js +++ b/src/common-components/button-question/button-question.spec.js @@ -115,25 +115,34 @@ describe("buttonQuestion.vue", () => { "2020", ]); }); - test("should accept an imported component for buttonTypeObject and successfully add it to components", async ()=> { + test("should accept an imported component for buttonTypeObject and successfully add it to components", async () => { // Arrange const mockComponent = { - name: 'mockComponent', + name: "mockComponent", methods: { - mockComponentMethod() {return 'mockComponentMethod return value'} - } + mockComponentMethod() { + return "mockComponentMethod return value"; + }, + }, }; const wrapper = await shallowMount( buttonQuestion, - setupMocks({propsData: {'buttonTypeString': 'mockComponent', 'buttonTypeObject': mockComponent}}) - ); + 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(); + const componentMethodMatches = + componentList.mockComponent.methods.mockComponentMethod() === + mockComponent.methods.mockComponentMethod(); // Assert expect(componentExists && componentNameMatches && componentMethodMatches).toBe(true); diff --git a/src/layouts/quote/service-package-question/service-package-question-test-helper.js b/src/layouts/quote/service-package-question/service-package-question-test-helper.js index 3b18ed667..36f938a7e 100644 --- a/src/layouts/quote/service-package-question/service-package-question-test-helper.js +++ b/src/layouts/quote/service-package-question/service-package-question-test-helper.js @@ -1,279 +1,580 @@ export const mockProcessedCmsContent = { - "05_01_CSR_Quote_Standard_Repair" : { - EconomyServicePackage: { - HeaderText: 'Economy service', - SubheaderText: '', - BodyText: '', - 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}' + "05_01_CSR_Quote_Standard_Repair": { + EconomyServicePackage: { + HeaderText: "Economy service", + SubheaderText: "", + BodyText: + "", + 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: + "", + Image: "", + FooterText: "", + }, + PremiumServicePackage: { + HeaderText: "Premium service", + SubheaderText: "", + BodyText: + "", + Image: "", + FooterText: "", + }, }, - StandardServicePackage: { - HeaderText: 'Standard service', - SubheaderText: 'MOST POPULAR', - BodyText: '', - Image: '', - FooterText: '' + "05_01_CSR_Quote_Recal": { + EconomyServicePackage: { + HeaderText: "Economy service", + SubheaderText: "", + BodyText: + "", + 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: + "", + Image: "", + FooterText: "", + }, + PremiumServicePackage: { + HeaderText: "Premium service", + SubheaderText: "", + BodyText: + "", + Image: "", + FooterText: "", + }, }, - PremiumServicePackage: { - HeaderText: 'Premium service', - SubheaderText: '', - BodyText: '', - Image: '', - FooterText: '' - } - }, - "05_01_CSR_Quote_Recal": { - EconomyServicePackage: { - HeaderText: 'Economy service', - SubheaderText: '', - BodyText: '', - 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}' + "05_01_CSR_Quote_RearGlass": { + EconomyServicePackage: { + HeaderText: "Economy service", + SubheaderText: "", + BodyText: + "", + 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: + "", + Image: "", + FooterText: "", + }, + PremiumServicePackage: { + HeaderText: "Premium service", + SubheaderText: "", + BodyText: + "", + Image: "", + FooterText: "", + }, }, - StandardServicePackage: { - HeaderText: 'Standard service', - SubheaderText: 'MOST POPULAR', - BodyText: '', - Image: '', - FooterText: '' + "05_01_CSR_Quote_RearGlass+NonWindshield": { + EconomyServicePackage: { + HeaderText: "Economy service", + SubheaderText: "", + BodyText: + "", + 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: + "", + Image: "", + FooterText: "", + }, + PremiumServicePackage: { + HeaderText: "Premium service", + SubheaderText: "", + BodyText: + "", + Image: "", + FooterText: "", + }, }, - PremiumServicePackage: { - HeaderText: 'Premium service', - SubheaderText: '', - BodyText: '', - Image: '', - FooterText: '' - } - }, - "05_01_CSR_Quote_RearGlass": { - EconomyServicePackage: { - HeaderText: 'Economy service', - SubheaderText: '', - BodyText: '', - 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}' + "05_01_CSR_Quote_RearGlass+Windshield": { + EconomyServicePackage: { + HeaderText: "Economy service", + SubheaderText: "", + BodyText: + "", + 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: + "", + Image: "", + FooterText: "", + }, + PremiumServicePackage: { + HeaderText: "Premium service", + SubheaderText: "", + BodyText: + "", + Image: "", + FooterText: "", + }, }, - StandardServicePackage: { - HeaderText: 'Standard service', - SubheaderText: 'MOST POPULAR', - BodyText: '', - Image: '', - FooterText: '' + "05_01_CSR_Quote_RearGlassNoFrontFit": { + EconomyServicePackage: { + HeaderText: "Economy service", + SubheaderText: "", + BodyText: + "", + 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: + "", + Image: "", + FooterText: "", + }, + PremiumServicePackage: { + HeaderText: "Premium service", + SubheaderText: "", + BodyText: + "", + Image: "", + FooterText: "", + }, + }, + "05_01_CSR_Quote_Windshield+SideGlass": { + EconomyServicePackage: { + HeaderText: "Economy service", + SubheaderText: "", + BodyText: + "", + 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: + "", + Image: "", + FooterText: "", + }, + PremiumServicePackage: { + HeaderText: "Premium service", + SubheaderText: "", + BodyText: + "", + Image: "", + FooterText: "", + }, + }, + "05_01_CSR_Quote_SideGlass": { + EconomyServicePackage: { + HeaderText: "Economy service", + SubheaderText: "", + BodyText: + "", + 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: + "", + Image: "", + FooterText: "", + }, + PremiumServicePackage: { + HeaderText: "Premium service", + SubheaderText: "", + BodyText: + "", + Image: "", + FooterText: "", + }, + }, + "05_01_CSR_Quote_NoWiperFit": { + EconomyServicePackage: { + HeaderText: "Economy service", + SubheaderText: "", + BodyText: + "", + 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: + "", + Image: "", + FooterText: "", + }, + PremiumServicePackage: { + HeaderText: "Premium service", + SubheaderText: "", + BodyText: + "", + Image: "", + FooterText: "", + }, + }, + badCustomValue: { + EconomyServicePackage: { + HeaderText: "Economy service", + SubheaderText: "", + BodyText: + "", + 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: + "", + Image: "", + FooterText: "", + }, + PremiumServicePackage: { + HeaderText: "Premium service", + SubheaderText: "", + BodyText: + "", + Image: "", + FooterText: "", + }, }, - PremiumServicePackage: { - HeaderText: 'Premium service', - SubheaderText: '', - BodyText: '', - 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" - } - ] - } + 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": "", - "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": "", - "Image": "", - "FooterText": "" - } - }, - { - "Name": "PremiumServicePackage", - "Model": { - "HeaderText": "Premium service", - "SubheaderText": "", - "BodyText": "", - "Image": "", - "FooterText": "" - } - } -]}; - export const expectedModifiedAnswers = { - "05_01_CSR_Quote_Standard_Repair" : { + "05_01_CSR_Quote_Standard_Repair": { tierOne: { - value: 'TierOne', - buttonLabel: 'Economy service', - buttonLabelSubCopy: '', - buttonBodyCopy: '', - 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.' - }, + value: "TierOne", + buttonLabel: "Economy service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + 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: '', - buttonAuxillaryCopy: '$585.90', - buttonFooterCopy: '' - }, + value: "TierTwo", + buttonLabel: "Standard service", + buttonLabelSubCopy: "MOST POPULAR", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$585.90", + buttonFooterCopy: "", + }, tierThree: { - value: 'TierThree', - buttonLabel: 'Premium service', - buttonLabelSubCopy: '', - buttonBodyCopy: '', - buttonAuxillaryCopy: '$621.40', - buttonFooterCopy: '' - } + value: "TierThree", + buttonLabel: "Premium service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$621.40", + buttonFooterCopy: "", + }, }, "05_01_CSR_Quote_Recal": { - tierOne: { - value: 'TierOne', - buttonLabel: 'Economy service', - buttonLabelSubCopy: '', - buttonBodyCopy: '', - 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: '', - buttonAuxillaryCopy: '$585.90', - buttonFooterCopy: '' - }, - tierThree: { - value: 'TierThree', - buttonLabel: 'Premium service', - buttonLabelSubCopy: '', - buttonBodyCopy: '', - buttonAuxillaryCopy: '$621.40', - buttonFooterCopy: '' - } + tierOne: { + value: "TierOne", + buttonLabel: "Economy service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + 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: + "", + buttonAuxillaryCopy: "$585.90", + buttonFooterCopy: "", + }, + tierThree: { + value: "TierThree", + buttonLabel: "Premium service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$621.40", + buttonFooterCopy: "", + }, }, "05_01_CSR_Quote_RearGlass": { - tierOne: { - value: 'TierOne', - buttonLabel: 'Economy service', - buttonLabelSubCopy: '', - buttonBodyCopy: '', - 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: '', - buttonAuxillaryCopy: '$374.70', - buttonFooterCopy: '' - }, - tierThree: { - value: 'TierThree', - buttonLabel: 'Premium service', - buttonLabelSubCopy: '', - buttonBodyCopy: '', - buttonAuxillaryCopy: '$460.38', - buttonFooterCopy: '' - } + tierOne: { + value: "TierOne", + buttonLabel: "Economy service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + 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: + "", + buttonAuxillaryCopy: "$374.70", + buttonFooterCopy: "", + }, + tierThree: { + value: "TierThree", + buttonLabel: "Premium service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$460.38", + buttonFooterCopy: "", + }, }, -} \ No newline at end of file + "05_01_CSR_Quote_RearGlass+NonWindshield": { + tierOne: { + value: "TierOne", + buttonLabel: "Economy service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + 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: + "", + buttonAuxillaryCopy: "$374.70", + buttonFooterCopy: "", + }, + tierThree: { + value: "TierThree", + buttonLabel: "Premium service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$460.38", + buttonFooterCopy: "", + }, + }, + "05_01_CSR_Quote_RearGlass+Windshield": { + tierOne: { + value: "TierOne", + buttonLabel: "Economy service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + 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: + "", + buttonAuxillaryCopy: "$460.38", + buttonFooterCopy: "", + }, + tierThree: { + value: "TierThree", + buttonLabel: "Premium service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$495.88", + buttonFooterCopy: "", + }, + }, + "05_01_CSR_Quote_RearGlassNoFrontFit": { + tierOne: { + value: "TierOne", + buttonLabel: "Economy service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + 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: + "", + buttonAuxillaryCopy: "$374.70", + buttonFooterCopy: "", + }, + tierThree: { + value: "TierThree", + buttonLabel: "Premium service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$410.20", + buttonFooterCopy: "", + }, + }, + "05_01_CSR_Quote_Windshield+SideGlass": { + tierOne: { + value: "TierOne", + buttonLabel: "Economy service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + 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: + "", + buttonAuxillaryCopy: "$435.90", + buttonFooterCopy: "", + }, + tierThree: { + value: "TierThree", + buttonLabel: "Premium service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$471.40", + buttonFooterCopy: "", + }, + }, + "05_01_CSR_Quote_SideGlass": { + tierOne: { + value: "TierOne", + buttonLabel: "Economy service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$350.22", + buttonFooterCopy: "", + }, + tierThree: { + value: "TierThree", + buttonLabel: "Premium service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$471.40", + buttonFooterCopy: "", + }, + }, + "05_01_CSR_Quote_NoWiperFit": { + tierOne: { + value: "TierOne", + buttonLabel: "Economy service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$350.22", + buttonFooterCopy: "", + }, + tierThree: { + value: "TierThree", + buttonLabel: "Premium service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$385.72", + buttonFooterCopy: "", + }, + }, + badCustomValue: { + tierOne: { + value: "TierOne", + buttonLabel: "Economy service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$350.22", + buttonFooterCopy: "", + }, + tierThree: { + value: "TierThree", + buttonLabel: "Premium service", + buttonLabelSubCopy: "", + buttonBodyCopy: + "", + buttonAuxillaryCopy: "$385.72", + buttonFooterCopy: "", + }, + }, +}; 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 b1e0c7c2e..043037995 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 @@ -1,198 +1,112 @@ -import {shallowMount, mount} from "@vue/test-utils"; +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" - +import { + 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); +describe("service-package-question.vue", () => { + beforeEach(async () => { processedCmsContent = inputQuestionWidgetAnswers; mockMixin = { methods: { getCmsContent: jest.fn((widgetName, cmsFieldName) => { return processedCmsContent[widgetName][cmsFieldName]; - }) + }), }, }; mockProps = { - 'modelValue': 'initialValue', - 'isInsuranceSelected': false, - 'insuranceCmsWidgetName': 'InsuranceServicePackageQuestionWidget', - 'cashCmsWidgetName': 'CashServicePackageQuestionWidget', - 'availableLineItems': [ + 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: "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: "RAIN DEFENSE", + description: null, + partType: "RAIN DEFENSE", + price: 35.5, }, - { - "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]); + }); + 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 have the correct insurance pricing text when insurance is selected", () => { + // Arrange + mockProps.isInsuranceSelected = true; + const wrapper = setupMocks({}); + // Act + + // Assert + expect( + wrapper.vm.servicePackageAnswers[0].buttonAuxillaryCopy.includes("As little as") + ).toBe(true); + }); + it("should return [] from nullSafeAvailableLineItems and not error out if availableLineItems is null", () => { + // Arrange + mockProps.availableLineItems = null; + const wrapper = setupMocks({}); + // Act + + // Assert + expect(wrapper.vm.nullSafeAvailableLineItems).toEqual([]); + }); + it("should return a null servicePackageAnswers if the cmsContent is falsy", () => { + // Arrange + mockMixin = { + methods: { + getCmsContent: jest.fn((widgetName, cmsFieldName) => { + return null; + }), + }, + }; 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); + expect(wrapper.vm.servicePackageAnswers).toBe(null); }); - it.only("should match the 05_01_CSR_Quote_Recal mock", () => { + it("should treat an undefined 'getCustomValueFromString' as a false value and not error out", () => { // Arrange - const packageNameKey = "05_01_CSR_Quote_Recal"; - mockProps.availableLineItems.push( - { - partNumber : "RECAL STATIC", - Description : "Recalibration", - partType : "recalibration", - Quantity : "1", - price : 150.00, - }, - ); + const packageNameKey = "badCustomValue"; Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); const wrapper = setupMocks({ - customMountOptions: { + mountOptionsMockData: { store: { getters: { order: { damage: { - glassToReplace: [ - {glassLocation: "Windshield"} - ] + isRepair: false, + glassToReplace: [{ glassLocation: "Windshield" }], }, }, - hasAnyNonWindshieldGlassParts: false + hasAnyNonWindshieldGlassParts: false, }, }, }, @@ -200,26 +114,413 @@ describe("service-package-question.vue, matching business rules for package disp // Assert // economy answer - runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[0], expectedModifiedAnswers[packageNameKey].tierOne); - // standard answer - runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[1], expectedModifiedAnswers[packageNameKey].tierTwo); + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[0], + expectedModifiedAnswers[packageNameKey].tierOne + ); + // standard answer should not be created + expect(wrapper.vm.servicePackageAnswers.length).toBe(2); // premium answer - runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[2], expectedModifiedAnswers[packageNameKey].tierThree); + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[1], + expectedModifiedAnswers[packageNameKey].tierThree + ); + }); +}); +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 + beforeEach(async () => { + 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: "RAIN DEFENSE", + description: null, + partType: "RAIN DEFENSE", + price: 35.5, + }, + ], + }; + }); + 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]); + mockProps.availableLineItems.push(driverFrontWiperLineItem); + mockProps.availableLineItems.push(passengerFrontWiperLineItem); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: true, + glassToReplace: [], + }, + }, + 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_Recal mock", () => { + // Arrange + const packageNameKey = "05_01_CSR_Quote_Recal"; + mockProps.availableLineItems.push(recalLineItem); + mockProps.availableLineItems.push(driverFrontWiperLineItem); + mockProps.availableLineItems.push(passengerFrontWiperLineItem); + Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: false, + 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({}); + mockProps.availableLineItems.push(driverFrontWiperLineItem); + mockProps.availableLineItems.push(passengerFrontWiperLineItem); + mockProps.availableLineItems.push(rearWiperLineItem); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: false, + glassToReplace: [{ glassLocation: "Rear" }], + }, + }, + hasAnyNonWindshieldGlassParts: true, + }, + }, + }, + }); + + // 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+NonWindshield mock", () => { + // Arrange + const packageNameKey = "05_01_CSR_Quote_RearGlass+NonWindshield"; + Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); + mockProps.availableLineItems.push(driverFrontWiperLineItem); + mockProps.availableLineItems.push(passengerFrontWiperLineItem); + mockProps.availableLineItems.push(rearWiperLineItem); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: false, + glassToReplace: [ + { glassLocation: "Rear" }, + { glassLocation: "Driver" }, + ], + }, + }, + hasAnyNonWindshieldGlassParts: true, + }, + }, + }, + }); //console.log(wrapper.vm.servicePackageAnswers); // Assert // economy answer - runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[0], expectedModifiedAnswers[packageNameKey].tierOne); + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[0], + expectedModifiedAnswers[packageNameKey].tierOne + ); // standard answer - runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[1], expectedModifiedAnswers[packageNameKey].tierTwo); + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[1], + expectedModifiedAnswers[packageNameKey].tierTwo + ); // premium answer - runPackageAnswerExpectStatements(wrapper.vm.servicePackageAnswers[2], expectedModifiedAnswers[packageNameKey].tierThree); + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[2], + expectedModifiedAnswers[packageNameKey].tierThree + ); + }); + it("should match the 05_01_CSR_Quote_RearGlass+Windshield mock", () => { + // Arrange + const packageNameKey = "05_01_CSR_Quote_RearGlass+Windshield"; + Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); + mockProps.availableLineItems.push(driverFrontWiperLineItem); + mockProps.availableLineItems.push(passengerFrontWiperLineItem); + mockProps.availableLineItems.push(rearWiperLineItem); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: false, + glassToReplace: [ + { glassLocation: "Rear" }, + { glassLocation: "Windshield" }, + ], + }, + }, + hasAnyNonWindshieldGlassParts: true, + }, + }, + }, + }); + + // 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_RearGlassNoFrontFit mock", () => { + // Arrange + const packageNameKey = "05_01_CSR_Quote_RearGlassNoFrontFit"; + Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); + mockProps.availableLineItems.push(rearWiperLineItem); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: false, + glassToReplace: [{ glassLocation: "Rear" }], + }, + }, + hasAnyNonWindshieldGlassParts: true, + }, + }, + }, + }); + + // 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_Windshield+SideGlass mock", () => { + // Arrange + const packageNameKey = "05_01_CSR_Quote_Windshield+SideGlass"; + Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); + mockProps.availableLineItems.push(driverFrontWiperLineItem); + mockProps.availableLineItems.push(passengerFrontWiperLineItem); + mockProps.availableLineItems.push(rearWiperLineItem); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: false, + glassToReplace: [ + { glassLocation: "Driver" }, + { glassLocation: "Windshield" }, + ], + }, + }, + hasAnyNonWindshieldGlassParts: true, + }, + }, + }, + }); + + // 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_SideGlass mock", () => { + // Arrange + const packageNameKey = "05_01_CSR_Quote_SideGlass"; + Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); + mockProps.availableLineItems.push(driverFrontWiperLineItem); + mockProps.availableLineItems.push(passengerFrontWiperLineItem); + mockProps.availableLineItems.push(rearWiperLineItem); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: false, + glassToReplace: [{ glassLocation: "Driver" }], + }, + }, + hasAnyNonWindshieldGlassParts: true, + }, + }, + }, + }); + + // Assert + // economy answer + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[0], + expectedModifiedAnswers[packageNameKey].tierOne + ); + // standard answer should not be created + expect(wrapper.vm.servicePackageAnswers.length).toBe(2); + // premium answer + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[1], + expectedModifiedAnswers[packageNameKey].tierThree + ); + }); + it("should match the 05_01_CSR_Quote_NoWiperFit mock", () => { + // Arrange + const packageNameKey = "05_01_CSR_Quote_NoWiperFit"; + Object.assign(processedCmsContent, mockProcessedCmsContent[packageNameKey]); + const wrapper = setupMocks({ + mountOptionsMockData: { + store: { + getters: { + order: { + damage: { + isRepair: false, + glassToReplace: [{ glassLocation: "Windshield" }], + }, + }, + hasAnyNonWindshieldGlassParts: false, + }, + }, + }, + }); + + // Assert + // economy answer + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[0], + expectedModifiedAnswers[packageNameKey].tierOne + ); + // standard answer should not be created + expect(wrapper.vm.servicePackageAnswers.length).toBe(2); + // premium answer + runPackageAnswerExpectStatements( + wrapper.vm.servicePackageAnswers[1], + expectedModifiedAnswers[packageNameKey].tierThree + ); }); }); @@ -230,26 +531,65 @@ function runPackageAnswerExpectStatements(servicePackageAnswer, expectedOutput) expect(servicePackageAnswer.buttonFooterCopy).toBe(expectedOutput.buttonFooterCopy); } -function setupMocks({ customMountOptions, props = mockProps }) { - const mountOptions = getMountOptions({ - ...customMountOptions - }); - console.log(mountOptions.global); +function setupMocks({ mountOptionsMockData, props = mockProps }) { + var mountOptionsMockDataDefault = { + store: { + getters: { + order: { + damage: { + isRepair: false, + glassToReplace: [{ glassLocation: "Windshield" }], + }, + }, + hasAnyNonWindshieldGlassParts: false, + }, + }, + }; + mountOptionsMockData = Object.assign(mountOptionsMockDataDefault, mountOptionsMockData); + const mountOptions = getMountOptions(mountOptionsMockData); // 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 // - /////////////// +/////////////// +// Constants // +/////////////// let processedCmsContent; let mockMixin; -let mockProps; \ No newline at end of file +let mockProps; + +let recalLineItem = { + partNumber: "RECAL STATIC", + Description: "Recalibration", + partType: "recalibration", + Quantity: "1", + price: 150.0, +}; + +let driverFrontWiperLineItem = { + partNumber: "SBB16", + description: "SAFELITE BEAM BLADE 16", + partType: "FRONT WIPER", + price: 32.64, +}; + +let passengerFrontWiperLineItem = { + partNumber: "SBB26", + description: "SAFELITE BEAM BLADE 26", + partType: "FRONT WIPER", + price: 53.04, +}; + +let rearWiperLineItem = { + partNumber: "SBBR12A", + description: "SAFELITE REAR BLADE 12A", + partType: "REAR WIPER", + price: 24.48, +}; diff --git a/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.spec.js b/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.spec.js index 4684e5212..fefef4044 100644 --- a/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.spec.js +++ b/src/layouts/quote/service-package-question/service-package-radio/service-package-radio.spec.js @@ -15,7 +15,7 @@ describe("service-package-radio.vue", () => { const outputHtml = wrapper.html(); // Assert - expect(outputHtml).toEqual(expect.stringContaining(mockProps['buttonLabel'])); + expect(outputHtml).toEqual(expect.stringContaining(mockProps["buttonLabel"])); }); it("Should include buttonLabelAuxillaryCopy in html", async () => { @@ -30,7 +30,7 @@ describe("service-package-radio.vue", () => { const outputHtml = wrapper.html(); // Assert - expect(outputHtml).toEqual(expect.stringContaining(mockProps['buttonLabelAuxillaryCopy'])); + expect(outputHtml).toEqual(expect.stringContaining(mockProps["buttonLabelAuxillaryCopy"])); }); it("Should include buttonLabelSubCopy in html", async () => { @@ -45,7 +45,7 @@ describe("service-package-radio.vue", () => { const outputHtml = wrapper.html(); // Assert - expect(outputHtml).toEqual(expect.stringContaining(mockProps['buttonLabelSubCopy'])); + expect(outputHtml).toEqual(expect.stringContaining(mockProps["buttonLabelSubCopy"])); }); it("Should include buttonFooterCopy in html", async () => { // Arrange @@ -59,7 +59,7 @@ describe("service-package-radio.vue", () => { const outputHtml = wrapper.html(); // Assert - expect(outputHtml).toEqual(expect.stringContaining(mockProps['buttonFooterCopy'])); + expect(outputHtml).toEqual(expect.stringContaining(mockProps["buttonFooterCopy"])); }); it("Should get 5 strings from getArrayOfListItemsFromRawCmsCopy when provided with a buttonBodyCopy", async () => { // Arrange @@ -81,21 +81,26 @@ describe("service-package-radio.vue", () => { propsData: mockProps, }, }); - + // Act const results = wrapper.vm.getArrayOfListItemsFromRawCmsCopy(wrapper.vm.buttonBodyCopy); // Assert - const fileredResults = results.filter(result => { - return result.includes("") || result.includes("
  • ") || result.includes("
  • ") - }) + const fileredResults = results.filter((result) => { + return ( + result.includes("") || + result.includes("
  • ") || + result.includes("
  • ") + ); + }); expect(fileredResults.length).toBe(0); - }); it("Should get 5 strings from getArrayOfListItemsFromRawCmsCopy when buttonBodyCopy has 6 total
  • ...
  • , but one is empty ", async () => { // Arrange const moddedProps = mockProps; - moddedProps['buttonBodyCopy'] = ""; + moddedProps["buttonBodyCopy"] = + ""; let { wrapper } = setupMocks({ mountOptionsMockData: { propsData: moddedProps, @@ -114,9 +119,10 @@ const mockProps = { buttonLabel: "buttonLabel test copy", buttonLabelAuxillaryCopy: "buttonLabelAuxillaryCopy test copy", buttonLabelSubCopy: "buttonLabelSubCopy test copy", - buttonBodyCopy: "", - buttonFooterCopy: "buttonFooterCopy test copy" -} + buttonBodyCopy: + "", + buttonFooterCopy: "buttonFooterCopy test copy", +}; function setupMocks({ mountOptionsMockData = {} }) { const wrapper = mount(servicePackageRadio, {