diff --git a/jest.config.js b/jest.config.js index cc95af335..e36f1a70d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -11,7 +11,7 @@ module.exports = { "!src/constants/*.js", "!src/router/**/*.js", "!src/helpers/unit-test-helper.js", - "!src/layouts/component-test/component-test.vue" + "!src/layouts/component-test/component-test.vue", ], //! means exclude from coverage. testMatch: ["**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)"], coverageThreshold: { diff --git a/src/common-components/radio-question/radio-question.spec.js b/src/common-components/radio-question/radio-question.spec.js index 17b6ff311..de6458122 100644 --- a/src/common-components/radio-question/radio-question.spec.js +++ b/src/common-components/radio-question/radio-question.spec.js @@ -4,11 +4,11 @@ import radioQuestion from "@/common-components/radio-question/radio-question"; describe("radioQuestion.vue", () => { it("Should render the 'questionText' prop value as a span value for the radio question and the 'answer' values should render as text values for radio components.", async () => { // Act - const wrapper = shallowMount(radioQuestion) + const wrapper = shallowMount(radioQuestion); await wrapper.setProps({ questionText: "Question Text", answers: ["2023", "2022", "2021"], - modelValue: "2020" + modelValue: "2020", }); wrapper.vm.chooseAnswer("2021"); diff --git a/src/common-components/radio-question/radio-question.vue b/src/common-components/radio-question/radio-question.vue index 8e44d965c..2c088fcc7 100644 --- a/src/common-components/radio-question/radio-question.vue +++ b/src/common-components/radio-question/radio-question.vue @@ -6,19 +6,32 @@ }}
-
+

*

- +
@@ -31,12 +44,12 @@ export default { props: { questionText: String, answers: Array, - modelValue: String + modelValue: String, }, methods: { chooseAnswer(answer) { - this.$emit('update:modelValue', answer); - } + this.$emit("update:modelValue", answer); + }, }, components: { radio, diff --git a/src/common-components/site-header/site-header.spec.js b/src/common-components/site-header/site-header.spec.js index f6d442931..2a471fe26 100644 --- a/src/common-components/site-header/site-header.spec.js +++ b/src/common-components/site-header/site-header.spec.js @@ -1,21 +1,19 @@ -import { shallowMount } from '@vue/test-utils'; -import siteHeader from './site-header'; +import { shallowMount } from "@vue/test-utils"; +import siteHeader from "./site-header"; -describe('siteHeader', () => { +describe("siteHeader", () => { + test("renders the logo image", () => { + // Arrange - test('renders the logo image', () => { - // Arrange - - // Act - const wrapper = shallowMount(siteHeader, { - propsData: { - imageSrc: "image_url", - }, - }); - - // Assert - expect(wrapper.find('img')).toBeTruthy(); - wrapper.unmount(); + // Act + const wrapper = shallowMount(siteHeader, { + propsData: { + imageSrc: "image_url", + }, }); + // Assert + expect(wrapper.find("img")).toBeTruthy(); + wrapper.unmount(); + }); }); diff --git a/src/common-components/site-header/site-header.vue b/src/common-components/site-header/site-header.vue index 1d09726e9..441b188c4 100644 --- a/src/common-components/site-header/site-header.vue +++ b/src/common-components/site-header/site-header.vue @@ -1,10 +1,9 @@ @@ -14,17 +13,17 @@ export default { props: { imageSrc: { type: String, - required: true - } + required: true, + }, }, -} +}; \ No newline at end of file +.funnel-header { + height: 56px; +} +.logo-image { + max-width: 78px; +} + diff --git a/src/common-components/vehicle-banner/vehicle-banner.spec.js b/src/common-components/vehicle-banner/vehicle-banner.spec.js index aab2aa3e0..98bf90a5a 100644 --- a/src/common-components/vehicle-banner/vehicle-banner.spec.js +++ b/src/common-components/vehicle-banner/vehicle-banner.spec.js @@ -1,21 +1,19 @@ -import { shallowMount } from '@vue/test-utils'; -import vehicleBanner from './vehicle-banner'; +import { shallowMount } from "@vue/test-utils"; +import vehicleBanner from "./vehicle-banner"; -describe('vehicleBanner', () => { +describe("vehicleBanner", () => { + test("renders the blurrycar image", () => { + // Arrange - test('renders the blurrycar image', () => { - // Arrange - - // Act - const wrapper = shallowMount(vehicleBanner, { - propsData: { - vehicleImageSrc: "image_url", - }, - }); - - // Assert - expect(wrapper.find('img').attributes('class')).toContain('blurrycar'); - wrapper.unmount(); + // Act + const wrapper = shallowMount(vehicleBanner, { + propsData: { + vehicleImageSrc: "image_url", + }, }); + // Assert + expect(wrapper.find("img").attributes("class")).toContain("blurrycar"); + wrapper.unmount(); + }); }); diff --git a/src/common-components/vehicle-banner/vehicle-banner.vue b/src/common-components/vehicle-banner/vehicle-banner.vue index f259390ee..32caa82f8 100644 --- a/src/common-components/vehicle-banner/vehicle-banner.vue +++ b/src/common-components/vehicle-banner/vehicle-banner.vue @@ -14,14 +14,14 @@ export default { props: { vehicleImageSrc: { type: String, - required: true - } + required: true, + }, }, -} +}; \ No newline at end of file +.vehicle-image { + max-width: 290px; +} + diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index 6ade6cd1d..d9292b5f8 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -1,5 +1,5 @@ const storeMutations = { - UPDATE_YEAR: "updateYear", -} + UPDATE_YEAR: "updateYear", +}; -export { storeMutations }; \ No newline at end of file +export { storeMutations }; diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index e5826c81d..e0a12d8fe 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -3,27 +3,23 @@ import { widgetNames } from "@/constants/widget-names.js"; import store from "@/store"; export function fetchCmsContentForPage(fmgPage) { - return store.dispatch(storeActions.GET_PAGE_DATA, { pageName: fmgPage }).then((response) => { - const pageDataFromCms = { - isCmsContentReady: false - }; + return store + .dispatch(storeActions.GET_PAGE_DATA, { pageName: fmgPage }) + .then((response) => { + const pageDataFromCms = {}; - response.data.Result.forEach((widget) => { - if (Object.values(widgetNames).includes(widget.Type)) { - // If we already have this widget, push it on the collection - if (widget.Type in pageDataFromCms) { - pageDataFromCms[widget.Type].push(widget.Model); - return; - } + response.data.Result.forEach((widget) => { + if (Object.values(widgetNames).includes(widget.Type)) { + // If we already have this widget, push it on the collection + if (widget.Type in pageDataFromCms) { + pageDataFromCms[widget.Type].push(widget.Model); + return; + } - pageDataFromCms[widget.Type] = [widget.Model]; - } - }); + pageDataFromCms[widget.Type] = [widget.Model]; + } + }); - // Our 'Page' is ready because we have data now - pageDataFromCms.isCmsContentReady = true; - - return pageDataFromCms; + return pageDataFromCms; }); } - diff --git a/src/helpers/cms-helper.spec.js b/src/helpers/cms-helper.spec.js index bb0edafcb..e9bd66653 100644 --- a/src/helpers/cms-helper.spec.js +++ b/src/helpers/cms-helper.spec.js @@ -2,52 +2,51 @@ import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { dispatch } from "@/store"; jest.mock("@/store", () => ({ - dispatch: jest.fn() + dispatch: jest.fn(), })); it("cms-content-helper: Should return data from CMS", () => { + // Arrange + const cmsMockData = { + Result: [ + { + Type: "VehicleBannerWidget", + Model: { + ImageId: "28452dcb-7762-4cc9-ab09-7643d0b89203", + GenericVehicleImage: + "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", + GenericVehicleImageFilePath: + "images/default-source/default-album/blurred-image.jpg", + }, + }, + { + Type: "PageHeaderWidget", + Model: { + HeaderText: "Select a year to get started", + }, + }, + { + Type: "PageHeaderWidget", + Model: { + HeaderText: "Select a model", + }, + }, + { + Type: "RadioQuestionWidget", + Model: { + QuestionText: "What year is your vehicle?", + }, + }, + ], + }; - // Arrange - const cmsMockData = { - Result: [ - { - Type: "VehicleBannerWidget", - Model: { - ImageId: "28452dcb-7762-4cc9-ab09-7643d0b89203", - GenericVehicleImage: "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3", - GenericVehicleImageFilePath: "images/default-source/default-album/blurred-image.jpg" - } - }, - { - Type: "PageHeaderWidget", - Model: { - "HeaderText": "Select a year to get started" - } - }, - { - Type: "PageHeaderWidget", - Model: { - "HeaderText": "Select a model" - } - }, - { - Type: "RadioQuestionWidget", - Model: { - "QuestionText": "What year is your vehicle?" - } - } - ] - } - - dispatch.mockImplementation(() => Promise.resolve({ data: cmsMockData })); - - // Act - fetchCmsContentForPage('testPage').then((response) => { - - // Assert - expect(response.isCmsContentReady).toBe(true); - expect(response.PageHeaderWidget[0].HeaderText).toEqual('Select a year to get started'); - }); + dispatch.mockImplementation(() => Promise.resolve({ data: cmsMockData })); + // Act + fetchCmsContentForPage("testPage").then((response) => { + // Assert + expect(response.PageHeaderWidget[0].HeaderText).toEqual( + "Select a year to get started" + ); + }); }); - diff --git a/src/helpers/layout-helper.js b/src/helpers/layout-helper.js index d62d4d59f..10f331faf 100644 --- a/src/helpers/layout-helper.js +++ b/src/helpers/layout-helper.js @@ -1,29 +1,27 @@ export function settleAllPromises(promiseResultMap) { + // Pull our keys out of the promise 'table' + const promiseNames = Object.entries(promiseResultMap); - // Pull our keys out of the promise 'table' - const promiseNames = Object.entries(promiseResultMap); + return Promise.allSettled( + promiseNames.map((e) => e[1]).map((n) => n.promise) + ).then((results) => { + const resultMap = {}; - return Promise.allSettled(promiseNames.map(e => e[1]).map(n => n.promise)) - .then(results => { + // Build a map of the results + for (let i = 0; i < results.length; ++i) { + const promiseName = promiseNames[i][1].resultKey; - const resultMap = {}; + // Some Promises like the cms content call don't have a 'data' field + // when returned, so other promises do. Map the results to the object + // so that the object is the return data. - // Build a map of the results - for (let i = 0; i < results.length; ++i) { - - const promiseName = promiseNames[i][1].resultKey; - - // Some Promises like the cms content call don't have a 'data' field - // when returned, so other promises do. Map the results to the object - // so that the object is the return data. + if (results[i].value.data === undefined) { + resultMap[promiseName] = results[i].value; + } else { + resultMap[promiseName] = results[i].value.data; + } + } - if (results[i].value.data === undefined) { - resultMap[promiseName] = results[i].value - } else { - resultMap[promiseName] = results[i].value.data; - } - } - - return resultMap; - }); -} \ No newline at end of file + return resultMap; + }); +} diff --git a/src/helpers/layout-helper.spec.js b/src/helpers/layout-helper.spec.js index f85667f64..d71810756 100644 --- a/src/helpers/layout-helper.spec.js +++ b/src/helpers/layout-helper.spec.js @@ -1,28 +1,25 @@ import { settleAllPromises } from "@/helpers/layout-helper"; it("layout-helper: Should settle all promises and return mapped promise results", () => { + // Arrange + const mockPromiseOne = Promise.resolve({ data: "test-data" }); + const mockPromiseTwo = Promise.resolve({ data: "test-data-two" }); - // Arrange - const mockPromiseOne = Promise.resolve({ data: "test-data" }); - const mockPromiseTwo = Promise.resolve({ data: "test-data-two" }); + const promiseResultMap = [ + { + resultKey: "MockResultOne", + promise: mockPromiseOne, + }, + { + resultKey: "MockResultTwo", + promise: mockPromiseTwo, + }, + ]; - const promiseResultMap = [ - { - resultKey: "MockResultOne", - promise: mockPromiseOne, - }, - { - resultKey: "MockResultTwo", - promise: mockPromiseTwo, - }, - ]; - - // Act - settleAllPromises(promiseResultMap).then(results => { - - // Assert - expect(results.MockResultOne).toEqual('test-data'); - expect(results.MockResultTwo).toEqual('test-data-two'); - }); - -}) \ No newline at end of file + // Act + settleAllPromises(promiseResultMap).then((results) => { + // Assert + expect(results.MockResultOne).toEqual("test-data"); + expect(results.MockResultTwo).toEqual("test-data-two"); + }); +}); diff --git a/src/layouts/component-test/component-test.vue b/src/layouts/component-test/component-test.vue index 61614606a..8396ddd0a 100644 --- a/src/layouts/component-test/component-test.vue +++ b/src/layouts/component-test/component-test.vue @@ -2,245 +2,265 @@
-

Radio Card

+

Radio Card

-

Buttons

+

Buttons

- +
-

List Button

+

List Button

-

Radio - Single-Line

+

Radio - Single-Line

-
+
-

Select Vehicle Year

+

+ Select Vehicle Year +

-

Radio - Multi-Line

+

Radio - Multi-Line

-
+
-

Select Vehicle Year

+

+ Select Vehicle Year +

-

Radio - Multi-Line Centered

+

Radio - Multi-Line Centered

-
+
-

Multi-Line Centered

+

+ Multi-Line Centered +

-

Radio Horizontal

+

Radio Horizontal

-
+
-

Select Vehicle Year

+

+ Select Vehicle Year +

-

Text Link

+

Text Link

@@ -250,19 +270,23 @@
-

Typogrophy

+

Typogrophy

This is default body copy font size/weight

-

This is small body copy using .small class

-

This is also small using <small> tag

+

+ This is small body copy using .small class +

+

+ This is also small using <small> tag +

-

Headings

+

Headings

@@ -297,119 +321,123 @@
-

Alerts

+

Alerts

-
-
-
-
-
+
+
+
+
+
-

Site Header

+

Site Header

- +
-

Vehicle Banner

+

Vehicle Banner

- +
diff --git a/src/layouts/loader-demo/loader-demo.vue b/src/layouts/loader-demo/loader-demo.vue index 4c19c4d21..0407f4fd4 100644 --- a/src/layouts/loader-demo/loader-demo.vue +++ b/src/layouts/loader-demo/loader-demo.vue @@ -7,11 +7,7 @@
- +
@@ -22,7 +18,7 @@ import loader from "@/ux-components/loader/loader"; export default { name: "App", components: { - loader - } + loader, + }, }; diff --git a/src/layouts/vehicle-year/vehicle-year.spec.js b/src/layouts/vehicle-year/vehicle-year.spec.js index 8190957e7..06cc0339b 100644 --- a/src/layouts/vehicle-year/vehicle-year.spec.js +++ b/src/layouts/vehicle-year/vehicle-year.spec.js @@ -2,16 +2,15 @@ import { shallowMount, flushPromises } from "@vue/test-utils"; import { getMountOptions } from "@/helpers/unit-test-helper.js"; import vehicleYear from "@/layouts/vehicle-year/vehicle-year.vue"; import { settleAllPromises } from "@/helpers/layout-helper.js"; -import { nextTick } from 'vue' +import { nextTick } from "vue"; // Mock our module for promises. -jest.mock("@/helpers/layout-helper.js", () => ({ - settleAllPromises: jest.fn() +jest.mock("@/helpers/layout-helper.js", () => ({ + settleAllPromises: jest.fn(), })); describe("vehicle-year.vue", () => { test("vehicle-year.vue should render data from CMS", async () => { - // Arrange // Our mock data for our call to settleAllPromises @@ -19,31 +18,43 @@ describe("vehicle-year.vue", () => { getPageContent: { PageHeaderWidget: [{ HeaderText: "Select a year to get started" }], RadioQuestionWidget: [{ QuestionText: "What year is your vehicle?" }], - VehicleBannerWidget: [{ GenericVehicleImage: "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3" }], - SiteHeaderWidget: [{ "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", + }, + ], + SiteHeaderWidget: [ + { + LogoImage: + "https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/safelite-logo.svg?sfvrsn=45e7ed06_3", + }, + ], isCmsContentReady: true, }, getVehicleYear: [2023, 2022, 2021], store: { commit: jest.fn(), - year: null + year: null, }, router: { - push: jest.fn() - } - } + push: jest.fn(), + }, + }; // our router information needed. const to = { query: { - fmgPage: 'vehicle-year' - } + fmgPage: "vehicle-year", + }, }; const mountOptions = getMountOptions(mockData); // our mock implementation of settleAllPromises - settleAllPromises.mockImplementation(() => { return Promise.resolve(mockData);}); + settleAllPromises.mockImplementation(() => { + return Promise.resolve(mockData); + }); // Act const wrapper = shallowMount(vehicleYear, mountOptions); @@ -52,7 +63,9 @@ describe("vehicle-year.vue", () => { // Call our beforeRouteEnter on the component. // This passes (c) => c(wrapper.vm) so that next can be called and our // data can be set. - vehicleYear.beforeRouteEnter.call(wrapper.vm, to, undefined, (c) => c(wrapper.vm)); + vehicleYear.beforeRouteEnter.call(wrapper.vm, to, undefined, (c) => + c(wrapper.vm) + ); await nextTick(); // Wait for the DOM to update. @@ -60,7 +73,9 @@ describe("vehicle-year.vue", () => { const header = await wrapper.find(".Header"); expect(header.attributes("text")).toEqual("Select a year to get started"); - const yearQuestion = wrapper.findComponent({ name: 'year-question' }); - expect(yearQuestion.attributes("questiontext")).toEqual("What year is your vehicle?"); + const yearQuestion = wrapper.findComponent({ name: "year-question" }); + expect(yearQuestion.attributes("questiontext")).toEqual( + "What year is your vehicle?" + ); }); }); diff --git a/src/layouts/vehicle-year/vehicle-year.vue b/src/layouts/vehicle-year/vehicle-year.vue index 4da235fcc..6a4c6c169 100644 --- a/src/layouts/vehicle-year/vehicle-year.vue +++ b/src/layouts/vehicle-year/vehicle-year.vue @@ -1,10 +1,16 @@ - @@ -24,7 +24,7 @@ export default { isDisabled: Boolean, loaderColor: String, loaderPosition: String, - sizeInRem: [Number,String] + sizeInRem: [Number, String], }, data() { return { diff --git a/src/ux-components/header/header.vue b/src/ux-components/header/header.vue index 0749c0462..95e1e89a6 100644 --- a/src/ux-components/header/header.vue +++ b/src/ux-components/header/header.vue @@ -1,7 +1,9 @@ diff --git a/src/ux-components/list-button/list-button.vue b/src/ux-components/list-button/list-button.vue index 303ccdf2a..52997d5d6 100644 --- a/src/ux-components/list-button/list-button.vue +++ b/src/ux-components/list-button/list-button.vue @@ -1,21 +1,27 @@