diff --git a/README.md b/README.md index 65e8bfb95..535976602 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,8 @@ This Repository is for Fix My Glass front end Vue and documentation associated w #### Routing We are using [Vue Router](https://next.router.vuejs.org/) 4.x for our front end routing. We are using a runtime dynamic routing solution. Some more information about dynamic routing can be found on the [official Vue Router documentation](https://next.router.vuejs.org/guide/advanced/dynamic-routing.html). -Here is a high level overview of how our routing works: -![FixMyGlass - Routing](https://user-images.githubusercontent.com/44780237/139876801-7d5c495a-f361-4234-a8ec-69126a357f80.png) - -`RetainStructureAndGoTo404(to, next)` - Since our 404 path on our router is `path: '/:pathMatch(.*)*'` (meaning that we don't have a dedicated 404 route) we retain the information entered by the user in the url bar and just serve back our `NotFound` component on Vue. For example if a user was to type in `.../fmg/fmgPage=junkPage` Vue will retain this url in the browser and return our `NotFound` component. This could be especially useful for analytics and reporting. - `Next()` - Is a function that is native to Vue Router in which we call in order to send the user where want them to go based on some logic we have[. You can read more about Navigation Guards and the `Next()` function on the Vue Router documentation. ](https://next.router.vuejs.org/guide/advanced/navigation-guards.html) -`GetRouteInfoFromPageName(PageName)` - This method typically takes the query string value of `fmgPage` and passes it into a call to our Content Service. The service will pull information on the page; matching page name passed to page name in our Cms. If we have a match, we will compile the route information and send it to our router to process. If we do not have a that page in our Cms, the user will be served back a 404 page while retaining the structure. \ No newline at end of file +`GetRouteInfoFromPageName(PageName)` - This method typically takes the query string value of `fmgPage` and passes it into a call to our Content Service. The service will pull information on the page; matching page name passed to page name in our Cms. If we have a match, we will compile the route information and send it to our router to process. If we do not have a that page in our Cms, the user will be served back a 404 page while retaining the structure. + +`GoToFunnelStartOn404(next)` - When a user tries to go to a page that doesn't exist in the CMS, they will be put back to the 'Start' of the funnel which is whatever page is marked as the homepage on Sitefinity. \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 8b510e95c..36c4507fc 100644 --- a/jest.config.js +++ b/jest.config.js @@ -12,12 +12,13 @@ module.exports = { "!src/router/**/*.js", "!src/helpers/unit-test-helper.js", "!src/layouts/component-test/component-test.vue", - "!src/layouts/address-poc/address-poc.vue" + "!src/layouts/form-test/form-test.vue", + "!src/layouts/address-poc/address-poc.vue", ], //! means exclude from coverage. testMatch: ["**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)"], coverageThreshold: { global: { - statements: 85, + statements: 89, }, }, }; diff --git a/package-lock.json b/package-lock.json index f0cf0ac10..bfc6c1f68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,11 +15,13 @@ "core-js": "^3.6.5", "http-status-codes": "^2.1.4", "jest-junit": "^13.0.0", + "vee-validate": "^4.5.7", "vue": "^3.0.0", "vue-plugin-load-script": "^2.1.0", "vue-router": "^4.0.11", "vuex": "^4.0.2", - "vuex-persistedstate": "^4.1.0" + "vuex-persistedstate": "^4.1.0", + "yup": "^0.32.11" }, "devDependencies": { "@vue/cli-plugin-babel": "~4.5.0", @@ -1632,7 +1634,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -4166,6 +4167,11 @@ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -16453,8 +16459,12 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -16974,6 +16984,11 @@ "dev": true, "optional": true }, + "node_modules/nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, "node_modules/nanoid": { "version": "3.1.30", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", @@ -18974,6 +18989,11 @@ "node": ">= 6" } }, + "node_modules/property-expr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -19352,8 +19372,7 @@ "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/regenerator-transform": { "version": "0.14.5", @@ -22340,6 +22359,17 @@ "node": ">= 0.8" } }, + "node_modules/vee-validate": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.5.7.tgz", + "integrity": "sha512-EcpvOikBP5LlRIKwULfwRDeyIaERuOJztZUPWRmSIeWpeQWD6hs9qQ8A3CmVVteqEohbUM07gV/ea8lPXCfCJQ==", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.15" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vendors": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", @@ -24319,6 +24349,28 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true + }, + "node_modules/yup": { + "version": "0.32.11", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", + "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/lodash": "^4.14.175", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yup/node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" } }, "dependencies": { @@ -25421,7 +25473,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -27496,6 +27547,11 @@ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "@types/lodash": { + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==" + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -37445,8 +37501,12 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash.debounce": { "version": "4.0.8", @@ -37888,6 +37948,11 @@ "dev": true, "optional": true }, + "nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, "nanoid": { "version": "3.1.30", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", @@ -39538,6 +39603,11 @@ "sisteransi": "^1.0.5" } }, + "property-expr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -39856,8 +39926,7 @@ "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.14.5", @@ -42300,6 +42369,14 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "vee-validate": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.5.7.tgz", + "integrity": "sha512-EcpvOikBP5LlRIKwULfwRDeyIaERuOJztZUPWRmSIeWpeQWD6hs9qQ8A3CmVVteqEohbUM07gV/ea8lPXCfCJQ==", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.15" + } + }, "vendors": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", @@ -43914,6 +43991,27 @@ "dev": true } } + }, + "yup": { + "version": "0.32.11", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", + "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/lodash": "^4.14.175", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + }, + "dependencies": { + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + } + } } } } diff --git a/package.json b/package.json index 6033a0009..82561e1ca 100644 --- a/package.json +++ b/package.json @@ -16,11 +16,13 @@ "core-js": "^3.6.5", "http-status-codes": "^2.1.4", "jest-junit": "^13.0.0", + "vee-validate": "^4.5.7", "vue": "^3.0.0", "vue-plugin-load-script": "^2.1.0", "vue-router": "^4.0.11", "vuex": "^4.0.2", - "vuex-persistedstate": "^4.1.0" + "vuex-persistedstate": "^4.1.0", + "yup": "^0.32.11" }, "devDependencies": { "@vue/cli-plugin-babel": "~4.5.0", @@ -47,8 +49,7 @@ }, "extends": [ "plugin:vue/vue3-essential", - "eslint:recommended", - "@vue/prettier" + "eslint:recommended" ], "parserOptions": { "parser": "babel-eslint" diff --git a/public/index.html b/public/index.html index 9047c9643..b926ca739 100644 --- a/public/index.html +++ b/public/index.html @@ -1,5 +1,5 @@ - + @@ -7,7 +7,7 @@ - + <%= htmlWebpackPlugin.options.title %> diff --git a/src/App.vue b/src/App.vue index a44ab87b7..76a01d29c 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,3 +1,10 @@ + + diff --git a/src/assets/img/icons/back-glass-damage.svg b/src/assets/img/icons/back-glass-damage.svg index 59379e6de..d01d0cfac 100644 --- a/src/assets/img/icons/back-glass-damage.svg +++ b/src/assets/img/icons/back-glass-damage.svg @@ -1,10 +1,10 @@ - + - - - - - + + + + + diff --git a/src/assets/img/icons/damage-power-window.svg b/src/assets/img/icons/damage-power-window.svg new file mode 100644 index 000000000..37ba88a7f --- /dev/null +++ b/src/assets/img/icons/damage-power-window.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/assets/img/icons/damage-side-window.svg b/src/assets/img/icons/damage-side-window.svg new file mode 100644 index 000000000..824dab9c8 --- /dev/null +++ b/src/assets/img/icons/damage-side-window.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/src/assets/img/icons/side-glass-left-front.svg b/src/assets/img/icons/side-glass-left-front.svg new file mode 100644 index 000000000..91335db00 --- /dev/null +++ b/src/assets/img/icons/side-glass-left-front.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/src/assets/img/icons/side-glass-left-rear.svg b/src/assets/img/icons/side-glass-left-rear.svg new file mode 100644 index 000000000..95b851615 --- /dev/null +++ b/src/assets/img/icons/side-glass-left-rear.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/side-glass-right-front.svg b/src/assets/img/icons/side-glass-right-front.svg new file mode 100644 index 000000000..a3afc9d1d --- /dev/null +++ b/src/assets/img/icons/side-glass-right-front.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/src/assets/img/icons/side-glass-right-rear.svg b/src/assets/img/icons/side-glass-right-rear.svg new file mode 100644 index 000000000..746f411c9 --- /dev/null +++ b/src/assets/img/icons/side-glass-right-rear.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/side-window-damage-left-all.svg b/src/assets/img/icons/side-window-damage-left-all.svg new file mode 100644 index 000000000..f126a9a21 --- /dev/null +++ b/src/assets/img/icons/side-window-damage-left-all.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/src/assets/img/icons/side-window-damage-right-all.svg b/src/assets/img/icons/side-window-damage-right-all.svg new file mode 100644 index 000000000..4f4ae7517 --- /dev/null +++ b/src/assets/img/icons/side-window-damage-right-all.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/src/assets/img/icons/side-window-damage.svg b/src/assets/img/icons/side-window-damage.svg deleted file mode 100644 index 356145856..000000000 --- a/src/assets/img/icons/side-window-damage.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/src/assets/img/icons/suv-side-glass-left-front.svg b/src/assets/img/icons/suv-side-glass-left-front.svg new file mode 100644 index 000000000..ff37582b0 --- /dev/null +++ b/src/assets/img/icons/suv-side-glass-left-front.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/assets/img/icons/suv-side-glass-left-rear.svg b/src/assets/img/icons/suv-side-glass-left-rear.svg new file mode 100644 index 000000000..ea5f158bf --- /dev/null +++ b/src/assets/img/icons/suv-side-glass-left-rear.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/assets/img/icons/suv-side-glass-right-front.svg b/src/assets/img/icons/suv-side-glass-right-front.svg new file mode 100644 index 000000000..39a78961e --- /dev/null +++ b/src/assets/img/icons/suv-side-glass-right-front.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/assets/img/icons/suv-side-glass-right-rear.svg b/src/assets/img/icons/suv-side-glass-right-rear.svg new file mode 100644 index 000000000..b53e7bd68 --- /dev/null +++ b/src/assets/img/icons/suv-side-glass-right-rear.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/assets/img/icons/suv-side-window-damage-left-all.svg b/src/assets/img/icons/suv-side-window-damage-left-all.svg new file mode 100644 index 000000000..438318daf --- /dev/null +++ b/src/assets/img/icons/suv-side-window-damage-left-all.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/assets/img/icons/suv-side-window-damage-right-all.svg b/src/assets/img/icons/suv-side-window-damage-right-all.svg new file mode 100644 index 000000000..0343c7f27 --- /dev/null +++ b/src/assets/img/icons/suv-side-window-damage-right-all.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/assets/img/icons/suv-vent-left-front.svg b/src/assets/img/icons/suv-vent-left-front.svg new file mode 100644 index 000000000..efcb7d1bd --- /dev/null +++ b/src/assets/img/icons/suv-vent-left-front.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/src/assets/img/icons/suv-vent-left-rear.svg b/src/assets/img/icons/suv-vent-left-rear.svg new file mode 100644 index 000000000..1c5137604 --- /dev/null +++ b/src/assets/img/icons/suv-vent-left-rear.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/assets/img/icons/suv-vent-right-front.svg b/src/assets/img/icons/suv-vent-right-front.svg new file mode 100644 index 000000000..3d9923291 --- /dev/null +++ b/src/assets/img/icons/suv-vent-right-front.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/src/assets/img/icons/suv-vent-right-rear.svg b/src/assets/img/icons/suv-vent-right-rear.svg new file mode 100644 index 000000000..5c5af3833 --- /dev/null +++ b/src/assets/img/icons/suv-vent-right-rear.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-left-front-vent.svg b/src/assets/img/icons/truck-left-front-vent.svg new file mode 100644 index 000000000..6c4fabf45 --- /dev/null +++ b/src/assets/img/icons/truck-left-front-vent.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-rear-glass-multi-center.svg b/src/assets/img/icons/truck-rear-glass-multi-center.svg new file mode 100644 index 000000000..b17e2508e --- /dev/null +++ b/src/assets/img/icons/truck-rear-glass-multi-center.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-rear-glass-multi-left.svg b/src/assets/img/icons/truck-rear-glass-multi-left.svg new file mode 100644 index 000000000..2b5b01746 --- /dev/null +++ b/src/assets/img/icons/truck-rear-glass-multi-left.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-rear-glass-multi-right.svg b/src/assets/img/icons/truck-rear-glass-multi-right.svg new file mode 100644 index 000000000..7e3e8cd92 --- /dev/null +++ b/src/assets/img/icons/truck-rear-glass-multi-right.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-rear-glass-multi.svg b/src/assets/img/icons/truck-rear-glass-multi.svg new file mode 100644 index 000000000..306d0e108 --- /dev/null +++ b/src/assets/img/icons/truck-rear-glass-multi.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-rear-glass.svg b/src/assets/img/icons/truck-rear-glass.svg new file mode 100644 index 000000000..cb4cca966 --- /dev/null +++ b/src/assets/img/icons/truck-rear-glass.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/truck-right-front-vent.svg b/src/assets/img/icons/truck-right-front-vent.svg new file mode 100644 index 000000000..81deb6cd3 --- /dev/null +++ b/src/assets/img/icons/truck-right-front-vent.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-side-glass-left-front.svg b/src/assets/img/icons/truck-side-glass-left-front.svg new file mode 100644 index 000000000..6dfe42ed9 --- /dev/null +++ b/src/assets/img/icons/truck-side-glass-left-front.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-side-glass-left-rear.svg b/src/assets/img/icons/truck-side-glass-left-rear.svg new file mode 100644 index 000000000..eef7f6247 --- /dev/null +++ b/src/assets/img/icons/truck-side-glass-left-rear.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-side-glass-right-front.svg b/src/assets/img/icons/truck-side-glass-right-front.svg new file mode 100644 index 000000000..e1f567e7c --- /dev/null +++ b/src/assets/img/icons/truck-side-glass-right-front.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-side-glass-right-rear.svg b/src/assets/img/icons/truck-side-glass-right-rear.svg new file mode 100644 index 000000000..32fe7d9ee --- /dev/null +++ b/src/assets/img/icons/truck-side-glass-right-rear.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-side-window-damage-left-all.svg b/src/assets/img/icons/truck-side-window-damage-left-all.svg new file mode 100644 index 000000000..5976fbdac --- /dev/null +++ b/src/assets/img/icons/truck-side-window-damage-left-all.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-side-window-damage-right-all.svg b/src/assets/img/icons/truck-side-window-damage-right-all.svg new file mode 100644 index 000000000..fb76237de --- /dev/null +++ b/src/assets/img/icons/truck-side-window-damage-right-all.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/img/icons/truck-windshield.svg b/src/assets/img/icons/truck-windshield.svg new file mode 100644 index 000000000..03eb38e77 --- /dev/null +++ b/src/assets/img/icons/truck-windshield.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/src/assets/img/icons/van-rear-glass.svg b/src/assets/img/icons/van-rear-glass.svg new file mode 100644 index 000000000..14208f87d --- /dev/null +++ b/src/assets/img/icons/van-rear-glass.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/src/assets/img/icons/van-side-glass-left-front.svg b/src/assets/img/icons/van-side-glass-left-front.svg new file mode 100644 index 000000000..7974ef45a --- /dev/null +++ b/src/assets/img/icons/van-side-glass-left-front.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/van-side-glass-left-rear.svg b/src/assets/img/icons/van-side-glass-left-rear.svg new file mode 100644 index 000000000..695e0336c --- /dev/null +++ b/src/assets/img/icons/van-side-glass-left-rear.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/van-side-glass-left-slider.svg b/src/assets/img/icons/van-side-glass-left-slider.svg new file mode 100644 index 000000000..190f176ef --- /dev/null +++ b/src/assets/img/icons/van-side-glass-left-slider.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/src/assets/img/icons/van-side-glass-right-front.svg b/src/assets/img/icons/van-side-glass-right-front.svg new file mode 100644 index 000000000..64f1a14ad --- /dev/null +++ b/src/assets/img/icons/van-side-glass-right-front.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/van-side-glass-right-rear.svg b/src/assets/img/icons/van-side-glass-right-rear.svg new file mode 100644 index 000000000..60b45ef90 --- /dev/null +++ b/src/assets/img/icons/van-side-glass-right-rear.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/van-side-glass-right-slider.svg b/src/assets/img/icons/van-side-glass-right-slider.svg new file mode 100644 index 000000000..274513031 --- /dev/null +++ b/src/assets/img/icons/van-side-glass-right-slider.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/src/assets/img/icons/van-side-window-damage-left-all.svg b/src/assets/img/icons/van-side-window-damage-left-all.svg new file mode 100644 index 000000000..cecbb6c27 --- /dev/null +++ b/src/assets/img/icons/van-side-window-damage-left-all.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/src/assets/img/icons/van-side-window-damage-right-all.svg b/src/assets/img/icons/van-side-window-damage-right-all.svg new file mode 100644 index 000000000..2d3de77fd --- /dev/null +++ b/src/assets/img/icons/van-side-window-damage-right-all.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/src/assets/img/icons/van-vent-left-front.svg b/src/assets/img/icons/van-vent-left-front.svg new file mode 100644 index 000000000..8afdf559e --- /dev/null +++ b/src/assets/img/icons/van-vent-left-front.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/src/assets/img/icons/van-vent-right-front.svg b/src/assets/img/icons/van-vent-right-front.svg new file mode 100644 index 000000000..d7d74c4f8 --- /dev/null +++ b/src/assets/img/icons/van-vent-right-front.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/src/assets/img/icons/van-windshield.svg b/src/assets/img/icons/van-windshield.svg new file mode 100644 index 000000000..07d953b43 --- /dev/null +++ b/src/assets/img/icons/van-windshield.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/src/assets/img/icons/vent-left-front.svg b/src/assets/img/icons/vent-left-front.svg new file mode 100644 index 000000000..b2ad73189 --- /dev/null +++ b/src/assets/img/icons/vent-left-front.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/vent-left-rear.svg b/src/assets/img/icons/vent-left-rear.svg new file mode 100644 index 000000000..94c1e47e1 --- /dev/null +++ b/src/assets/img/icons/vent-left-rear.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/src/assets/img/icons/vent-right-front.svg b/src/assets/img/icons/vent-right-front.svg new file mode 100644 index 000000000..a1056aaed --- /dev/null +++ b/src/assets/img/icons/vent-right-front.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/vent-right-rear.svg b/src/assets/img/icons/vent-right-rear.svg new file mode 100644 index 000000000..4f6884ed2 --- /dev/null +++ b/src/assets/img/icons/vent-right-rear.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/src/assets/img/icons/vent-window-left-all.svg b/src/assets/img/icons/vent-window-left-all.svg new file mode 100644 index 000000000..3d9439b69 --- /dev/null +++ b/src/assets/img/icons/vent-window-left-all.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/src/assets/img/icons/vent-window-right-all.svg b/src/assets/img/icons/vent-window-right-all.svg new file mode 100644 index 000000000..277d00aa7 --- /dev/null +++ b/src/assets/img/icons/vent-window-right-all.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/src/assets/img/icons/windshield-damage.svg b/src/assets/img/icons/windshield-damage.svg index dfdea1bb1..7b2a128f6 100644 --- a/src/assets/img/icons/windshield-damage.svg +++ b/src/assets/img/icons/windshield-damage.svg @@ -1,12 +1,12 @@ - + - - - - - - - + + + + + + + diff --git a/src/assets/img/icons/windshield-repair.svg b/src/assets/img/icons/windshield-repair.svg new file mode 100644 index 000000000..ad757a3a2 --- /dev/null +++ b/src/assets/img/icons/windshield-repair.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/assets/img/icons/windshield-replace.svg b/src/assets/img/icons/windshield-replace.svg new file mode 100644 index 000000000..ae4226ba0 --- /dev/null +++ b/src/assets/img/icons/windshield-replace.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/src/assets/img/icons/windshield-split-full.svg b/src/assets/img/icons/windshield-split-full.svg new file mode 100644 index 000000000..780343cd2 --- /dev/null +++ b/src/assets/img/icons/windshield-split-full.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/windshield-split-left.svg b/src/assets/img/icons/windshield-split-left.svg new file mode 100644 index 000000000..87e3cb0ef --- /dev/null +++ b/src/assets/img/icons/windshield-split-left.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/src/assets/img/icons/windshield-split-right.svg b/src/assets/img/icons/windshield-split-right.svg new file mode 100644 index 000000000..2ceb09e48 --- /dev/null +++ b/src/assets/img/icons/windshield-split-right.svg @@ -0,0 +1,10 @@ + + + + + + + + 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 23d5dd2f8..cf3a630bf 100644 --- a/src/common-components/button-back/button-back.vue +++ b/src/common-components/button-back/button-back.vue @@ -1,13 +1,38 @@
-
-
-
+ + + + + + + + @@ -19,71 +44,39 @@ export default { type: String, required: true, default: "", - } + }, }, methods: { handleClick() { - this.$emit('click-event'); - } - } + this.$emit("click-event"); + }, + }, }; diff --git a/src/common-components/button-question/button-question.spec.js b/src/common-components/button-question/button-question.spec.js index 609981717..d5608cd62 100644 --- a/src/common-components/button-question/button-question.spec.js +++ b/src/common-components/button-question/button-question.spec.js @@ -1,23 +1,73 @@ import { shallowMount } from "@vue/test-utils"; import buttonQuestion from "@/common-components/button-question/button-question"; +import { nextTick } from "vue"; describe("buttonQuestion.vue", () => { - it("Should render the 'questionText' prop value as a span value for the button question and the 'answer' values should render as text values for button components.", async () => { + it("Should show overflow classes on fieldset if isOverflowScrollable is true", async () => { // Act const wrapper = shallowMount(buttonQuestion); await wrapper.setProps({ - questionText: "Question Text", - answers: ["2023", "2022", "2021"], - modelValue: "2020", + isOverflowScrollable: true, }); - wrapper.vm.chooseAnswer("2021"); - // Assert - expect(wrapper.find(".text-center").text()).toEqual( - "Question Text" - ); - const buttonButtons = wrapper.findAllComponents('[data-test="button"]'); - expect(buttonButtons.length).toBe(3); - expect(wrapper.props().modelValue).toBe("2020"); + const fieldSet = wrapper.find('fieldset'); + expect(fieldSet.classes()).toContain("overflow-scroll"); }); }); + +describe("buttonQuestion.vue", () => { + it("Fieldset classes should contain row if button type is listCard", async () => { + // Act + const wrapper = shallowMount(buttonQuestion); + await wrapper.setProps({ + buttonType: "listCard", + }); + // Assert + const Div = wrapper.find('fieldset div'); + expect(Div.classes()).toContain("row"); + }); +}); + +describe("buttonQuestion.vue", () => { + it("Fieldset classes should contain d-flex if button type is listButtonHorizontal", async () => { + // Act + const wrapper = shallowMount(buttonQuestion); + await wrapper.setProps({ + buttonType: "listButtonHorizontal", + }); + // Assert + const Div = wrapper.find('fieldset div'); + expect(Div.classes()).toContain("d-flex"); + }); +}); + +describe("buttonQuestion.vue", () => { + it("Should trigger event modelValue change to new value on when radio button selected", async () => { + // Act + const wrapper = shallowMount(buttonQuestion); + await wrapper.setProps({ + answers: ["2022", "2021", "2020"], + isMultiSelect: false + }); + const val = {isChecked: true, buttonId: "2021", } + wrapper.vm.handleCheckedChanged(val); + // Assert + expect(wrapper.emitted()["update:modelValue"][0]).toEqual([["2021"]]); + }); +}); + +describe("buttonQuestion.vue", () => { + it("Should add values to array on checkbox click", async () => { + // Act + const wrapper = shallowMount(buttonQuestion); + await wrapper.setProps({ + modelValue: ["2022", "2021", "2020"], + isMultiSelect: true + }); + const val = {isChecked: true, buttonId: "2019", } + wrapper.vm.handleCheckedChanged(val); + // Assert + expect(wrapper.emitted()["update:modelValue"][0]).toEqual([["2022", "2021", "2020", "2019"]]); + }); +}); + diff --git a/src/common-components/button-question/button-question.vue b/src/common-components/button-question/button-question.vue index 3a44b7be9..7fff5c238 100644 --- a/src/common-components/button-question/button-question.vue +++ b/src/common-components/button-question/button-question.vue @@ -1,27 +1,39 @@ + + diff --git a/src/layouts/not-found/not-found.vue b/src/layouts/not-found/not-found.vue deleted file mode 100644 index 6c4cc8e33..000000000 --- a/src/layouts/not-found/not-found.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/src/layouts/vehicle-damage/damage-location-question/damage-location-question.spec.js b/src/layouts/vehicle-damage/damage-location-question/damage-location-question.spec.js new file mode 100644 index 000000000..65434b289 --- /dev/null +++ b/src/layouts/vehicle-damage/damage-location-question/damage-location-question.spec.js @@ -0,0 +1,83 @@ +import { shallowMount } from "@vue/test-utils"; +import damageLocationQuestion from "@/layouts/vehicle-damage/damage-location-question/damage-location-question"; +import { getMountOptions } from "@/helpers/unit-test-helper.js"; +import store from "@/store"; +jest.mock("@/store", () => { return {}; }, {virtual: true}); + +describe("damage-location-question.vue", () => { + test("Selected location option is emitted upon selection.", async () => { + + //Arrange + const { wrapper } = setupMocks({ modelValueProp: ["Windshield"] }); + const locationToSelect = ["Backseat"]; + + //Act + wrapper.setValue({ modelValue: locationToSelect }); + await wrapper.vm.$nextTick(); + + //Assert + expect(wrapper.emitted()["update:modelValue"][0]).toEqual([{modelValue: ["Backseat"]}]); + }); + }); + + describe("damage-location-question.vue", () => { + test("Answers to display filtered by data from api.", async () => { + + //Arrange + const { wrapper, cmsContent, damageOptions } = setupMocks({ dataFromStoreApi: { + driverSideOptions: { + availableReplacementOptions: ['Quarter', 'Front'] + }, + windshieldOptions: { + availableReplacementOptions: ['Single'] + }, + backGlassOptions: { + availableReplacementOptions: [] + } + } + }); + + //Act + damageLocationQuestion.methods.initializeComponent.call(wrapper.vm, cmsContent, damageOptions, "car-group"); + + //Assert + expect(wrapper.vm.answersToDisplay).toStrictEqual([ { Name: 'car-Windshield' }, { Name: 'car-SideDoor' }, {Name: "car-RearWindow"} ]) + }); + }); + + function setupMocks({ + modelValueProp = ["Windshield", "SideDoor"], + isMultiSelect = false, + groupName = "damageQuestion", + cmsQuestionText = "CMS text goes here", + cmsAnswers = [{Name: "car-Windshield"}, {Name: "car-SideDoor"}, {Name: "car-RearWindow"}], + dataFromStoreApi = [], + }) { + + //Mock store + store.dispatch = jest.fn(() => dataFromStoreApi); + store.getters = { vehicle: {year: 2019, make: 'honda', model: 'civc', style: '2 Door', category: 'CAR'} }; + const mountOptions = getMountOptions({ + store: { + dispatch: store.dispatch, + getters: store.getters, + }, + }); + + //Mock props + mountOptions.propsData = { + modelValue: modelValueProp, + isMultiSelect: isMultiSelect, + }; + + const wrapper = shallowMount(damageLocationQuestion, mountOptions); + + //Mock CMS content + const cmsContent = { + groupName: groupName, + QuestionText: cmsQuestionText, + Answers: cmsAnswers, + }; + const damageOptions = dataFromStoreApi; + return { wrapper, cmsContent, damageOptions }; + } \ No newline at end of file diff --git a/src/layouts/vehicle-damage/damage-location-question/damage-location-question.vue b/src/layouts/vehicle-damage/damage-location-question/damage-location-question.vue new file mode 100644 index 000000000..c48912ff2 --- /dev/null +++ b/src/layouts/vehicle-damage/damage-location-question/damage-location-question.vue @@ -0,0 +1,69 @@ + + + \ No newline at end of file diff --git a/src/layouts/vehicle-damage/replace-options-question/replace-options-question.spec.js b/src/layouts/vehicle-damage/replace-options-question/replace-options-question.spec.js new file mode 100644 index 000000000..103aecd4c --- /dev/null +++ b/src/layouts/vehicle-damage/replace-options-question/replace-options-question.spec.js @@ -0,0 +1,76 @@ +import { shallowMount } from "@vue/test-utils"; +import replaceOptionsQuestion from "@/layouts/vehicle-damage/replace-options-question/replace-options-question"; +import { getMountOptions } from "@/helpers/unit-test-helper.js"; +import store from "@/store"; +jest.mock("@/store", () => { return {}; }, {virtual: true}); + +describe("replace-options-question.vue", () => { + test("Selected damage option is emitted upon selection.", async () => { + + //Arrange + const { wrapper } = setupMocks({ modelValueProp: ["Windshield"] }); + const damageToSelect = ["Backseat"]; + + //Act + wrapper.setValue({ modelValue: damageToSelect }); + await wrapper.vm.$nextTick(); + + //Assert + expect(wrapper.emitted()["update:modelValue"][0]).toEqual([{modelValue: ["Backseat"]}]); + }); + }); + + describe("replace-options-question.vue", () => { + test("Answers to display filtered by data from api.", async () => { + + //Arrange + const { wrapper, cmsContent, replaceOptions } = setupMocks({ dataFromStoreApi: ["Windshield", "FrontDoor"]}); + + //Act + replaceOptionsQuestion.methods.initializeComponent.call(wrapper.vm, cmsContent, replaceOptions, "car-group"); + + //Assert + expect(wrapper.vm.answersToDisplay).toStrictEqual([ { Name: 'car-Windshield' }, { Name: 'car-FrontDoor' } ]) + }); + }); + + function setupMocks({ + modelValueProp = ["Windshield"], + isAvailale = true, + isMultiSelect = false, + filterByVehicleCategory = false, + groupName = "damageQuestion", + cmsQuestionText = "CMS text goes here", + cmsAnswers = [{Name: "car-Windshield"}, {Name: "car-BackDoor"}, {Name: "car-FrontDoor"}], + dataFromStoreApi = [], + }) { + + //Mock store + store.dispatch = jest.fn(() => dataFromStoreApi); + store.getters = { vehicle: {year: 2019, make: 'honda', model: 'civc', style: '2 Door', category: 'CAR'} }; + const mountOptions = getMountOptions({ + store: { + dispatch: store.dispatch, + getters: store.getters, + }, + }); + + //Mock props + mountOptions.propsData = { + modelValue: modelValueProp, + isAvailable: isAvailale, + isMultiSelect: isMultiSelect, + filterByVehicleCategory: filterByVehicleCategory + }; + + const wrapper = shallowMount(replaceOptionsQuestion, mountOptions); + + //Mock CMS content + const cmsContent = { + groupName: groupName, + QuestionText: cmsQuestionText, + Answers: cmsAnswers, + }; + const replaceOptions = dataFromStoreApi; + return { wrapper, cmsContent, replaceOptions }; + } \ No newline at end of file diff --git a/src/layouts/vehicle-damage/replace-options-question/replace-options-question.vue b/src/layouts/vehicle-damage/replace-options-question/replace-options-question.vue new file mode 100644 index 000000000..41ecac799 --- /dev/null +++ b/src/layouts/vehicle-damage/replace-options-question/replace-options-question.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/layouts/vehicle-damage/vehicle-damage.spec.js b/src/layouts/vehicle-damage/vehicle-damage.spec.js new file mode 100644 index 000000000..49df756c2 --- /dev/null +++ b/src/layouts/vehicle-damage/vehicle-damage.spec.js @@ -0,0 +1,256 @@ +// 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"; +import replaceOptionsQuestion from "@/layouts/vehicle-damage/replace-options-question/replace-options-question"; +import damageLocationQuestion from "@/layouts/vehicle-damage/damage-location-question/damage-location-question"; + +// 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"; +import { storeActions } from "@/constants/store-actions"; +import store from "@/store"; + +// 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", () => ({ + commit: jest.fn(), + dispatch: jest.fn(), + getters: { + vehicle: { + 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, + }); + + //Act + vehicleDamage.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-damage" } }, + undefined, + (c) => c(wrapper.vm) + ); + + //Assert + apiPromise.finally(() => { + expect(funnelSubHeader.methods.initializeComponent).toHaveBeenCalledWith( + pageHeaderWidgetHeaderText + ); + done(); + }); + }); +}); + +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(); + }); + }); +}); + +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); + }); +}); + +describe("vehicle-damage.vue", () => { + test("Call invalidation, ResetPartsAndDeps should be called", async () => { + + //Arrange + const { wrapper } = setupMocks({}); + + //Act + vehicleDamage.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-damage" } }, + undefined, + (c) => c(wrapper.vm) + ); + + wrapper.vm.resetDependentState(); + + //Assert + expect(store.dispatch).toBeCalledWith(storeActions.RESET_PARTS_AND_DEPS) + + }); +}); + +function setupMocks({ + pageHeaderWidgetHeaderText = {}, + mountOptionsMockData = {}, +}) { + //Mock api responses + baseMixin.methods.dispatchNonBlockingStoreAction = jest.fn(); + baseMixin.methods.dispatchNonBlockingStoreAction.mockImplementation(() => { + return Promise.resolve({ + driverSideOptions: { + availableReplacementOptions: ["Front", "Back", "Side"], + } + }); + }); + 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", + }, + }, + damageOptions: { + driverSideOptions: { + availableReplacementOptions: ["Front", "Back", "Side"], + } + }, + }; + + 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 driverSideOptions = replaceOptionsQuestion + driverSideOptions.methods = { + initializeComponent: jest.fn(), + }; + + damageLocationQuestion.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; + + const driverSideOptionsWrapper = wrapper.findComponent({ + name: "replaceOptionsQuestion", + }); + driverSideOptionsWrapper.vm.initializeComponent = + replaceOptionsQuestion.methods.initializeComponent; + + const damageLocationQuestionWrapper = wrapper.findComponent({ + name: "damageLocationQuestion", + }); + damageLocationQuestionWrapper.vm.initializeComponent = + damageLocationQuestion.methods.initializeComponent; + + return { wrapper, apiPromise }; +} diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue new file mode 100644 index 000000000..c5b8df783 --- /dev/null +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -0,0 +1,93 @@ + + + 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 84dd4f7e8..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,65 +2,84 @@ 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"; //Act - wrapper.setData({ selectedMake: makeToSelect }); + wrapper.setValue({ selectedMake: makeToSelect }); await wrapper.vm.$nextTick(); //Assert - expect(wrapper.emitted()["update:modelValue"][0]).toEqual(["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 1e5ac38c7..9fb2d6ea1 100644 --- a/src/layouts/vehicle-make/make-question/make-question.vue +++ b/src/layouts/vehicle-make/make-question/make-question.vue @@ -1,9 +1,14 @@ @@ -19,29 +24,38 @@ export default { data() { return { questionText: null, - selectedMake: null, makes: Array, - } + }; }, props: { modelValue: String, }, + computed: { + selectedValueAsArray: { + get: function() { + const modelValueAsArray = this.modelValue ? [this.modelValue] : []; + return modelValueAsArray; + }, + set: function(newValue) { + const newValueAsScalar = newValue && newValue.length > 0 ? newValue[0] : null; + this.$emit("update:modelValue", newValueAsScalar); + } + } + }, components: { buttonQuestion, }, methods: { loadInitialData() { - return baseMixin.methods.dispatchNonBlockingStoreAction(storeActions.GET_VEHICLE_MAKES, {year: store.getters.vehicle.year}); + return baseMixin.methods.dispatchNonBlockingStoreAction( + storeActions.GET_VEHICLE_MAKES, + { year: store.getters.vehicle.year } + ); }, initializeComponent(cmsContent, initialData) { this.questionText = cmsContent.QuestionText; this.makes = initialData; - } - }, - watch: { - selectedMake(val) { - this.$emit("update:modelValue", val); - } + }, }, }; diff --git a/src/layouts/vehicle-make/vehicle-make.spec.js b/src/layouts/vehicle-make/vehicle-make.spec.js index f1625dd6e..b2c4dcaf7 100644 --- a/src/layouts/vehicle-make/vehicle-make.spec.js +++ b/src/layouts/vehicle-make/vehicle-make.spec.js @@ -1,35 +1,67 @@ -import { shallowMount, flushPromises } from "@vue/test-utils"; +// Supporting Files +import { shallowMount } from "@vue/test-utils"; import { getMountOptions } from "@/helpers/unit-test-helper.js"; +import { settleAllPromises } from "@/helpers/layout-helper.js"; +import { nextTick } from "vue"; +import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; +import { storeMutations } from "@/constants/store-mutations"; +import { storeActions } from "@/constants/store-actions"; + +// Components import vehicleMake from "@/layouts/vehicle-make/vehicle-make.vue"; import makeQuestion from "@/layouts/vehicle-make/make-question/make-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"; -import { settleAllPromises } from "@/helpers/layout-helper.js"; -import { nextTick } from "vue"; +import store from "@/store"; + +jest.mock("@/store", () => ({ + commit: jest.fn(), + dispatch: jest.fn(), + 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 radioQuestionCmsContent = { QuestionText: "What make is your vehicle?" }; + const vehicleMakeQuestionCmsContent = { + QuestionText: "What make is your vehicle?", + }; const makeQuestionInitialData = ["honda", "ford", "dodge"]; - const { wrapper, apiPromise } = setupMocks( { - radioQuestionCmsContent: radioQuestionCmsContent, + const { wrapper, apiPromise } = setupMocks({ + vehicleMakeQuestionCmsContent: vehicleMakeQuestionCmsContent, makeQuestionInitialData: makeQuestionInitialData, - } ); + }); //Act - vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); + vehicleMake.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-make" } }, + undefined, + (c) => c(wrapper.vm) + ); //Assert apiPromise.finally(() => { - expect(makeQuestion.methods.initializeComponent).toHaveBeenCalledWith(radioQuestionCmsContent, makeQuestionInitialData); + expect(makeQuestion.methods.initializeComponent).toHaveBeenCalledWith( + vehicleMakeQuestionCmsContent, + makeQuestionInitialData + ); done(); }); }); @@ -37,17 +69,25 @@ describe("vehicle-make.vue", () => { describe("vehicle-make.vue", () => { test("Page header is initailized with api data", async (done) => { - //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)); + vehicleMake.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-make" } }, + undefined, + (c) => c(wrapper.vm) + ); //Assert apiPromise.finally(() => { - expect(funnelSubHeader.methods.initializeComponent).toHaveBeenCalledWith(pageHeaderWidgetHeaderText); + expect(funnelSubHeader.methods.initializeComponent).toHaveBeenCalledWith( + pageHeaderWidgetHeaderText + ); done(); }); }); @@ -55,20 +95,28 @@ describe("vehicle-make.vue", () => { describe("vehicle-make.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 - vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); + vehicleMake.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-make" } }, + undefined, + (c) => c(wrapper.vm) + ); //Assert apiPromise.finally(() => { - expect(funnelHeader.methods.initializeComponent).toHaveBeenCalledWith(SiteHeaderWidget); + expect(funnelHeader.methods.initializeComponent).toHaveBeenCalledWith( + SiteHeaderWidget + ); done(); }); }); @@ -76,20 +124,28 @@ describe("vehicle-make.vue", () => { describe("vehicle-make.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 - vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); + vehicleMake.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-make" } }, + undefined, + (c) => c(wrapper.vm) + ); //Assert apiPromise.finally(() => { - expect(vehicleBanner.methods.initializeComponent).toHaveBeenCalledWith(VehicleBannerWidget); + expect(vehicleBanner.methods.initializeComponent).toHaveBeenCalledWith( + VehicleBannerWidget + ); done(); }); }); @@ -97,19 +153,23 @@ 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: { - navigate: jest.fn() + navigate: jest.fn(), }, }, }); - + //Act - vehicleMake.beforeRouteEnter.call(wrapper.vm, { query: { fmgPage: "vehicle-make" } }, undefined, (c) => c(wrapper.vm)); + vehicleMake.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-make" } }, + undefined, + (c) => c(wrapper.vm) + ); wrapper.vm.backButtonAction(); await nextTick(); @@ -121,34 +181,80 @@ describe("vehicle-make.vue", () => { }); }); +describe("vehicle-make.vue", () => { + test("Year set, arePagePrerequisitesValid should be true ", async () => { + //Arrange + const { wrapper } = setupMocks({}); + + //Act + vehicleMake.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-make" } }, + undefined, + (c) => c(wrapper.vm) + ); + + let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + //Assert + expect(arePagePrerequisitesValid).toBe(true); + }); +}); + +describe("vehicle-make.vue", () => { + test("Year set, call invalidation, model, style, carId, category should be null", async () => { + + //Arrange + const { wrapper } = setupMocks({}); + + //Act + vehicleMake.beforeRouteEnter.call( + wrapper.vm, + { query: { fmgPage: "vehicle-make" } }, + undefined, + (c) => c(wrapper.vm) + ); + + wrapper.vm.resetDependentState(); + + //Assert + expect(store.commit).toBeCalledWith(storeMutations.UPDATE_MODEL, null) + expect(store.commit).toBeCalledWith(storeMutations.UPDATE_STYLE, null) + expect(store.commit).toBeCalledWith(storeMutations.UPDATE_CAR_ID, null) + expect(store.commit).toBeCalledWith(storeMutations.UPDATE_VEHICLE_CATEGORY, null) + + expect(store.dispatch).toBeCalledWith(storeActions.RESET_DAMAGE_AND_DEPS) + expect(store.dispatch).toBeCalledWith(storeActions.RESET_REGISTRATION_AND_DEPS) + + }); +}); + function setupMocks({ - radioQuestionCmsContent = {}, + vehicleMakeQuestionCmsContent = {}, makeQuestionInitialData = {}, pageHeaderWidgetHeaderText = {}, mountOptionsMockData = {}, }) { - //Mock api responses const apiResponses = { cmsContent: { - FunnelSubHeaderWidget: [pageHeaderWidgetHeaderText], - RadioQuestionWidget: [radioQuestionCmsContent], - 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", - }, - ], + 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", + }, }, makeQuestionInitialData: makeQuestionInitialData, }; + const apiPromise = Promise.resolve(apiResponses); + + fetchCmsContentForPage.mockImplementation(() => Promise.resolve()); settleAllPromises.mockImplementation(() => apiPromise); //Mock make question methods @@ -165,16 +271,23 @@ function setupMocks({ funnelSubHeader.methods = { initializeComponent: jest.fn(), }; + const mountOptions = getMountOptions(mountOptionsMockData); const wrapper = shallowMount(vehicleMake, mountOptions); const makeQuestionWrapper = wrapper.findComponent({ name: "makeQuestion" }); - makeQuestionWrapper.vm.initializeComponent = makeQuestion.methods.initializeComponent; + makeQuestionWrapper.vm.initializeComponent = + makeQuestion.methods.initializeComponent; 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; - const funnelSubHeaderWrapper = wrapper.findComponent({ name: "funnelSubHeader" }); - funnelSubHeaderWrapper.vm.initializeComponent = funnelSubHeader.methods.initializeComponent; + 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.vue b/src/layouts/vehicle-make/vehicle-make.vue index e9fdb7686..023d24023 100644 --- a/src/layouts/vehicle-make/vehicle-make.vue +++ b/src/layouts/vehicle-make/vehicle-make.vue @@ -1,15 +1,14 @@