From 915cfd5a215f33b539317e4fe060d995c33ba5f5 Mon Sep 17 00:00:00 2001 From: FrankRua Date: Thu, 27 Jan 2022 17:23:09 -0500 Subject: [PATCH 1/4] Added logic to validate pages --- src/layouts/vehicle-damage/vehicle-damage.vue | 58 ++++++------ src/layouts/vehicle-make/vehicle-make.spec.js | 89 ++++++++++++++----- src/layouts/vehicle-make/vehicle-make.vue | 16 ++-- src/layouts/vehicle-model/vehicle-model.vue | 5 ++ src/layouts/vehicle-style/vehicle-style.vue | 24 ++++- src/layouts/vehicle-year/vehicle-year.vue | 9 +- src/router/index.js | 18 +++- 7 files changed, 157 insertions(+), 62 deletions(-) diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index c00669245..e18b594e0 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -1,11 +1,9 @@ diff --git a/src/layouts/vehicle-make/vehicle-make.spec.js b/src/layouts/vehicle-make/vehicle-make.spec.js index 83a7f1862..41a7939ad 100644 --- a/src/layouts/vehicle-make/vehicle-make.spec.js +++ b/src/layouts/vehicle-make/vehicle-make.spec.js @@ -7,23 +7,40 @@ import vehicleBanner from "@/common-components/vehicle-banner/vehicle-banner"; import funnelSubHeader from "@/common-components/funnel-sub-header/funnel-sub-header"; import { settleAllPromises } from "@/helpers/layout-helper.js"; import { nextTick } from "vue"; +import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; + +// Mock Store +jest.mock("@/store", () => ({ + getters: { + vehicle: { + year: 2019, + } + } +})); + +// Mock fetchCmsContentForPage +jest.mock("@/helpers/cms-content-helper", () => ({ + fetchCmsContentForPage: jest.fn(), +})); // Mock our module for promises. jest.mock("@/helpers/layout-helper.js", () => ({ settleAllPromises: jest.fn(), })); + describe("vehicle-make.vue", () => { test("Make question component is initized with api data", async (done) => { //Arrange const vehicleMakeQuestionCmsContent = { QuestionText: "What make is your vehicle?" }; const makeQuestionInitialData = ["honda", "ford", "dodge"]; - const { wrapper, apiPromise } = setupMocks( { - vehicleMakeQuestionCmsContent: vehicleMakeQuestionCmsContent, + const { wrapper, apiPromise } = setupMocks({ + vehicleMakeQuestionCmsContent: vehicleMakeQuestionCmsContent, makeQuestionInitialData: makeQuestionInitialData, - } ); + }); + //Act vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); @@ -40,8 +57,8 @@ describe("vehicle-make.vue", () => { //Arrange const pageHeaderWidgetHeaderText = "Select a make to get started"; - const { wrapper, apiPromise } = setupMocks( { pageHeaderWidgetHeaderText: pageHeaderWidgetHeaderText }); - + const { wrapper, apiPromise } = setupMocks({ pageHeaderWidgetHeaderText: pageHeaderWidgetHeaderText }); + //Act vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); @@ -61,8 +78,8 @@ describe("vehicle-make.vue", () => { LogoImage: "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", } - const { wrapper, apiPromise } = setupMocks( { SiteHeaderWidget: SiteHeaderWidget}); - + const { wrapper, apiPromise } = setupMocks({ SiteHeaderWidget: SiteHeaderWidget }); + //Act vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); @@ -82,8 +99,8 @@ describe("vehicle-make.vue", () => { GenericVehicleImage: "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", } - const { wrapper, apiPromise } = setupMocks( { VehicleBannerWidget: VehicleBannerWidget}); - + const { wrapper, apiPromise } = setupMocks({ VehicleBannerWidget: VehicleBannerWidget }); + //Act vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); @@ -97,9 +114,9 @@ describe("vehicle-make.vue", () => { describe("vehicle-make.vue", () => { test("BackButtonAction triggers a router.navigate change", async (done) => { - + //Arrange - const { wrapper, apiPromise } = setupMocks( { + const { wrapper, apiPromise } = setupMocks({ pageHeaderWidgetHeaderText: "Select a make to get started", mountOptionsMockData: { router: { @@ -121,32 +138,59 @@ describe("vehicle-make.vue", () => { }); }); +describe("vehicle-make.vue", () => { + test("arePagePrerequisitesValid", async (done) => { + + //Arrange + const { wrapper, apiPromise } = setupMocks({ + pageHeaderWidgetHeaderText: "Select a make to get started", + mountOptionsMockData: {}, + }); + + //Act + vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); + + let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + await nextTick(); + + //Assert + apiPromise.finally(() => { + expect(arePagePrerequisitesValid).toBe(true); + done(); + }); + }); +}); + + function setupMocks({ vehicleMakeQuestionCmsContent = {}, makeQuestionInitialData = {}, pageHeaderWidgetHeaderText = {}, mountOptionsMockData = {}, }) { - + //Mock api responses const apiResponses = { cmsContent: { FunnelSubHeaderWidget: pageHeaderWidgetHeaderText, VehicleMakeQuestion: vehicleMakeQuestionCmsContent, - VehicleBannerWidget: - { - GenericVehicleImage: - "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", - }, - FunnelHeaderWidget: - { - LogoImage: - "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", - }, + VehicleBannerWidget: + { + GenericVehicleImage: + "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", + }, + FunnelHeaderWidget: + { + LogoImage: + "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", + }, }, makeQuestionInitialData: makeQuestionInitialData, }; + const apiPromise = Promise.resolve(apiResponses); + + fetchCmsContentForPage.mockImplementation(() => Promise.resolve()); settleAllPromises.mockImplementation(() => apiPromise); //Mock make question methods @@ -163,6 +207,7 @@ function setupMocks({ funnelSubHeader.methods = { initializeComponent: jest.fn(), }; + const mountOptions = getMountOptions(mountOptionsMockData); const wrapper = shallowMount(vehicleMake, mountOptions); const makeQuestionWrapper = wrapper.findComponent({ name: "makeQuestion" }); diff --git a/src/layouts/vehicle-make/vehicle-make.vue b/src/layouts/vehicle-make/vehicle-make.vue index 91fe4c9d5..ee90b2d36 100644 --- a/src/layouts/vehicle-make/vehicle-make.vue +++ b/src/layouts/vehicle-make/vehicle-make.vue @@ -4,11 +4,11 @@
-
@@ -25,6 +25,7 @@ import funnelSubHeader from "@/common-components/funnel-sub-header/funnel-sub-he // Supporting files import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { settleAllPromises } from "@/helpers/layout-helper"; +import store from "@/store"; export default { name: "vehicle-make", data() { @@ -53,7 +54,6 @@ export default { ]; const resultMap = await settleAllPromises(promiseResultMap); - // Call the "next" function to complete the transition to this page. next((vm) => { vm.$refs.funnelSubHeader.initializeComponent( @@ -77,6 +77,10 @@ export default { // route to move backwards this.$router.navigate(this.navigationScenarios.CLICKED_BACK, this.$route); }, + arePagePrerequisitesValid() { + console.log(store.getters.vehicle); + return store.getters.vehicle.year !== null; + }, }, watch: { diff --git a/src/layouts/vehicle-model/vehicle-model.vue b/src/layouts/vehicle-model/vehicle-model.vue index b06486c74..b27b98d40 100644 --- a/src/layouts/vehicle-model/vehicle-model.vue +++ b/src/layouts/vehicle-model/vehicle-model.vue @@ -25,6 +25,8 @@ import vehicleBanner from "@/common-components/vehicle-banner/vehicle-banner"; // Supporting files import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { settleAllPromises } from "@/helpers/layout-helper"; +import store from "@/store"; + export default { name: "vehicle-model", data() { @@ -77,6 +79,9 @@ export default { // route to move backwards this.$router.navigate(this.navigationScenarios.CLICKED_BACK, this.$route); }, + arePagePrerequisitesValid() { + return store.getters.vehicle.make !== null; + }, }, watch: { diff --git a/src/layouts/vehicle-style/vehicle-style.vue b/src/layouts/vehicle-style/vehicle-style.vue index 3c0023db1..7193c9e39 100644 --- a/src/layouts/vehicle-style/vehicle-style.vue +++ b/src/layouts/vehicle-style/vehicle-style.vue @@ -25,6 +25,8 @@ import vehicleBanner from "@/common-components/vehicle-banner/vehicle-banner"; // Supporting files import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { settleAllPromises } from "@/helpers/layout-helper"; +import store from "@/store"; + export default { name: "vehicle-style", data() { @@ -78,17 +80,31 @@ export default { this.$router.navigate(this.navigationScenarios.CLICKED_BACK, this.$route); }, setVehicle() { - return this.dispatchNonBlockingStoreAction(this.storeActions.SET_VEHICLE, {year: this.$store.getters.vehicle.year, make: this.$store.getters.vehicle.make, model: this.$store.getters.vehicle.model, style: this.$store.getters.vehicle.style}); - } + return this.dispatchNonBlockingStoreAction( + this.storeActions.SET_VEHICLE, + { + year: this.$store.getters.vehicle.year, + make: this.$store.getters.vehicle.make, + model: this.$store.getters.vehicle.model, + style: this.$store.getters.vehicle.style, + } + ); + }, + arePagePrerequisitesValid() { + return store.getters.vehicle.model !== null; + }, }, watch: { selectedStyle(style) { this.$store.commit(this.storeMutations.UPDATE_STYLE, style); this.setVehicle().then(() => { - this.$router.navigate(this.navigationScenarios.SELECTED_STYLE, this.$route); + this.$router.navigate( + this.navigationScenarios.SELECTED_STYLE, + this.$route + ); }); - } + }, }, components: { diff --git a/src/layouts/vehicle-year/vehicle-year.vue b/src/layouts/vehicle-year/vehicle-year.vue index dbf488ea2..ddef0d5a8 100644 --- a/src/layouts/vehicle-year/vehicle-year.vue +++ b/src/layouts/vehicle-year/vehicle-year.vue @@ -4,9 +4,7 @@
- +
@@ -80,6 +78,11 @@ export default { ); }, }, + methods: { + arePagePrerequisitesValid() { + return true; + }, + }, components: { yearQuestion, funnelHeader, diff --git a/src/router/index.js b/src/router/index.js index 2a80032f6..7482a3d50 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -44,6 +44,13 @@ const routes = [ try { // If we already have our route, go to it. if (router.hasRoute(to.query.fmgPage)) { + // Since our route is already in scope, we can grab the component from it and call the arePagePrerequisitesValid function. + let arePagePrerequisitesValid = router.getRoutes().filter(x => x.name === to.query.fmgPage)[0].components.default.methods.arePagePrerequisitesValid(); + + if (!arePagePrerequisitesValid) { + await GoToFunnelStartOn404(next); + } + return next({ name: to.query.fmgPage, query: to.query }); } @@ -57,9 +64,17 @@ const routes = [ component: routeData[0].component, }); + // Call the next components arePagePrerequisitesValid method before load. + // If it returns false, use the 404 logic. + let nextComponent = await router.getRoutes().filter(x => x.name === routeData[0].name)[0].components.default(); + + if (!nextComponent.default.methods.arePagePrerequisitesValid()) { + await GoToFunnelStartOn404(next); + } + // Assign current query string parameters, as well as our fmgPage one. next({ name: routeData[0].name, query: Object.assign(to.query, { fmgPage: routeData[0].name }) }); - + } catch (error) { console.log(error); @@ -79,6 +94,7 @@ const router = createRouter({ //---------------------------------------------------------- Router Functions ---------------------------------------------------------- + // Navigate to the next route, depending on the scenario. router.navigate = ( scenario, From 0fc7ea8d67781930676b17995ed6bb0490dd63c1 Mon Sep 17 00:00:00 2001 From: FrankRua Date: Fri, 28 Jan 2022 10:19:51 -0500 Subject: [PATCH 2/4] added tests, increased code coverage --- jest.config.js | 2 +- .../vehicle-damage/vehicle-damage.spec.js | 222 +++++++++++------- src/layouts/vehicle-make/vehicle-make.spec.js | 33 ++- src/layouts/vehicle-make/vehicle-make.vue | 1 - .../vehicle-model/vehicle-model.spec.js | 83 +++++-- .../vehicle-style/vehicle-style.spec.js | 51 +++- src/layouts/vehicle-year/vehicle-year.spec.js | 18 ++ src/mixins/base-mixin.spec.js | 49 ++++ 8 files changed, 328 insertions(+), 131 deletions(-) diff --git a/jest.config.js b/jest.config.js index 7a6fcbc01..f4355ef93 100644 --- a/jest.config.js +++ b/jest.config.js @@ -18,7 +18,7 @@ module.exports = { testMatch: ["**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)"], coverageThreshold: { global: { - statements: 85, + statements: 87, }, }, }; diff --git a/src/layouts/vehicle-damage/vehicle-damage.spec.js b/src/layouts/vehicle-damage/vehicle-damage.spec.js index a6688a9af..02a50023c 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.spec.js +++ b/src/layouts/vehicle-damage/vehicle-damage.spec.js @@ -1,16 +1,34 @@ -import { shallowMount, flushPromises } from "@vue/test-utils"; -import { getMountOptions } from "@/helpers/unit-test-helper.js"; +// Components import vehicleDamage from "@/layouts/vehicle-damage/vehicle-damage.vue"; import funnelHeader from "@/common-components/funnel-header/funnel-header"; import vehicleBanner from "@/common-components/vehicle-banner/vehicle-banner"; import funnelSubHeader from "@/common-components/funnel-sub-header/funnel-sub-header"; + +// Supporting Files import { settleAllPromises } from "@/helpers/layout-helper.js"; import baseMixin from "@/mixins/base-mixin"; +import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; +import { shallowMount } from "@vue/test-utils"; +import { getMountOptions } from "@/helpers/unit-test-helper.js"; import { nextTick } from "vue"; // Mock our module for promises. jest.mock("@/helpers/layout-helper.js", () => ({ - settleAllPromises: jest.fn(), + settleAllPromises: jest.fn(), +})); + +// Mock fetchCmsContentForPage +jest.mock("@/helpers/cms-content-helper", () => ({ + fetchCmsContentForPage: jest.fn(), +})); + +// Mock Store +jest.mock("@/store", () => ({ + getters: { + vehicle: { + carId: "C00000000" + } + } })); describe("vehicle-damage.vue", () => { @@ -18,7 +36,7 @@ describe("vehicle-damage.vue", () => { //Arrange const pageHeaderWidgetHeaderText = "Select Damage"; - const { wrapper, apiPromise } = setupMocks( { pageHeaderWidgetHeaderText: pageHeaderWidgetHeaderText }); + const { wrapper, apiPromise } = setupMocks({ pageHeaderWidgetHeaderText: pageHeaderWidgetHeaderText }); //Act vehicleDamage.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-damage" } }, undefined, (c) => c(wrapper.vm)); @@ -32,94 +50,120 @@ describe("vehicle-damage.vue", () => { }); describe("vehicle-damage.vue", () => { - test("Page logo image is initailized with api data", async (done) => { - - //Arrange - const SiteHeaderWidget = { - LogoImage: - "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", - } - const { wrapper, apiPromise } = setupMocks( { SiteHeaderWidget: SiteHeaderWidget}); - - //Act - vehicleDamage.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-damage" } }, undefined, (c) => c(wrapper.vm)); - - //Assert - apiPromise.finally(() => { - expect(funnelHeader.methods.initializeComponent).toHaveBeenCalledWith(SiteHeaderWidget); - done(); - }); - }); - }); + test("Page logo image is initailized with api data", async (done) => { - describe("vehicle-damage.vue", () => { - test("Vehicle image is initailized with api data", async (done) => { - - //Arrange - const VehicleBannerWidget = { - GenericVehicleImage: - "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", - } - const { wrapper, apiPromise } = setupMocks( { VehicleBannerWidget: VehicleBannerWidget}); - - //Act - vehicleDamage.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-damage" } }, undefined, (c) => c(wrapper.vm)); - - //Assert - apiPromise.finally(() => { - expect(vehicleBanner.methods.initializeComponent).toHaveBeenCalledWith(VehicleBannerWidget); - done(); - }); + //Arrange + const SiteHeaderWidget = { + LogoImage: + "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", + } + const { wrapper, apiPromise } = setupMocks({ SiteHeaderWidget: SiteHeaderWidget }); + + //Act + vehicleDamage.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-damage" } }, undefined, (c) => c(wrapper.vm)); + + //Assert + apiPromise.finally(() => { + expect(funnelHeader.methods.initializeComponent).toHaveBeenCalledWith(SiteHeaderWidget); + done(); }); }); +}); + +describe("vehicle-damage.vue", () => { + test("Vehicle image is initailized with api data", async (done) => { + + //Arrange + const VehicleBannerWidget = { + GenericVehicleImage: + "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", + } + const { wrapper, apiPromise } = setupMocks({ VehicleBannerWidget: VehicleBannerWidget }); + + //Act + vehicleDamage.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-damage" } }, undefined, (c) => c(wrapper.vm)); + + //Assert + apiPromise.finally(() => { + expect(vehicleBanner.methods.initializeComponent).toHaveBeenCalledWith(VehicleBannerWidget); + done(); + }); + }); +}); + +describe("vehicle-damage.vue", () => { + test("CarId set, arePagePrerequisitesValid should be true ", async () => { + + //Arrange + const { wrapper } = setupMocks({}); + + //Act + vehicleDamage.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-damage" } }, undefined, (c) => c(wrapper.vm)); + + let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + await nextTick(); + + //Assert + expect(arePagePrerequisitesValid).toBe(true); + }); +}); function setupMocks({ - pageHeaderWidgetHeaderText = {}, - mountOptionsMockData = {}, - }) { - - //Mock api responses - baseMixin.methods.dispatchNonBlockingStoreAction = jest.fn(); - baseMixin.methods.dispatchNonBlockingStoreAction.mockImplementation(() => { - return Promise.resolve({ data: ['Front Window', 'Back Window', 'Side Window'] }); - }); - const apiResponses = { - cmsContent: { - FunnelSubHeaderWidget: pageHeaderWidgetHeaderText, - VehicleBannerWidget: - { - GenericVehicleImage: - "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", - }, - FunnelHeaderWidget: - { - LogoImage: - "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", - }, + pageHeaderWidgetHeaderText = {}, + mountOptionsMockData = {}, +}) { + + //Mock api responses + baseMixin.methods.dispatchNonBlockingStoreAction = jest.fn(); + baseMixin.methods.dispatchNonBlockingStoreAction.mockImplementation(() => { + return Promise.resolve({ data: ['Front Window', 'Back Window', 'Side Window'] }); + }); + const apiResponses = { + cmsContent: { + FunnelSubHeaderWidget: pageHeaderWidgetHeaderText, + VehicleBannerWidget: + { + GenericVehicleImage: + "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", }, - damageOptions: ['Front Window', 'Back Window', 'Side Window'], - }; - const apiPromise = Promise.resolve(apiResponses); - settleAllPromises.mockImplementation(() => apiPromise); - - //Mock damage initialize methods - funnelHeader.methods = { - initializeComponent: jest.fn(), - }; - vehicleBanner.methods = { - initializeComponent: jest.fn(), - }; - funnelSubHeader.methods = { - initializeComponent: jest.fn(), - }; - const mountOptions = getMountOptions(mountOptionsMockData); - const wrapper = shallowMount(vehicleDamage, mountOptions); - const funnelHeaderWrapper = wrapper.findComponent({ name: "funnelHeader" }); - funnelHeaderWrapper.vm.initializeComponent = funnelHeader.methods.initializeComponent; - const vehicleBannerWrapper = wrapper.findComponent({ name: "vehicleBanner" }); - vehicleBannerWrapper.vm.initializeComponent = vehicleBanner.methods.initializeComponent; - const funnelSubHeaderWrapper = wrapper.findComponent({ name: "funnelSubHeader" }); - funnelSubHeaderWrapper.vm.initializeComponent = funnelSubHeader.methods.initializeComponent; - - return { wrapper, apiPromise }; - } \ No newline at end of file + FunnelHeaderWidget: + { + LogoImage: + "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", + }, + }, + damageOptions: ['Front Window', 'Back Window', 'Side Window'], + }; + + const apiPromise = Promise.resolve(apiResponses); + + settleAllPromises.mockImplementation(() => apiPromise); + fetchCmsContentForPage.mockImplementation(() => Promise.resolve()); + + //Mock damage initialize methods + funnelHeader.methods = { + initializeComponent: jest.fn(), + }; + + vehicleBanner.methods = { + initializeComponent: jest.fn(), + }; + + funnelSubHeader.methods = { + initializeComponent: jest.fn(), + }; + + const mountOptions = getMountOptions(mountOptionsMockData); + const wrapper = shallowMount(vehicleDamage, mountOptions); + + const funnelHeaderWrapper = wrapper.findComponent({ name: "funnelHeader" }); + funnelHeaderWrapper.vm.initializeComponent = funnelHeader.methods.initializeComponent; + + const vehicleBannerWrapper = wrapper.findComponent({ name: "vehicleBanner" }); + vehicleBannerWrapper.vm.initializeComponent = vehicleBanner.methods.initializeComponent; + + const funnelSubHeaderWrapper = wrapper.findComponent({ name: "funnelSubHeader" }); + funnelSubHeaderWrapper.vm.initializeComponent = funnelSubHeader.methods.initializeComponent; + + return { wrapper, apiPromise }; +} \ No newline at end of file diff --git a/src/layouts/vehicle-make/vehicle-make.spec.js b/src/layouts/vehicle-make/vehicle-make.spec.js index 41a7939ad..8043b94d7 100644 --- a/src/layouts/vehicle-make/vehicle-make.spec.js +++ b/src/layouts/vehicle-make/vehicle-make.spec.js @@ -9,11 +9,11 @@ import { settleAllPromises } from "@/helpers/layout-helper.js"; import { nextTick } from "vue"; import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; -// Mock Store + jest.mock("@/store", () => ({ getters: { - vehicle: { - year: 2019, + vehicle: { + year: 2019 } } })); @@ -28,6 +28,9 @@ jest.mock("@/helpers/layout-helper.js", () => ({ settleAllPromises: jest.fn(), })); +beforeEach(() => { + jest.resetModules(); +}); describe("vehicle-make.vue", () => { test("Make question component is initized with api data", async (done) => { @@ -40,7 +43,7 @@ describe("vehicle-make.vue", () => { makeQuestionInitialData: makeQuestionInitialData, }); - + //Act vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); @@ -58,7 +61,7 @@ describe("vehicle-make.vue", () => { //Arrange const pageHeaderWidgetHeaderText = "Select a make to get started"; const { wrapper, apiPromise } = setupMocks({ pageHeaderWidgetHeaderText: pageHeaderWidgetHeaderText }); - + //Act vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); @@ -79,7 +82,7 @@ describe("vehicle-make.vue", () => { "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", } const { wrapper, apiPromise } = setupMocks({ SiteHeaderWidget: SiteHeaderWidget }); - + //Act vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); @@ -100,7 +103,7 @@ describe("vehicle-make.vue", () => { "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", } const { wrapper, apiPromise } = setupMocks({ VehicleBannerWidget: VehicleBannerWidget }); - + //Act vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); @@ -124,7 +127,7 @@ describe("vehicle-make.vue", () => { }, }, }); - + //Act vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); wrapper.vm.backButtonAction(); @@ -139,13 +142,10 @@ describe("vehicle-make.vue", () => { }); describe("vehicle-make.vue", () => { - test("arePagePrerequisitesValid", async (done) => { + test("Year set, arePagePrerequisitesValid should be true ", async () => { //Arrange - const { wrapper, apiPromise } = setupMocks({ - pageHeaderWidgetHeaderText: "Select a make to get started", - mountOptionsMockData: {}, - }); + const { wrapper } = setupMocks({}); //Act vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); @@ -154,10 +154,7 @@ describe("vehicle-make.vue", () => { await nextTick(); //Assert - apiPromise.finally(() => { - expect(arePagePrerequisitesValid).toBe(true); - done(); - }); + expect(arePagePrerequisitesValid).toBe(true); }); }); @@ -187,7 +184,7 @@ function setupMocks({ }, makeQuestionInitialData: makeQuestionInitialData, }; - + const apiPromise = Promise.resolve(apiResponses); fetchCmsContentForPage.mockImplementation(() => Promise.resolve()); diff --git a/src/layouts/vehicle-make/vehicle-make.vue b/src/layouts/vehicle-make/vehicle-make.vue index ee90b2d36..111b16e5f 100644 --- a/src/layouts/vehicle-make/vehicle-make.vue +++ b/src/layouts/vehicle-make/vehicle-make.vue @@ -78,7 +78,6 @@ export default { this.$router.navigate(this.navigationScenarios.CLICKED_BACK, this.$route); }, arePagePrerequisitesValid() { - console.log(store.getters.vehicle); return store.getters.vehicle.year !== null; }, }, diff --git a/src/layouts/vehicle-model/vehicle-model.spec.js b/src/layouts/vehicle-model/vehicle-model.spec.js index 861303ac8..1187220b7 100644 --- a/src/layouts/vehicle-model/vehicle-model.spec.js +++ b/src/layouts/vehicle-model/vehicle-model.spec.js @@ -1,25 +1,45 @@ -import { shallowMount, flushPromises } from "@vue/test-utils"; -import { getMountOptions } from "@/helpers/unit-test-helper.js"; +// Components import vehicleModel from "@/layouts/vehicle-model/vehicle-model.vue"; import modelQuestion from "@/layouts/vehicle-model/model-question/model-question"; import funnelHeader from "@/common-components/funnel-header/funnel-header"; import vehicleBanner from "@/common-components/vehicle-banner/vehicle-banner"; import funnelSubHeader from "@/common-components/funnel-sub-header/funnel-sub-header"; + +// Supporting files import { settleAllPromises } from "@/helpers/layout-helper.js"; +import { shallowMount, flushPromises } from "@vue/test-utils"; +import { getMountOptions } from "@/helpers/unit-test-helper.js"; import { nextTick } from "vue"; +import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; + // Mock our module for promises. jest.mock("@/helpers/layout-helper.js", () => ({ settleAllPromises: jest.fn(), })); + +// Mock fetchCmsContentForPage +jest.mock("@/helpers/cms-content-helper", () => ({ + fetchCmsContentForPage: jest.fn(), +})); + +// Mock Store +jest.mock("@/store", () => ({ + getters: { + vehicle: { + make: "Acura" + } + } +})); + describe("vehicle-model.vue", () => { test("Model question component is initized with api data", async (done) => { //Arange const buttonQuestionContent = { QuestionText: "What model is your vehicle?" }; const modelQuestionInitialData = ["accord", "civic", "insight"]; - const { wrapper, apiPromise } = setupMocks( { - buttonQuestionContent: buttonQuestionContent, + const { wrapper, apiPromise } = setupMocks({ + buttonQuestionContent: buttonQuestionContent, modelQuestionInitialData: modelQuestionInitialData, - } ); + }); //Act vehicleModel.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-model" } }, undefined, (c) => c(wrapper.vm)); //Assert @@ -33,7 +53,7 @@ describe("vehicle-model.vue", () => { test("Page header is initailized with api data", async (done) => { //Arrange const pageHeaderWidgetHeaderText = "Select a model to get started"; - const { wrapper, apiPromise } = setupMocks( { pageHeaderWidgetHeaderText: pageHeaderWidgetHeaderText }); + const { wrapper, apiPromise } = setupMocks({ pageHeaderWidgetHeaderText: pageHeaderWidgetHeaderText }); //Act vehicleModel.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-model" } }, undefined, (c) => c(wrapper.vm)); //Assert @@ -50,7 +70,7 @@ describe("vehicle-model.vue", () => { LogoImage: "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", } - const { wrapper, apiPromise } = setupMocks( { SiteHeaderWidget: SiteHeaderWidget}); + const { wrapper, apiPromise } = setupMocks({ SiteHeaderWidget: SiteHeaderWidget }); //Act vehicleModel.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-model" } }, undefined, (c) => c(wrapper.vm)); //Assert @@ -67,7 +87,7 @@ describe("vehicle-model.vue", () => { GenericVehicleImage: "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", } - const { wrapper, apiPromise } = setupMocks( { VehicleBannerWidget: VehicleBannerWidget}); + const { wrapper, apiPromise } = setupMocks({ VehicleBannerWidget: VehicleBannerWidget }); //Act vehicleModel.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-model" } }, undefined, (c) => c(wrapper.vm)); //Assert @@ -80,7 +100,7 @@ describe("vehicle-model.vue", () => { describe("vehicle-model.vue", () => { test("BackButtonAction triggers a router.navigate change", async (done) => { //Arrange - const { wrapper, apiPromise } = setupMocks( { + const { wrapper, apiPromise } = setupMocks({ pageHeaderWidgetHeaderText: "Select a model to get started", mountOptionsMockData: { router: { @@ -99,6 +119,23 @@ describe("vehicle-model.vue", () => { }); }); }); +describe("vehicle-model.vue", () => { + test("Make set, arePagePrerequisitesValid should be true ", async () => { + + //Arrange + const { wrapper } = setupMocks({}); + + //Act + vehicleModel.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-model" } }, undefined, (c) => c(wrapper.vm)); + + let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + await nextTick(); + + //Assert + expect(arePagePrerequisitesValid).toBe(true); + }); +}); + function setupMocks({ buttonQuestionContent = {}, modelQuestionInitialData = {}, @@ -110,21 +147,24 @@ function setupMocks({ cmsContent: { FunnelSubHeaderWidget: pageHeaderWidgetHeaderText, VehicleModelQuestion: buttonQuestionContent, - VehicleBannerWidget: - { - GenericVehicleImage: - "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", - }, - FunnelHeaderWidget: - { - LogoImage: - "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", - }, + VehicleBannerWidget: + { + GenericVehicleImage: + "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", + }, + FunnelHeaderWidget: + { + LogoImage: + "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", + }, }, modelQuestionInitialData: modelQuestionInitialData, }; const apiPromise = Promise.resolve(apiResponses); + settleAllPromises.mockImplementation(() => apiPromise); + fetchCmsContentForPage.mockImplementation(() => Promise.resolve()); + //Mock model question methods modelQuestion.methods = { loadInitialData: jest.fn(), @@ -141,13 +181,18 @@ function setupMocks({ }; const mountOptions = getMountOptions(mountOptionsMockData); const wrapper = shallowMount(vehicleModel, mountOptions); + const modelQuestionWrapper = wrapper.findComponent({ name: "modelQuestion" }); modelQuestionWrapper.vm.initializeComponent = modelQuestion.methods.initializeComponent; + const funnelHeaderWrapper = wrapper.findComponent({ name: "funnelHeader" }); funnelHeaderWrapper.vm.initializeComponent = funnelHeader.methods.initializeComponent; + const vehicleBannerWrapper = wrapper.findComponent({ name: "vehicleBanner" }); vehicleBannerWrapper.vm.initializeComponent = vehicleBanner.methods.initializeComponent; + const funnelSubHeaderWrapper = wrapper.findComponent({ name: "funnelSubHeader" }); funnelSubHeaderWrapper.vm.initializeComponent = funnelSubHeader.methods.initializeComponent; + return { wrapper, apiPromise }; } \ No newline at end of file diff --git a/src/layouts/vehicle-style/vehicle-style.spec.js b/src/layouts/vehicle-style/vehicle-style.spec.js index 31c1b2487..d408ceb9d 100644 --- a/src/layouts/vehicle-style/vehicle-style.spec.js +++ b/src/layouts/vehicle-style/vehicle-style.spec.js @@ -1,19 +1,37 @@ -import { shallowMount, flushPromises } from "@vue/test-utils"; -import { getMountOptions } from "@/helpers/unit-test-helper.js"; -import { storeActions } from "@/constants/store-actions"; +// Components import vehicleStyle from "@/layouts/vehicle-style/vehicle-style.vue"; import funnelHeader from "@/common-components/funnel-header/funnel-header"; import vehicleBanner from "@/common-components/vehicle-banner/vehicle-banner"; import funnelSubHeader from "@/common-components/funnel-sub-header/funnel-sub-header"; import styleQuestion from "@/layouts/vehicle-style/style-question/style-question"; + +// Supporting files import { settleAllPromises } from "@/helpers/layout-helper.js"; import { nextTick } from "vue"; +import { shallowMount } from "@vue/test-utils"; +import { getMountOptions } from "@/helpers/unit-test-helper.js"; +import { storeActions } from "@/constants/store-actions"; +import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; // Mock our module for promises. jest.mock("@/helpers/layout-helper.js", () => ({ settleAllPromises: jest.fn(), })); +// Mock fetchCmsContentForPage +jest.mock("@/helpers/cms-content-helper", () => ({ + fetchCmsContentForPage: jest.fn(), +})); + +// Mock Store +jest.mock("@/store", () => ({ + getters: { + vehicle: { + model: "TL" + } + } +})); + describe("vehicle-style.vue", () => { test("Style question component is initized with api data", async (done) => { @@ -162,6 +180,22 @@ describe("vehicle-style.vue", () => { }); }); +describe("vehicle-style.vue", () => { + test("Model set, arePagePrerequisitesValid should be true ", async () => { + + //Arrange + const { wrapper } = setupMocks({}); + + //Act + vehicleStyle.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-style" } }, undefined, (c) => c(wrapper.vm)); + + let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + await nextTick(); + + //Assert + expect(arePagePrerequisitesValid).toBe(true); + }); +}); function setupMocks({ vehicleStyleQuestionCmsContent = {}, styleQuestionInitialData = {}, @@ -187,31 +221,42 @@ function setupMocks({ }, styleQuestionInitialData: styleQuestionInitialData, }; + const apiPromise = Promise.resolve(apiResponses); + settleAllPromises.mockImplementation(() => apiPromise); + fetchCmsContentForPage.mockImplementation(() => Promise.resolve()); //Mock style question methods styleQuestion.methods = { loadInitialData: jest.fn(), initializeComponent: jest.fn(), }; + funnelHeader.methods = { initializeComponent: jest.fn(), }; + vehicleBanner.methods = { initializeComponent: jest.fn(), }; + funnelSubHeader.methods = { initializeComponent: jest.fn(), }; + const mountOptions = getMountOptions(mountOptionsMockData); const wrapper = shallowMount(vehicleStyle, mountOptions); + const styleQuestionWrapper = wrapper.findComponent({ name: "styleQuestion" }); styleQuestionWrapper.vm.initializeComponent = styleQuestion.methods.initializeComponent; + const funnelHeaderWrapper = wrapper.findComponent({ name: "funnelHeader" }); funnelHeaderWrapper.vm.initializeComponent = funnelHeader.methods.initializeComponent; + const vehicleBannerWrapper = wrapper.findComponent({ name: "vehicleBanner" }); vehicleBannerWrapper.vm.initializeComponent = vehicleBanner.methods.initializeComponent; + const funnelSubHeaderWrapper = wrapper.findComponent({ name: "funnelSubHeader" }); funnelSubHeaderWrapper.vm.initializeComponent = funnelSubHeader.methods.initializeComponent; diff --git a/src/layouts/vehicle-year/vehicle-year.spec.js b/src/layouts/vehicle-year/vehicle-year.spec.js index df0668c31..c386bf4d4 100644 --- a/src/layouts/vehicle-year/vehicle-year.spec.js +++ b/src/layouts/vehicle-year/vehicle-year.spec.js @@ -77,6 +77,24 @@ describe("vehicle-year.vue", () => { }); }); + +describe("vehicle-year.vue", () => { + test("arePagePrerequisitesValid should be true ", async () => { + + //Arrange + const { wrapper } = setupMocks({}); + + //Act + vehicleYear.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); + + let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + await nextTick(); + + //Assert + expect(arePagePrerequisitesValid).toBe(true); + }); +}); + function setupMocks({ vehicleYearQuestionCmsContent = {}, yearQuestionInitialData = {}, diff --git a/src/mixins/base-mixin.spec.js b/src/mixins/base-mixin.spec.js index e9ccbdc5b..42281c4d7 100644 --- a/src/mixins/base-mixin.spec.js +++ b/src/mixins/base-mixin.spec.js @@ -1,6 +1,8 @@ import baseMixin from "@/mixins/base-mixin"; import { storeActions } from "@/constants/store-actions.js"; import { widgetNames } from "@/constants/widget-names.js"; +import { storeMutations } from "@/constants/store-mutations.js"; +import { navigationScenarios } from "@/router/router-constants/navigation-scenarios"; import store from "@/store"; describe("baseMixin.js", () => { @@ -23,7 +25,54 @@ describe("baseMixin.js", () => { expect(store.dispatch).toBeCalledWith(type, payload); }); + + test("computed: storeActions should be equal to import object", () => { + // Arrange + const mixIn = getMixInInstance({}); + + // Act + let storeActionsForTest = mixIn.computed.storeActions(); + + // Assert + expect(storeActionsForTest).toEqual(storeActions); + }); + + test("computed: storeMutations should be equal to import object", () => { + // Arrange + const mixIn = getMixInInstance({}); + + // Act + let storeMutationsForTest = mixIn.computed.storeMutations(); + + // Assert + expect(storeMutationsForTest).toEqual(storeMutations); + }); + + test("computed: navigationScenarios should be equal to import object", () => { + // Arrange + const mixIn = getMixInInstance({}); + + // Act + let navigationScenariosForTest = mixIn.computed.navigationScenarios(); + + // Assert + expect(navigationScenariosForTest).toEqual(navigationScenarios); + }); + + test("computed: widgetNames should be equal to import object", () => { + // Arrange + const mixIn = getMixInInstance({}); + + // Act + let widgetNamesForTest = mixIn.computed.widgetNames(); + + // Assert + expect(widgetNamesForTest).toEqual(widgetNames); + }); + }); + + function getMixInInstance({ isDispatchSuccess = true }) { // Mock Store const storeDispatch = jest.fn(); From b92c425fb45e7f9332e62d915f8ad8328e49c5ab Mon Sep 17 00:00:00 2001 From: FrankRua Date: Fri, 28 Jan 2022 10:22:33 -0500 Subject: [PATCH 3/4] Linter --- jest.config.js | 2 +- src/App.vue | 10 +- .../button-back/button-back.spec.js | 4 +- .../button-back/button-back.vue | 35 +- .../button-question/button-question.spec.js | 4 +- .../button-question/button-question.vue | 104 +- .../funnel-header/funnel-header.spec.js | 4 +- .../funnel-header/funnel-header.vue | 91 +- .../funnel-sub-header.spec.js | 6 +- .../funnel-sub-header/funnel-sub-header.vue | 34 +- .../text-input/text-input.spec.js | 7 +- .../text-input/text-input.vue | 20 +- .../vehicle-banner/vehicle-banner.spec.js | 6 +- .../vehicle-banner/vehicle-banner.vue | 6 +- src/constants/events.js | 26 +- src/helpers/cms-content-helper.js | 53 +- src/helpers/cms-helper.spec.js | 52 +- src/helpers/event-bus/event-bus.js | 39 +- src/helpers/event-bus/event-bus.spec.js | 83 +- src/layouts/address-poc/address-poc.vue | 57 +- src/layouts/component-test/component-test.vue | 1168 +++++++++-------- src/layouts/form-test/form-test.vue | 426 +++--- .../vehicle-damage/vehicle-damage.spec.js | 94 +- .../make-question/make-question.spec.js | 55 +- .../make-question/make-question.vue | 14 +- src/layouts/vehicle-make/vehicle-make.spec.js | 121 +- .../model-question/model-question.spec.js | 61 +- .../model-question/model-question.vue | 14 +- .../vehicle-model/vehicle-model.spec.js | 112 +- .../style-question/style-question.spec.js | 57 +- .../style-question/style-question.vue | 18 +- .../vehicle-style/vehicle-style.spec.js | 168 ++- src/layouts/vehicle-year/vehicle-year.spec.js | 105 +- .../year-question/year-question.spec.js | 53 +- .../year-question/year-question.vue | 16 +- src/main.js | 1 - src/mixins/base-mixin.js | 3 +- src/mixins/base-mixin.spec.js | 8 +- src/router/index.js | 34 +- src/router/router-constants/routing-table.js | 8 +- src/store/index.js | 49 +- src/store/store.spec.js | 67 +- .../button-main/button-main.spec.js | 25 +- src/ux-components/button-main/button-main.vue | 38 +- src/ux-components/checkbox/checkbox.spec.js | 17 +- src/ux-components/checkbox/checkbox.vue | 25 +- .../list-button-horizontal.spec.js | 34 +- .../list-button-horizontal.vue | 66 +- .../list-button/list-button.spec.js | 34 +- src/ux-components/list-button/list-button.vue | 69 +- src/ux-components/list-card/list-card.spec.js | 17 +- src/ux-components/list-card/list-card.vue | 105 +- src/ux-components/loader/loader.vue | 11 +- src/ux-components/text-link/text-link.spec.js | 11 +- src/ux-components/text-link/text-link.vue | 35 +- 55 files changed, 2158 insertions(+), 1624 deletions(-) diff --git a/jest.config.js b/jest.config.js index f4355ef93..bce302e5a 100644 --- a/jest.config.js +++ b/jest.config.js @@ -13,7 +13,7 @@ module.exports = { "!src/helpers/unit-test-helper.js", "!src/layouts/component-test/component-test.vue", "!src/layouts/form-test/form-test.vue", - "!src/layouts/address-poc/address-poc.vue" + "!src/layouts/address-poc/address-poc.vue", ], //! means exclude from coverage. testMatch: ["**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)"], coverageThreshold: { diff --git a/src/App.vue b/src/App.vue index f64aad6aa..e529f225a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,9 +3,9 @@ diff --git a/src/common-components/button-back/button-back.spec.js b/src/common-components/button-back/button-back.spec.js index b8bc3256d..c7bff87f0 100644 --- a/src/common-components/button-back/button-back.spec.js +++ b/src/common-components/button-back/button-back.spec.js @@ -2,7 +2,6 @@ import { shallowMount } from "@vue/test-utils"; import buttonBack from "./button-back"; describe("back button", () => { - test("renders a button", () => { // Arrange const myFunction = () => {}; @@ -14,10 +13,9 @@ describe("back button", () => { backButtonAccessibleText: "something", }, }); - + // Assert expect(wrapper.find("button").exists()).toBe(true); wrapper.unmount(); }); - }); diff --git a/src/common-components/button-back/button-back.vue b/src/common-components/button-back/button-back.vue index 7f06dfcec..cf3a630bf 100644 --- a/src/common-components/button-back/button-back.vue +++ b/src/common-components/button-back/button-back.vue @@ -1,23 +1,36 @@ diff --git a/src/layouts/component-test/component-test.vue b/src/layouts/component-test/component-test.vue index 7363ec3d4..2f5dc0308 100644 --- a/src/layouts/component-test/component-test.vue +++ b/src/layouts/component-test/component-test.vue @@ -8,10 +8,10 @@
@@ -23,27 +23,21 @@
- +
- +
@@ -56,31 +50,31 @@ Functioning as Checkbox
@@ -95,13 +89,13 @@
Functioning as Checkbox
@@ -112,13 +106,13 @@
Checkbox no Description
@@ -129,13 +123,13 @@
Functioning as Radio Button
@@ -146,13 +140,13 @@
Radio Button no Description
@@ -163,14 +157,14 @@
Horizontal Checkbox
@@ -181,14 +175,14 @@
Checkbox no Description
@@ -199,13 +193,13 @@
Horizontal Radio Button
@@ -216,13 +210,13 @@
Radio Button no Description
@@ -235,93 +229,99 @@
-
+
-

- Select Vehicle Year -

+

Select Vehicle Year

- @@ -333,187 +333,205 @@
-
+

Select Vehicle Year

Functioning as Radio Buttons
-
+

Select Vehicle Year

-

List Button - Multi-Line Centered

+

+ List Button - Multi-Line Centered +

Functioning as Checkboxes
-
+

Multi-Line Centered

Functioning as Radio Buttons
-
+

Multi-Line Centered

@@ -525,104 +543,108 @@
-
+
-

- Select Vehicle Year -

+

Select Vehicle Year

Functioning as Radio Buttons
-
+
-

- Select Vehicle Year -

+

Select Vehicle Year

@@ -633,22 +655,10 @@
-

-

-

- +

+

+

+
@@ -710,60 +720,60 @@
@@ -775,7 +785,7 @@
@@ -787,7 +797,7 @@
@@ -797,94 +807,94 @@
- + :answers="checkboxAnswers" + :isMultiSelect="true" + ariaLabelBy="checkbox" + groupName="checkbox-list" + questionText="List Button as checkbox" + /> - - - - - - - - + :answers="radioAnswers" + ariaLabelBy="radio" + groupName="radio-list" + questionText="List Button as radio" + /> + + + + + + + + +
@@ -913,75 +923,97 @@ export default { checkbox, funnelHeader, buttonQuestion, - textLink + textLink, }, data() { return { years: [2023, 2022, 2021, 2020], - checkboxAnswers: ['Checkbox Answer 1', 'Checkbox Answer 2', 'Checkbox Answer 3'], - radioAnswers: ['Radio Answer 1', 'Radio Answer 2', 'Radio Answer 3'], - horizontalCheckboxAnswers: ['HCB Answer 1', 'HCB Answer 2', 'HCB Answer 3'], - horizontalRadioAnswers: ['HR Answer 1', 'HR Answer 2', 'HR Answer 3'], - listCardCheckBox: [{ - Name: 'List-Card-CB', - Text: "List Card CB", - SubText: "checkbox", - ImageId: '53343ce4-5b6a-46aa-a80a-f948c1723955', - AnswerImageUrl: "side-window-damage-right-all.svg" - }], - listCardRadio: [{ - Name: 'List-Card-R', - Text: "List Card R", - SubText: "Radio", - ImageId: '53343ce4-5b6a-46aa-a80a-f948c1723955', - AnswerImageUrl: "side-window-damage-right-all.svg" - }], - listCardCheckBoxHorizontalSubText: [{ - Name: 'List-Card-CBHst', - Text: "List Card CBHst", - SubText: "With Subtext", - ImageId: '53343ce4-5b6a-46aa-a80a-f948c1723955', - AnswerImageUrl: "side-window-damage-right-all.svg" - }], - listCardCheckBoxHorizontal: [{ - Name: 'List-Card-CBH', - Text: "List Card CBH", - ImageId: '53343ce4-5b6a-46aa-a80a-f948c1723955', - AnswerImageUrl: "side-window-damage-right-all.svg" - }], - listRadioHorizontalSubText: [{ - Name: 'List-Card-RHst', - Text: "List Card RHst", - SubText: "With Subtext", - ImageId: '53343ce4-5b6a-46aa-a80a-f948c1723955', - AnswerImageUrl: "side-window-damage-right-all.svg" - }], - listRadioHorizontal: [{ - Name: 'List-Card-RH', - Text: "List Card RH", - ImageId: '53343ce4-5b6a-46aa-a80a-f948c1723955', - AnswerImageUrl: "side-window-damage-right-all.svg" - }], - listCardGroup: [{ - Name: 'Side-Window-1', - Text: "Side Window", - SubText: "With Subtext", - ImageId: '53343ce4-5b6a-46aa-a80a-f948c1723955', - AnswerImageUrl: "side-window-damage-right-all.svg" - }, - { - Name: 'Side-Window-2', - Text: "Side Window", - SubText: "With Subtext that is more than one line", - ImageId: '53343ce4-5b6a-46aa-a80a-f948c1723955', - AnswerImageUrl: "side-window-damage-right-all.svg" - }, - { - Name: 'Side-Window-3', - Text: "Side Window", - ImageId: '53343ce4-5b6a-46aa-a80a-f948c1723955', - AnswerImageUrl: "side-window-damage-right-all.svg" - }], + checkboxAnswers: [ + "Checkbox Answer 1", + "Checkbox Answer 2", + "Checkbox Answer 3", + ], + radioAnswers: ["Radio Answer 1", "Radio Answer 2", "Radio Answer 3"], + horizontalCheckboxAnswers: [ + "HCB Answer 1", + "HCB Answer 2", + "HCB Answer 3", + ], + horizontalRadioAnswers: ["HR Answer 1", "HR Answer 2", "HR Answer 3"], + listCardCheckBox: [ + { + Name: "List-Card-CB", + Text: "List Card CB", + SubText: "checkbox", + ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955", + AnswerImageUrl: "side-window-damage-right-all.svg", + }, + ], + listCardRadio: [ + { + Name: "List-Card-R", + Text: "List Card R", + SubText: "Radio", + ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955", + AnswerImageUrl: "side-window-damage-right-all.svg", + }, + ], + listCardCheckBoxHorizontalSubText: [ + { + Name: "List-Card-CBHst", + Text: "List Card CBHst", + SubText: "With Subtext", + ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955", + AnswerImageUrl: "side-window-damage-right-all.svg", + }, + ], + listCardCheckBoxHorizontal: [ + { + Name: "List-Card-CBH", + Text: "List Card CBH", + ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955", + AnswerImageUrl: "side-window-damage-right-all.svg", + }, + ], + listRadioHorizontalSubText: [ + { + Name: "List-Card-RHst", + Text: "List Card RHst", + SubText: "With Subtext", + ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955", + AnswerImageUrl: "side-window-damage-right-all.svg", + }, + ], + listRadioHorizontal: [ + { + Name: "List-Card-RH", + Text: "List Card RH", + ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955", + AnswerImageUrl: "side-window-damage-right-all.svg", + }, + ], + listCardGroup: [ + { + Name: "Side-Window-1", + Text: "Side Window", + SubText: "With Subtext", + ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955", + AnswerImageUrl: "side-window-damage-right-all.svg", + }, + { + Name: "Side-Window-2", + Text: "Side Window", + SubText: "With Subtext that is more than one line", + ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955", + AnswerImageUrl: "side-window-damage-right-all.svg", + }, + { + Name: "Side-Window-3", + Text: "Side Window", + ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955", + AnswerImageUrl: "side-window-damage-right-all.svg", + }, + ], }; }, }; diff --git a/src/layouts/form-test/form-test.vue b/src/layouts/form-test/form-test.vue index 33a7e6a70..d56b764b3 100644 --- a/src/layouts/form-test/form-test.vue +++ b/src/layouts/form-test/form-test.vue @@ -1,119 +1,126 @@ diff --git a/src/layouts/vehicle-damage/vehicle-damage.spec.js b/src/layouts/vehicle-damage/vehicle-damage.spec.js index 02a50023c..81c7c8b7a 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.spec.js +++ b/src/layouts/vehicle-damage/vehicle-damage.spec.js @@ -26,24 +26,32 @@ jest.mock("@/helpers/cms-content-helper", () => ({ jest.mock("@/store", () => ({ getters: { vehicle: { - carId: "C00000000" - } - } + carId: "C00000000", + }, + }, })); describe("vehicle-damage.vue", () => { test("Page header is initailized with api data", async (done) => { - //Arrange const pageHeaderWidgetHeaderText = "Select Damage"; - const { wrapper, apiPromise } = setupMocks({ pageHeaderWidgetHeaderText: pageHeaderWidgetHeaderText }); + const { wrapper, apiPromise } = setupMocks({ + pageHeaderWidgetHeaderText: pageHeaderWidgetHeaderText, + }); //Act - vehicleDamage.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-damage" } }, undefined, (c) => c(wrapper.vm)); + vehicleDamage.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-damage" } }, + undefined, + (c) => c(wrapper.vm) + ); //Assert apiPromise.finally(() => { - expect(funnelSubHeader.methods.initializeComponent).toHaveBeenCalledWith(pageHeaderWidgetHeaderText); + expect(funnelSubHeader.methods.initializeComponent).toHaveBeenCalledWith( + pageHeaderWidgetHeaderText + ); done(); }); }); @@ -51,20 +59,28 @@ describe("vehicle-damage.vue", () => { describe("vehicle-damage.vue", () => { test("Page logo image is initailized with api data", async (done) => { - //Arrange const SiteHeaderWidget = { LogoImage: "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", - } - const { wrapper, apiPromise } = setupMocks({ SiteHeaderWidget: SiteHeaderWidget }); + }; + const { wrapper, apiPromise } = setupMocks({ + SiteHeaderWidget: SiteHeaderWidget, + }); //Act - vehicleDamage.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-damage" } }, undefined, (c) => c(wrapper.vm)); + vehicleDamage.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-damage" } }, + undefined, + (c) => c(wrapper.vm) + ); //Assert apiPromise.finally(() => { - expect(funnelHeader.methods.initializeComponent).toHaveBeenCalledWith(SiteHeaderWidget); + expect(funnelHeader.methods.initializeComponent).toHaveBeenCalledWith( + SiteHeaderWidget + ); done(); }); }); @@ -72,20 +88,28 @@ describe("vehicle-damage.vue", () => { describe("vehicle-damage.vue", () => { test("Vehicle image is initailized with api data", async (done) => { - //Arrange const VehicleBannerWidget = { GenericVehicleImage: "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", - } - const { wrapper, apiPromise } = setupMocks({ VehicleBannerWidget: VehicleBannerWidget }); + }; + const { wrapper, apiPromise } = setupMocks({ + VehicleBannerWidget: VehicleBannerWidget, + }); //Act - vehicleDamage.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-damage" } }, undefined, (c) => c(wrapper.vm)); + vehicleDamage.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-damage" } }, + undefined, + (c) => c(wrapper.vm) + ); //Assert apiPromise.finally(() => { - expect(vehicleBanner.methods.initializeComponent).toHaveBeenCalledWith(VehicleBannerWidget); + expect(vehicleBanner.methods.initializeComponent).toHaveBeenCalledWith( + VehicleBannerWidget + ); done(); }); }); @@ -93,12 +117,16 @@ describe("vehicle-damage.vue", () => { describe("vehicle-damage.vue", () => { test("CarId set, arePagePrerequisitesValid should be true ", async () => { - //Arrange const { wrapper } = setupMocks({}); //Act - vehicleDamage.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-damage" } }, undefined, (c) => c(wrapper.vm)); + vehicleDamage.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-damage" } }, + undefined, + (c) => c(wrapper.vm) + ); let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); await nextTick(); @@ -112,27 +140,26 @@ function setupMocks({ pageHeaderWidgetHeaderText = {}, mountOptionsMockData = {}, }) { - //Mock api responses baseMixin.methods.dispatchNonBlockingStoreAction = jest.fn(); baseMixin.methods.dispatchNonBlockingStoreAction.mockImplementation(() => { - return Promise.resolve({ data: ['Front Window', 'Back Window', 'Side Window'] }); + return Promise.resolve({ + data: ["Front Window", "Back Window", "Side Window"], + }); }); const apiResponses = { cmsContent: { FunnelSubHeaderWidget: pageHeaderWidgetHeaderText, - VehicleBannerWidget: - { + VehicleBannerWidget: { GenericVehicleImage: "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", }, - FunnelHeaderWidget: - { + FunnelHeaderWidget: { LogoImage: "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", }, }, - damageOptions: ['Front Window', 'Back Window', 'Side Window'], + damageOptions: ["Front Window", "Back Window", "Side Window"], }; const apiPromise = Promise.resolve(apiResponses); @@ -157,13 +184,18 @@ function setupMocks({ const wrapper = shallowMount(vehicleDamage, mountOptions); const funnelHeaderWrapper = wrapper.findComponent({ name: "funnelHeader" }); - funnelHeaderWrapper.vm.initializeComponent = funnelHeader.methods.initializeComponent; + funnelHeaderWrapper.vm.initializeComponent = + funnelHeader.methods.initializeComponent; const vehicleBannerWrapper = wrapper.findComponent({ name: "vehicleBanner" }); - vehicleBannerWrapper.vm.initializeComponent = vehicleBanner.methods.initializeComponent; + vehicleBannerWrapper.vm.initializeComponent = + vehicleBanner.methods.initializeComponent; - const funnelSubHeaderWrapper = wrapper.findComponent({ name: "funnelSubHeader" }); - funnelSubHeaderWrapper.vm.initializeComponent = funnelSubHeader.methods.initializeComponent; + const funnelSubHeaderWrapper = wrapper.findComponent({ + name: "funnelSubHeader", + }); + funnelSubHeaderWrapper.vm.initializeComponent = + funnelSubHeader.methods.initializeComponent; return { wrapper, apiPromise }; -} \ No newline at end of file +} diff --git a/src/layouts/vehicle-make/make-question/make-question.spec.js b/src/layouts/vehicle-make/make-question/make-question.spec.js index 6a811459f..469be6d24 100644 --- a/src/layouts/vehicle-make/make-question/make-question.spec.js +++ b/src/layouts/vehicle-make/make-question/make-question.spec.js @@ -2,11 +2,16 @@ import makeQuestion from "@/layouts/vehicle-make/make-question/make-question"; import { shallowMount } from "@vue/test-utils"; import { getMountOptions } from "@/helpers/unit-test-helper.js"; import store from "@/store"; -jest.mock("@/store", () => { return {}; }, {virtual: true}); +jest.mock( + "@/store", + () => { + return {}; + }, + { virtual: true } +); describe("make-question.vue", () => { test("Selected make is emitted upon selection.", async () => { - //Arrange const { wrapper } = setupMocks({ modelValueProp: "honda" }); const makeToSelect = "ford"; @@ -16,51 +21,65 @@ describe("make-question.vue", () => { await wrapper.vm.$nextTick(); //Assert - expect(wrapper.emitted()["update:modelValue"][0]).toEqual([{selectedMake: "ford"}]); + expect(wrapper.emitted()["update:modelValue"][0]).toEqual([ + { selectedMake: "ford" }, + ]); }); }); describe("make-question.vue", () => { test("CMS question text is used as radio question text.", async () => { - //Arrange - const { wrapper, cmsContent } = setupMocks({ cmsQuestionText: "What make is your vehicle?" }); + const { wrapper, cmsContent } = setupMocks({ + cmsQuestionText: "What make is your vehicle?", + }); //Act makeQuestion.methods.initializeComponent.call(wrapper.vm, cmsContent, null); //Assert - const buttonQuestionComponent = await wrapper.findComponent({ name: "buttonQuestion" }); - expect(buttonQuestionComponent.attributes("questiontext")).toBe("What make is your vehicle?"); + const buttonQuestionComponent = await wrapper.findComponent({ + name: "buttonQuestion", + }); + expect(buttonQuestionComponent.attributes("questiontext")).toBe( + "What make is your vehicle?" + ); }); }); describe("make-question.vue", () => { test("Data from store api are used as radio question answers.", async () => { - //Arrange - const { wrapper, cmsContent } = setupMocks({ dataFromStoreApi: ["honda", "ford", "dodge"] }); + const { wrapper, cmsContent } = setupMocks({ + dataFromStoreApi: ["honda", "ford", "dodge"], + }); //Act const initialData = makeQuestion.methods.loadInitialData.call(wrapper.vm); - makeQuestion.methods.initializeComponent.call(wrapper.vm, cmsContent, initialData); + makeQuestion.methods.initializeComponent.call( + wrapper.vm, + cmsContent, + initialData + ); //Assert - const buttonQuestionComponent = await wrapper.findComponent({ name: "buttonQuestion" }); - expect(buttonQuestionComponent.attributes("answers")).toBe("honda,ford,dodge"); + const buttonQuestionComponent = await wrapper.findComponent({ + name: "buttonQuestion", + }); + expect(buttonQuestionComponent.attributes("answers")).toBe( + "honda,ford,dodge" + ); }); }); - function setupMocks({ modelValueProp = "1900", cmsQuestionText = "CMS text goes here", dataFromStoreApi = [], }) { - //Mock store store.dispatch = jest.fn(() => dataFromStoreApi); - store.getters = { vehicle: {year: 2019} }; + store.getters = { vehicle: { year: 2019 } }; const mountOptions = getMountOptions({ store: { dispatch: store.dispatch, @@ -76,7 +95,7 @@ function setupMocks({ //Mock CMS content const cmsContent = { - QuestionText: cmsQuestionText - }; + QuestionText: cmsQuestionText, + }; return { wrapper, cmsContent }; -} \ No newline at end of file +} diff --git a/src/layouts/vehicle-make/make-question/make-question.vue b/src/layouts/vehicle-make/make-question/make-question.vue index 0276f1a67..2a94deafe 100644 --- a/src/layouts/vehicle-make/make-question/make-question.vue +++ b/src/layouts/vehicle-make/make-question/make-question.vue @@ -1,5 +1,6 @@