diff --git a/package-lock.json b/package-lock.json
index f7197f64..7ff32a19 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2548,6 +2548,29 @@
"webpack-merge": "^5.7.3",
"webpack-virtual-modules": "^0.4.2",
"whatwg-fetch": "^3.6.2"
+ },
+ "dependencies": {
+ "@vue/vue-loader-v15": {
+ "version": "npm:vue-loader@15.10.0",
+ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.0.tgz",
+ "integrity": "sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg==",
+ "dev": true,
+ "requires": {
+ "@vue/component-compiler-utils": "^3.1.0",
+ "hash-sum": "^1.0.2",
+ "loader-utils": "^1.1.0",
+ "vue-hot-reload-api": "^2.3.0",
+ "vue-style-loader": "^4.1.0"
+ },
+ "dependencies": {
+ "hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+ "dev": true
+ }
+ }
+ }
}
},
"@vue/cli-shared-utils": {
@@ -2797,27 +2820,6 @@
"integrity": "sha512-E2P4oXSaWDqTZNbmKZFVLrNN/siVN78YkEqs7pHryWerrlZR9bBFLWdJwRoguX45Ru6HxIflzKl4vQvwRMwm5g==",
"dev": true
},
- "@vue/vue-loader-v15": {
- "version": "npm:vue-loader@15.10.0",
- "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.0.tgz",
- "integrity": "sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg==",
- "dev": true,
- "requires": {
- "@vue/component-compiler-utils": "^3.1.0",
- "hash-sum": "^1.0.2",
- "loader-utils": "^1.1.0",
- "vue-hot-reload-api": "^2.3.0",
- "vue-style-loader": "^4.1.0"
- },
- "dependencies": {
- "hash-sum": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
- "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
- "dev": true
- }
- }
- },
"@vue/vue3-jest": {
"version": "27.0.0",
"resolved": "https://registry.npmjs.org/@vue/vue3-jest/-/vue3-jest-27.0.0.tgz",
diff --git a/public/index.html b/public/index.html
index 5f556395..97071c00 100644
--- a/public/index.html
+++ b/public/index.html
@@ -3,12 +3,16 @@
-
+
+
+
+
+
+
<%= htmlWebpackPlugin.options.title %>
diff --git a/src/common-components/button-question/button-question.vue b/src/common-components/button-question/button-question.vue
index 10337778..4734ed12 100644
--- a/src/common-components/button-question/button-question.vue
+++ b/src/common-components/button-question/button-question.vue
@@ -225,7 +225,7 @@
margin-top: 1.5rem;
margin-bottom: 1rem;
font-size: 1rem;
- line-height: 1.625rem;
+ line-height: 1.5rem;
& > span {
text-align: center;
diff --git a/src/common-components/site-sub-header/button-back/button-back.spec.js b/src/common-components/site-sub-header/button-back/button-back.spec.js
new file mode 100644
index 00000000..c7bff87f
--- /dev/null
+++ b/src/common-components/site-sub-header/button-back/button-back.spec.js
@@ -0,0 +1,21 @@
+import { shallowMount } from "@vue/test-utils";
+import buttonBack from "./button-back";
+
+describe("back button", () => {
+ test("renders a button", () => {
+ // Arrange
+ const myFunction = () => {};
+
+ // Act
+ const wrapper = shallowMount(buttonBack, {
+ propsData: {
+ backButtonAction: myFunction,
+ backButtonAccessibleText: "something",
+ },
+ });
+
+ // Assert
+ expect(wrapper.find("button").exists()).toBe(true);
+ wrapper.unmount();
+ });
+});
diff --git a/src/common-components/site-sub-header/button-back/button-back.vue b/src/common-components/site-sub-header/button-back/button-back.vue
new file mode 100644
index 00000000..cf3a630b
--- /dev/null
+++ b/src/common-components/site-sub-header/button-back/button-back.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/common-components/site-sub-header/site-sub-header.vue b/src/common-components/site-sub-header/site-sub-header.vue
index 22064035..c394d214 100644
--- a/src/common-components/site-sub-header/site-sub-header.vue
+++ b/src/common-components/site-sub-header/site-sub-header.vue
@@ -5,23 +5,39 @@
{{ content }}
+
diff --git a/src/common-components/vehicle-banner/vehicle-banner.vue b/src/common-components/vehicle-banner/vehicle-banner.vue
index 534313df..9fffd974 100644
--- a/src/common-components/vehicle-banner/vehicle-banner.vue
+++ b/src/common-components/vehicle-banner/vehicle-banner.vue
@@ -9,7 +9,7 @@
+
\ 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 66012402..72d3a604 100644
--- a/src/layouts/vehicle-make/vehicle-make.spec.js
+++ b/src/layouts/vehicle-make/vehicle-make.spec.js
@@ -1 +1,140 @@
-test.todo("some test to be written in the future");
\ No newline at end of file
+// Supporting Files
+import { shallowMount } from "@vue/test-utils";
+import { settleAllPromises } from "@/helpers/layout-helper.js";
+import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
+import baseMixin from "@/mixins/base-mixin.js";
+import { getMountOptions } from "@/helpers/unit-test-helper.js";
+import { nextTick } from "vue";
+import { useMainStore } from "@/store";
+
+// Components
+import vehicleMake from "@/layouts/vehicle-make/vehicle-make.vue";
+import makeQuestion from "@/layouts/vehicle-make/make-question/make-question";
+
+// 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 () => {
+ //Arrange
+ const makeQuestionInitialData = ["honda", "ford", "dodge"];
+ const { wrapper, apiPromise } = setupMocks({
+ makeQuestionInitialData: makeQuestionInitialData,
+ });
+
+ //Act
+ vehicleMake.beforeRouteEnter.call(
+ wrapper.vm,
+ { query: { issPage: "vehicle-make" } },
+ undefined,
+ (c) => c(wrapper.vm)
+ );
+
+ //Assert
+ apiPromise.finally(() => {
+ expect(makeQuestion.methods.initializeComponent).toHaveBeenCalledWith(
+ makeQuestionInitialData
+ );
+ });
+ });
+
+ test("BackButtonAction triggers a router.navigate change", async () => {
+ //Arrange
+ const { wrapper, apiPromise } = setupMocks({
+ pageHeaderWidgetHeaderText: "Select a make to get started",
+ mountOptionsMockData: {
+ router: {
+ navigate: jest.fn(),
+ },
+ },
+ });
+
+ //Act
+ vehicleMake.beforeRouteEnter.call(
+ wrapper.vm,
+ { query: { issPage: "vehicle-make" } },
+ undefined,
+ (c) => c(wrapper.vm)
+ );
+ wrapper.vm.backButtonAction();
+ await nextTick();
+
+ //Assert
+ apiPromise.finally(() => {
+ expect(wrapper.vm.$router.navigate).toHaveBeenCalled();
+ });
+ });
+
+ test("Year set, arePagePrerequisitesValid should be true ", async () => {
+ //Arrange
+ const { wrapper } = setupMocks({});
+ useMainStore().order.vehicle.year = 2001;
+
+ //Act
+ vehicleMake.beforeRouteEnter.call(
+ wrapper.vm,
+ { query: { issPage: "vehicle-make" } },
+ undefined,
+ (c) => c(wrapper.vm)
+ );
+
+ let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid();
+
+ //Assert
+ expect(arePagePrerequisitesValid).toBe(true);
+ });
+
+});
+
+function setupMocks({
+ vehicleMakeQuestionCmsContent = {},
+ makeQuestionInitialData = {},
+ pageHeaderWidgetHeaderText = {},
+ mountOptionsMockData = {},
+}) {
+ //Mock api responses
+ const apiResponses = {
+ cmsContent: {
+ SiteSubHeaderWidget: pageHeaderWidgetHeaderText,
+ VehicleMakeQuestion: vehicleMakeQuestionCmsContent,
+ 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",
+ },
+ },
+ makeQuestionInitialData: makeQuestionInitialData,
+ };
+
+ const apiPromise = Promise.resolve(apiResponses);
+
+ settleAllPromises.mockImplementation(() => apiPromise);
+ fetchCmsContentForPage.mockImplementation(() => Promise.resolve());
+
+ //Mock make question methods
+ makeQuestion.methods = {
+ loadInitialData: jest.fn(),
+ initializeComponent: jest.fn(),
+ };
+
+ const mountOptions = getMountOptions(mountOptionsMockData);
+ const wrapper = shallowMount(vehicleMake, mountOptions);
+
+ const makeQuestionWrapper = wrapper.findComponent({ name: "makeQuestion" });
+ makeQuestionWrapper.vm.initializeComponent =
+ makeQuestion.methods.initializeComponent;
+ wrapper.vm.setCmsContent = baseMixin.methods.setCmsContent;
+
+ return { wrapper, apiPromise };
+}
diff --git a/src/layouts/vehicle-make/vehicle-make.vue b/src/layouts/vehicle-make/vehicle-make.vue
index b886840f..f074ecbc 100644
--- a/src/layouts/vehicle-make/vehicle-make.vue
+++ b/src/layouts/vehicle-make/vehicle-make.vue
@@ -1,28 +1,102 @@
-
-
-
Vehicle Make Placeholder
-
{{returnVehicleYear}}
-
Add
+
\ No newline at end of file
diff --git a/src/layouts/vehicle-year/vehicle-year.vue b/src/layouts/vehicle-year/vehicle-year.vue
index 676c1e33..96fa0804 100644
--- a/src/layouts/vehicle-year/vehicle-year.vue
+++ b/src/layouts/vehicle-year/vehicle-year.vue
@@ -3,7 +3,7 @@