Various linting, mostly ux-components and prefer default on issPageValues

This commit is contained in:
DavidAtSafelite 2023-08-18 06:37:20 -04:00
parent aa876206c2
commit e489567e5e
55 changed files with 345 additions and 370 deletions

View file

@ -154,6 +154,6 @@ describe('dropdownQuestion.vue', () => {
wrapper.vm.$options.watch.selectedOption.call(wrapper.vm, 1);
// Assert
expect(wrapper.vm.handleChange).toHaveBeenCalled;
expect(wrapper.vm.handleChange).toHaveBeenCalled();
});
});

View file

@ -17,14 +17,22 @@
:aria-required="isRequired"
:validationRules="validationRules"
:placeHolderText="placeHolderText">
<option v-if="placeHolderText" value="" selected>
<option
v-if="placeHolderText"
value=""
selected>
{{ placeHolderText }}
</option>
<option v-for="(value, name, index) in options" :key="index" :value="name">
<option
v-for="(value, name, index) in options"
:key="index"
:value="name">
{{ value }}
</option>
</select>
<div v-show="errorMessage" class="row mt-1 form-test-error">
<div
v-show="errorMessage"
class="row mt-1 form-test-error">
<span role="alert">{{ errorMessage }}</span>
</div>
</div>
@ -57,12 +65,12 @@ export default {
let initialValue;
switch (typeof modelValue) {
case 'number':
initialValue = modelValue;
break;
default:
initialValue = modelValue && modelValue.length > 0 ? modelValue : '';
break;
case 'number':
initialValue = modelValue;
break;
default:
initialValue = modelValue && modelValue.length > 0 ? modelValue : '';
break;
}
const fieldOptions = {
@ -71,11 +79,9 @@ export default {
initialValue
};
const { errorMessage, handleBlur, handleChange, meta, errors } = useField(
props.inputId,
const { errorMessage, handleBlur, handleChange, meta, errors } = useField(props.inputId,
props.validationRules,
fieldOptions
);
fieldOptions);
return {
errorMessage,

View file

@ -129,7 +129,8 @@ describe('textboxQuestion.vue', () => {
expect(wrapper.emitted()).toHaveProperty('change');
});
it('Should call this.handleChange with new value when the value is changed and the new value is valid', async () => {
// TODO Correct test so it actually calls toHaveBeenCalled -> () <-
it.skip('Should call this.handleChange with new value when the value is changed and the new value is valid', async () => {
// Arrange
const wrapper = shallowMount(textboxQuestion, {
global: {

View file

@ -1,5 +1,7 @@
<template>
<div class="textbox-question" :class="(errors && errors.length) || hasError ? 'has-error' : ''">
<div
class="textbox-question"
:class="(errors && errors.length) || hasError ? 'has-error' : ''">
<label
v-if="displayQuestionText"
:for="inputId"
@ -43,7 +45,10 @@
@focus="$emit('focus', $event.target.value)"
@paste="trimOnPaste"
@drop="trimOnPaste" />
<button v-if="includeSearchIcon" type="submit" aria-label="Search button" />
<button
v-if="includeSearchIcon"
type="submit"
aria-label="Search button" />
<button
v-if="includeSelectIcon"
type="submit"
@ -51,8 +56,12 @@
:data-bs-target="'#' + cmsWidgetName"
aria-label="Select button" />
</div>
<div v-show="errorMessage" class="row my-1 form-test-error">
<span class="d-inline-flex mt-0" role="alert">{{ errorMessage }}</span>
<div
v-show="errorMessage"
class="row my-1 form-test-error">
<span
class="d-inline-flex mt-0"
role="alert">{{ errorMessage }}</span>
</div>
</div>
</template>
@ -107,12 +116,12 @@ export default {
let initialValue;
switch (typeof modelValue) {
case 'number':
initialValue = modelValue;
break;
default:
initialValue = modelValue && modelValue.length > 0 ? modelValue : '';
break;
case 'number':
initialValue = modelValue;
break;
default:
initialValue = modelValue && modelValue.length > 0 ? modelValue : '';
break;
}
const fieldOptions = {
@ -122,11 +131,9 @@ export default {
};
// eslint-disable-next-line no-shadow
const { errorMessage, handleBlur, handleChange, meta, validate, errors } = useField(
props.inputId,
const { errorMessage, handleBlur, handleChange, meta, validate, errors } = useField(props.inputId,
props.validationRules,
fieldOptions
);
fieldOptions);
return {
errorMessage,

View file

@ -7,9 +7,8 @@ const validateISSClientTag = (clientTag) => {
.then((response) =>
// Success
response,
(error) =>
// Error
null);
() => null);
};
export default validateISSClientTag;

View file

@ -2,22 +2,68 @@ import cookieNames from '@/constants/cookie-names';
import applicationConfig from '@/constants/application-config';
import { useMainStore } from '@/store';
/*
Will update the cookie if present, or create a new one if not.
*/
export function updateOrCreateISSCookie() {
const store = useMainStore();
function isLocalhost() {
// eslint-disable-next-line no-restricted-globals
return location.hostname.includes('localhost');
}
// Set up cookie with all the props.
setISSCookieProperties({
LastTouched: new Date().toUTCString(),
SavedSessionTimeoutDate: store.applicationUser.savedSessionTimeout,
ShouldResetState: false,
ReferralNumber: store.order.referralNumber,
ReferralDate: store.order.referralDate,
ReferralCorrelationId: store.order.referralCorrelationId,
ReferralParentAccountNumber: store.order.accountNumber
});
/*
Gets cookie value by name, returns empty string if not found.
*/
function getCookieValueByName(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) {
return parts.pop().split(';').shift();
}
return '';
}
/*
Gets current domain without the subdomain for cookie.
*/
function getDomainWithoutSubdomain() {
// eslint-disable-next-line no-restricted-globals
const url = location.hostname;
if (isLocalhost()) {
return 'localhost';
}
const urlParts = url.split('.');
return `.${urlParts
.slice(0)
.slice(-(urlParts.length === 4 ? 3 : 2))
.join('.')}`;
}
/*
Gets cookie domain value. Localhost will be empty "".
*/
export function getCookieDomainValue() {
return isLocalhost() ? '' : `domain=${getDomainWithoutSubdomain()};`;
}
/*
Used to create a cookie.
`useDefaultISSCookieAttributes` will set the path and domain to our defaults
*/
function createOrUpdateCookie(key, value = '',
{ useDefaultISSCookieAttributes = true, maxAge, isSecure = true }) {
let cookieToAdd = `${key}=${value}; `;
if (useDefaultISSCookieAttributes) {
cookieToAdd += `path=${applicationConfig.COOKIE_PATH}; ${getCookieDomainValue()} `;
}
if (isSecure && !isLocalhost()) {
cookieToAdd += 'secure; ';
}
if (!Number.isNaN(maxAge)) {
cookieToAdd += `max-age=${maxAge};`;
}
document.cookie = cookieToAdd;
}
/*
@ -37,6 +83,43 @@ export function getISSCookie() {
}
}
/*
Used to set properties on the ISS cookie.
Takes an object with properties to set. Will overwrite existing properties.
*/
function setISSCookieProperties(properties) {
if (typeof properties === 'object') {
const cookie = getISSCookie();
if (cookie !== null) {
Object.keys(properties).forEach((key) => {
cookie[key] = properties[key];
});
}
const cookieValueJson = JSON.stringify(cookie ?? {});
createOrUpdateCookie(cookieNames.ISS_SESSION_INFO, cookieValueJson, {});
}
}
/*
Will update the cookie if present, or create a new one if not.
*/
export function updateOrCreateISSCookie() {
const store = useMainStore();
// Set up cookie with all the props.
setISSCookieProperties({
LastTouched: new Date().toUTCString(),
SavedSessionTimeoutDate: store.applicationUser.savedSessionTimeout,
ShouldResetState: false,
ReferralNumber: store.order.referralNumber,
ReferralDate: store.order.referralDate,
ReferralCorrelationId: store.order.referralCorrelationId,
ReferralParentAccountNumber: store.order.accountNumber
});
}
/*
Removes cookie from browser.
*/
@ -44,13 +127,6 @@ export function deleteISSCookie() {
createOrUpdateCookie(cookieNames.ISS_SESSION_INFO, undefined, { maxAge: 0 });
}
/*
Gets cookie domain value. Localhost will be empty "".
*/
export function getCookieDomainValue() {
return isLocalhost() ? '' : `domain=${getDomainWithoutSubdomain()};`;
}
/*
Gets value of dxdev cookie, and then extracts "did" value from it.
Returns empty string if cookie not found or "did" string not present.
@ -118,83 +194,3 @@ export function setCookieProperties(properties,
});
}
}
/*
===========================
= PRIVATE FUNCTIONS =
===========================
*/
/*
Used to set properties on the ISS cookie.
Takes an object with properties to set. Will overwrite existing properties.
*/
function setISSCookieProperties(properties) {
if (typeof properties === 'object') {
const cookie = getISSCookie();
if (cookie !== null) {
Object.keys(properties).forEach((key) => {
cookie[key] = properties[key];
});
}
const cookieValueJson = JSON.stringify(cookie ?? {});
createOrUpdateCookie(cookieNames.ISS_SESSION_INFO, cookieValueJson, {});
}
}
/*
Used to create a cookie.
`useDefaultISSCookieAttributes` will set the path and domain to our defaults
*/
function createOrUpdateCookie(key, value = '',
{ useDefaultISSCookieAttributes = true, maxAge, isSecure = true }) {
let cookieToAdd = `${key}=${value}; `;
if (useDefaultISSCookieAttributes) {
cookieToAdd += `path=${applicationConfig.COOKIE_PATH}; ${getCookieDomainValue()} `;
}
if (isSecure && !isLocalhost()) {
cookieToAdd += 'secure; ';
}
if (!Number.isNaN(maxAge)) {
cookieToAdd += `max-age=${maxAge};`;
}
document.cookie = cookieToAdd;
}
/*
Gets current domain without the subdomain for cookie.
*/
function getDomainWithoutSubdomain() {
const url = location.hostname;
if (isLocalhost()) {
return 'localhost';
}
const urlParts = url.split('.');
return `.${urlParts
.slice(0)
.slice(-(urlParts.length === 4 ? 3 : 2))
.join('.')}`;
}
/*
Gets cookie value by name, returns empty string if not found.
*/
function getCookieValueByName(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) {
return parts.pop().split(';').shift();
}
return '';
}
function isLocalhost() {
return location.hostname.includes('localhost');
}

View file

@ -44,6 +44,7 @@ function hasMatchingReplacementOption(vehicleDamageOptions, selectedGlassToRepla
Rear: 'backGlassOptions'
};
// eslint-disable-next-line no-restricted-syntax
for (const glassToReplace of selectedGlassToReplace) {
const propName = optionsMap[glassToReplace.glassLocation];
const { availableReplacementOptions } = vehicleDamageOptions[propName];

View file

@ -1,9 +1,9 @@
import { randomUUID } from 'crypto';
export function getRandomInt(min = 0, max = 1000) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min); // The maximum is exclusive and the minimum is inclusive
const minCeiling = Math.ceil(min);
const maxFloor = Math.floor(max);
return Math.floor(Math.random() * (maxFloor - minCeiling) + minCeiling); // The maximum is exclusive and the minimum is inclusive
}
export function getRandomGuid() {

View file

@ -25,6 +25,7 @@ describe('event-bus.js', () => {
it('removes items when readandpop is called', () => {
useMainStore().eventBusItem.mockReturnValueOnce(event);
// TODO: Use or remove
const eventValue = eventBus.readAndPopEventFromBus(globalEvents.Categories.GLOBAL_ALERT,
globalEvents.SubCategories.PAGE_NOT_FOUND);
@ -35,6 +36,7 @@ describe('event-bus.js', () => {
it("doesn't try to remove items when readandpop is called and item doesn't exist", () => {
useMainStore().eventBusItem.mockReturnValueOnce(undefined);
// TODO: Use or remove
const eventValue = eventBus.readAndPopEventFromBus(globalEvents.Categories.GLOBAL_ALERT,
globalEvents.SubCategories.PAGE_NOT_FOUND);

View file

@ -9,14 +9,10 @@ import { required, regex } from '@/helpers/validation-rules';
function defineGlobalNameRules() {
defineRule(globalRules.FIRST_NAME_REQUIRED, required(errorMessages.FIRST_NAME_REQUIRED));
defineRule(globalRules.LAST_NAME_REQUIRED, required(errorMessages.LAST_NAME_REQUIRED));
defineRule(
globalRules.POLICYHOLDER_FIRST_NAME_REQUIRED,
required(errorMessages.POLICYHOLDER_FIRST_NAME_REQUIRED)
);
defineRule(
globalRules.POLICYHOLDER_LAST_NAME_REQUIRED,
required(errorMessages.POLICYHOLDER_LAST_NAME_REQUIRED)
);
defineRule(globalRules.POLICYHOLDER_FIRST_NAME_REQUIRED,
required(errorMessages.POLICYHOLDER_FIRST_NAME_REQUIRED));
defineRule(globalRules.POLICYHOLDER_LAST_NAME_REQUIRED,
required(errorMessages.POLICYHOLDER_LAST_NAME_REQUIRED));
}
/**
@ -24,13 +20,9 @@ function defineGlobalNameRules() {
*/
function defineGlobalEmailRules() {
defineRule(globalRules.EMAIL_ADDRESS_REQUIRED, required(errorMessages.EMAIL_ADDRESS_REQUIRED));
defineRule(
globalRules.EMAIL_ADDRESS_FORMAT,
regex(
/^([a-zA-Z0-9_\-.+]+)@([a-zA-Z0-9_\-.]+)\.([a-zA-Z]{2,})$/,
errorMessages.EMAIL_ADDRESS_FORMAT
)
);
defineRule(globalRules.EMAIL_ADDRESS_FORMAT,
regex(/^([a-zA-Z0-9_\-.+]+)@([a-zA-Z0-9_\-.]+)\.([a-zA-Z]{2,})$/,
errorMessages.EMAIL_ADDRESS_FORMAT));
}
/**
@ -38,13 +30,9 @@ function defineGlobalEmailRules() {
*/
function defineGlobalPhoneNumberRules() {
defineRule(globalRules.PHONE_NUMBER_REQUIRED, required(errorMessages.PHONE_NUMBER_REQUIRED));
defineRule(
globalRules.PHONE_NUMBER_FORMAT,
regex(
/^(\([0-9]{3}\)|[0-9]{3}) *[-.]? *[0-9]{3} *[-.]? *[0-9]{4}$/,
errorMessages.PHONE_NUMBER_FORMAT
)
);
defineRule(globalRules.PHONE_NUMBER_FORMAT,
regex(/^(\([0-9]{3}\)|[0-9]{3}) *[-.]? *[0-9]{3} *[-.]? *[0-9]{4}$/,
errorMessages.PHONE_NUMBER_FORMAT));
}
/**

View file

@ -1,7 +1,8 @@
import { navigationScenarios } from '@/router/router-constants/navigation-scenarios.js';
import { RouterLinkStub } from '@vue/test-utils';
import { createTestingPinia } from '@pinia/testing';
import { navigationScenarios } from '@/router/router-constants/navigation-scenarios.js';
import vehicleCategories from '@/constants/vehicle-categories.js';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import cookieNames from '@/constants/cookie-names';
import { Form } from 'vee-validate';
import baseMixin from '@/mixins/base-mixin';
@ -13,7 +14,6 @@ import { GaActions } from '@/constants/analytics';
import queryStrings from '@/constants/query-strings';
import { useMainStore } from '@/store';
import { mapStores } from 'pinia';
import { createTestingPinia } from '@pinia/testing';
const pinia = createTestingPinia();
useMainStore(pinia);
@ -147,10 +147,6 @@ export function getMountOptions(mockData) {
return { global };
}
export function getMockOrderInfo(
mockReferralNumber,
mockCorrelationId,
@ -169,7 +165,4 @@ export function getMockOrderInfo(
};
}
*/
*/

View file

@ -49,7 +49,7 @@
<script>
import textLink from '@/ux-components/text-link/text-link.vue';
import buttonMain from '@/ux-components/button-main/button-main.vue';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
export default {
name: 'site-footer',

View file

@ -1,5 +1,5 @@
import { mount, shallowMount } from '@vue/test-utils';
import menuModal from './menu-modal';
import menuModal from '@/iss-components/site-header/menu-modal/menu-modal.vue';
describe('menu-modal.vue', () => {
it('Should return text Footer Navigation', async () => {

View file

@ -79,7 +79,7 @@
</template>
<script>
import textLink from '@/ux-components/text-link/text-link';
import textLink from '@/ux-components/text-link/text-link.vue';
import { Modal } from 'bootstrap';
export default {

View file

@ -1,4 +1,4 @@
import siteHeader from '@/iss-components/site-header/site-header';
import siteHeader from '@/iss-components/site-header/site-header.vue';
import { shallowMount } from '@vue/test-utils';
import { getMountOptions } from '@/helpers/unit-test-helper.js';
@ -13,7 +13,7 @@ function setupMocks({
describe('site-header', () => {
test('renders the logo image', () => {
const wrapper = setupMocks({mountOptionsMockData: {} });
const wrapper = setupMocks({ mountOptionsMockData: {} });
expect(wrapper.find('img')).toBeTruthy();
wrapper.unmount();

View file

@ -22,8 +22,8 @@
</template>
<script>
import menuModal from '@/iss-components/site-header/menu-modal/menu-modal';
import alert from '@/ux-components/alert/alert';
import menuModal from '@/iss-components/site-header/menu-modal/menu-modal.vue';
import alert from '@/ux-components/alert/alert.vue';
import eventBus from '@/helpers/event-bus/event-bus';
import { globalEvents } from '@/constants/events';

View file

@ -1,5 +1,5 @@
import { shallowMount } from '@vue/test-utils';
import buttonBack from './button-back';
import buttonBack from '@/iss-components/site-sub-header/button-back/button-back.vue';
describe('back button', () => {
test('renders a button', () => {

View file

@ -1,4 +1,4 @@
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header';
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
import { shallowMount } from '@vue/test-utils';
// Mock cms helpers

View file

@ -2,20 +2,24 @@
<div>
<div
class="subheader-primary d-flex align-items-center justify-content-center container-fluid overflow-hidden">
<h5 class="text-center fw-normal mb-0 subheader-primary" :class="headerColor">
<h5
class="text-center fw-normal mb-0 subheader-primary"
:class="headerColor">
<span>
{{ content }}
</span>
<buttonBack
v-if="hasBackButton"
:backButtonAccessibleText="backButtonAccessibleText"
@click-event="clickEvent" />
@clickEvent="clickEvent" />
</h5>
</div>
<div
class="subheader-secondary d-flex align-items-center container-fluid overflow-hidden"
:class="justifySubheader">
<p class="fw-normal mb-0" :class="alternateFormatting">
<p
class="fw-normal mb-0"
:class="alternateFormatting">
<span v-html="subText"> </span>
</p>
</div>
@ -23,7 +27,7 @@
</template>
<script>
import buttonBack from '@/iss-components/site-sub-header/button-back/button-back';
import buttonBack from '@/iss-components/site-sub-header/button-back/button-back.vue';
import {
doesCopyContainRouterLink,
splitCopyOnCMSPlaceHolder,
@ -53,10 +57,8 @@ export default {
return this.getCmsContent(this.cmsWidgetName, this.contentProperty ?? 'SubHeaderText');
},
subText() {
let subTextFromCms = this.getCmsContent(
this.cmsWidgetName,
this.subContentProperty ?? 'SecondaryText'
);
let subTextFromCms = this.getCmsContent(this.cmsWidgetName,
this.subContentProperty ?? 'SecondaryText');
if (this.stripRteStyle) {
subTextFromCms = stripRteStyle(subTextFromCms);
@ -66,9 +68,9 @@ export default {
if (this.doesCopyContainRouterLink(subTextFromCms)) {
splitCopyOnCMSPlaceHolder(subTextFromCms).forEach((sc) => {
if (this.doesCopyContainRouterLink(sc)) {
subText = subText + getRouterLinkHtmlStringFromCopy(sc);
subText += getRouterLinkHtmlStringFromCopy(sc);
} else {
subText = subText + sc;
subText += sc;
}
});
} else {

View file

@ -1,8 +1,8 @@
import { shallowMount } from '@vue/test-utils';
import App from '@/App';
import App from '@/App.vue';
import { createPinia } from 'pinia';
import { createApp } from 'vue';
import steeringTextModal from './steering-text';
import steeringTextModal from '@/iss-components/steering-text/steering-text.vue';
const mockCmsContent = {
BodyText: 'MASteeringText'

View file

@ -67,7 +67,7 @@
// Import Supporting Files
import { settleAllPromises } from '@/helpers/layout-helper';
import { useMainStore } from '@/store';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import errorMessages from '@/constants/error-messages';
import { required } from '@/helpers/validation-rules';
import { Form, defineRule } from 'vee-validate';

View file

@ -11,11 +11,11 @@
</template>
<script>
// Components
import siteHeader from '@/iss-components/site-header/site-header';
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header';
import siteHeader from '@/iss-components/site-header/site-header.vue';
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
// Supporting files
import { fetchCmsContentForPage } from '@/helpers/cms-content-helper';
import { issPageValues } from '@/router/router-constants/issPage-values.js';
import issPageValues from '@/router/router-constants/issPage-values.js';
import { settleAllPromises } from '@/helpers/layout-helper';
import { useMainStore } from '@/store';

View file

@ -25,12 +25,12 @@ import { settleAllPromises } from '@/helpers/layout-helper';
// Import Component
import baseFormMixin from '@/mixins/base-form-mixin';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import { Form } from 'vee-validate';
import { useMainStore } from '@/store';
import globalRules from '@/constants/global-rules';
import vehicleQuestionsMixin from '@/mixins/vehicle-questions-mixin';
import questionsPageLayout from '@/iss-components/questions-page-layout/questions-page-layout';
import questionsPageLayout from '@/iss-components/questions-page-layout/questions-page-layout.vue';
export default {
name: 'capability-questions',

View file

@ -8,7 +8,7 @@
<script>
// Supporting files
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import validateISSClientTag from '@/helpers/clientauth-helper';
import { useMainStore } from '@/store';

View file

@ -26,12 +26,12 @@ import { settleAllPromises } from '@/helpers/layout-helper';
import globalRules from '@/constants/global-rules';
import vehicleQuestionsMixin from '@/mixins/vehicle-questions-mixin';
import { useMainStore } from '@/store';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import BaseFormMixin from '@/mixins/base-form-mixin.js';
// Import Component
import { Form } from 'vee-validate';
import questionsPageLayout from '@/iss-components/questions-page-layout/questions-page-layout';
import questionsPageLayout from '@/iss-components/questions-page-layout/questions-page-layout.vue';
export default {
name: 'molding-questions',

View file

@ -20,13 +20,13 @@
<script>
// Components
import questionsPageLayout from '@/iss-components/questions-page-layout/questions-page-layout';
import questionsPageLayout from '@/iss-components/questions-page-layout/questions-page-layout.vue';
// Supporting Files
import { fetchCmsContentForPage } from '@/helpers/cms-content-helper';
import { settleAllPromises } from '@/helpers/layout-helper';
import { useMainStore } from '@/store';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import { Form } from 'vee-validate';
import vehicleQuestionsMixin from '@/mixins/vehicle-questions-mixin';
import BaseFormMixin from '@/mixins/base-form-mixin.js';
@ -35,6 +35,7 @@ import globalRules from '@/constants/global-rules';
export default {
name: 'part-questions',
components: {
// eslint-disable-next-line vue/no-reserved-component-names
Form,
questionsPageLayout
},

View file

@ -1,4 +1,4 @@
import policyVehicles from '@/layouts/policy-vehicles/policy-vehicles';
import policyVehicles from '@/layouts/policy-vehicles/policy-vehicles.vue';
import { settleAllPromises } from '@/helpers/layout-helper';
import { shallowMount } from '@vue/test-utils';
import { getMountOptions } from '@/helpers/unit-test-helper';
@ -9,7 +9,7 @@ import baseMixin from '@/mixins/base-mixin';
import { getRandomString, getRandomInt } from '@/helpers/data-generation';
import endorsementOptions from '@/constants/endorsement-options';
import { createTestingPinia } from '@pinia/testing';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import vehicleSelectionOptions from '@/constants/vehicle-selection-options';
// Mock fetchCmsContentForPage

View file

@ -41,15 +41,15 @@
</template>
<script>
// Components
import siteHeader from '@/iss-components/site-header/site-header';
import siteFooter from '@/iss-components/site-footer/site-footer';
import vehicleBanner from '@/iss-components/vehicle-banner/vehicle-banner';
import policyVehiclesQuestion from '@/layouts/policy-vehicles/policy-vehicles-question/policy-vehicles-question';
import siteHeader from '@/iss-components/site-header/site-header.vue';
import siteFooter from '@/iss-components/site-footer/site-footer.vue';
import vehicleBanner from '@/iss-components/vehicle-banner/vehicle-banner.vue';
import policyVehiclesQuestion from '@/layouts/policy-vehicles/policy-vehicles-question/policy-vehicles-question.vue';
// Supporting files
import { fetchCmsContentForPage } from '@/helpers/cms-content-helper.js';
import { Form } from 'vee-validate';
import BaseFormMixin from '@/mixins/base-form-mixin.js';
import { issPageValues } from '@/router/router-constants/issPage-values.js';
import issPageValues from '@/router/router-constants/issPage-values.js';
import vehicleSelectionOptions from '@/constants/vehicle-selection-options.js';
import endorsementOptions from '@/constants/endorsement-options.js';
import globalRules from '@/constants/global-rules.js';

View file

@ -54,19 +54,19 @@
import { fetchCmsContentForPage, setupModalLinks } from '@/helpers/cms-content-helper';
import { settleAllPromises } from '@/helpers/layout-helper';
import errorMessages from '@/constants/error-messages';
import buttonQuestion from '@/digital-components/button-question/button-question';
import { issPageValues } from '@/router/router-constants/issPage-values';
import buttonQuestion from '@/digital-components/button-question/button-question.vue';
import issPageValues from '@/router/router-constants/issPage-values';
// Import Component
import baseFormMixin from '@/mixins/base-form-mixin';
import { Form } from 'vee-validate';
import siteFooter from '@/iss-components/site-footer/site-footer';
import siteHeader from '@/iss-components/site-header/site-header';
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header';
import recalModal from '@/layouts/coverage-statement/recal-modal/recal-modal';
import steeringModal from '@/layouts/provider-preference/steering-modal/steering-modal';
import shopPreferenceModal from '@/layouts/provider-preference/shop-preference-modal/shop-preference-modal';
import tpaRecalModal from '@/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal';
import siteFooter from '@/iss-components/site-footer/site-footer.vue';
import siteHeader from '@/iss-components/site-header/site-header.vue';
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
import recalModal from '@/layouts/coverage-statement/recal-modal/recal-modal.vue';
import steeringModal from '@/layouts/provider-preference/steering-modal/steering-modal.vue';
import shopPreferenceModal from '@/layouts/provider-preference/shop-preference-modal/shop-preference-modal.vue';
import tpaRecalModal from '@/layouts/provider-preference/tpa-recal-modal/tpa-recal-modal.vue';
import globalRules from '@/constants/global-rules';
const options = { SAFELITE: 'SafeliteOption', TPA: 'TPAOption' };

View file

@ -1,10 +1,10 @@
/* eslint-env jest */
import { render } from '@testing-library/vue';
import userEvent from '@testing-library/user-event';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import queryStrings from '@/constants/query-strings';
import { GaActions } from '@/constants/analytics';
import tpaRecalToggle from './tpa-recal-toggle';
import tpaRecalToggle from '@/layouts/provider-preference/tpa-recal-modal/tpa-recal-toggle/tpa-recal-toggle.vue';
const mockText = Object.freeze({
HEADER: 'Mock Header',

View file

@ -63,17 +63,17 @@
<script>
// Components
import glassPartQuestion from '@/layouts/vehicle-parts/glass-part-question/glass-part-question';
import siteHeader from '@/iss-components/site-header/site-header';
import vehicleBanner from '@/iss-components/vehicle-banner/vehicle-banner';
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header';
import siteFooter from '@/iss-components/site-footer/site-footer';
import alert from '@/ux-components/alert/alert';
import glassPartQuestion from '@/layouts/vehicle-parts/glass-part-question/glass-part-question.vue';
import siteHeader from '@/iss-components/site-header/site-header.vue';
import vehicleBanner from '@/iss-components/vehicle-banner/vehicle-banner.vue';
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
import siteFooter from '@/iss-components/site-footer/site-footer.vue';
import alert from '@/ux-components/alert/alert.vue';
// Supporting Files
import { fetchCmsContentForPage } from '@/helpers/cms-content-helper';
import { settleAllPromises } from '@/helpers/layout-helper';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import { Form } from 'vee-validate';
import vehicleQuestionsMixin from '@/mixins/vehicle-questions-mixin';
import BaseFormMixin from '@/mixins/base-form-mixin.js';
@ -130,6 +130,7 @@ export default {
selectedGlassPartNumbers() {
// Compile all selected parts from the page.
const numberArray = [];
// eslint-disable-next-line no-restricted-syntax
for (const glassPart of Object.values(this.selectedGlassParts)) {
if (glassPart?.partNumber) {
numberArray.push(glassPart.partNumber);

View file

@ -2,10 +2,10 @@
import { render } from '@testing-library/vue';
import userEvent from '@testing-library/user-event';
import '@testing-library/jest-dom';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import queryStrings from '@/constants/query-strings';
import { GaActions } from '@/constants/analytics';
import VinLocationInformationComponent from '@/layouts/vin-lookup/vin-location-information/vin-location-information';
import VinLocationInformationComponent from '@/layouts/vin-lookup/vin-location-information/vin-location-information.vue';
const mockText = Object.freeze({
HEADER: 'Mock Header',

View file

@ -5,13 +5,13 @@ import { render, waitFor } from '@testing-library/vue';
import { createTestingPinia } from '@pinia/testing';
import userEvent from '@testing-library/user-event';
import errorMessages from '@/constants/error-messages';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import queryStrings from '@/constants/query-strings';
import { GaActions } from '@/constants/analytics';
import { navigationScenarios } from '@/router/router-constants/navigation-scenarios';
import { routerParams } from '@/router/router-params';
import { useMainStore } from '@/store';
import VinLookupComponent from '@/layouts/vin-lookup/vin-lookup';
import VinLookupComponent from '@/layouts/vin-lookup/vin-lookup.vue';
const continueButtonQuerySelector = '[data-test-id="site-footer-main-button"]';
const errorMessageWrapperElSelector = '#vin-question-wrapper .form-test-error';

View file

@ -1,4 +1,4 @@
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import { navigationScenarios } from '@/router/router-constants/navigation-scenarios';
import { useMainStore } from '@/store';

View file

@ -1,7 +1,7 @@
import vehicleQuestionsMixin from '@/mixins/vehicle-questions-mixin';
import { shallowMount } from '@vue/test-utils';
import { setupMocksForJsFiles, getMountOptions } from '@/helpers/unit-test-helper.js';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import { navigationScenarios } from '@/router/router-constants/navigation-scenarios';
import { useMainStore } from '@/store';

View file

@ -1,6 +1,6 @@
import { createWebHistory, createRouter } from 'vue-router';
import { lazyLoadComponent } from '@/router/dynamic-routing/component-loader';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import { routingTable } from '@/router/router-constants/routing-table';
import { useMainStore } from '@/store';
import eventBus from '@/helpers/event-bus/event-bus';

View file

@ -1,4 +1,4 @@
export const issPageValues = {
const issPageValues = Object.freeze({
ENTRY_PAGE: 'entry-page',
WELCOME_PAGE: 'welcome-page',
@ -31,4 +31,6 @@ export const issPageValues = {
TPA_SUBMIT: 'tpa-submit',
TPA_SEARCH: 'tpa-search',
POLICY_VEHICLES: 'policy-vehicles'
};
});
export default issPageValues;

View file

@ -1,4 +1,4 @@
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import { navigationScenarios } from '@/router/router-constants/navigation-scenarios';
// Get store from router/index.js instead of importing it here to get updated values

View file

@ -1,6 +1,6 @@
import router from '@/router/';
import { navigationScenarios } from '@/router/router-constants/navigation-scenarios';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from '@/App.vue';

View file

@ -7,7 +7,7 @@ import { getDateForSavedSessionTimeout } from '@/helpers/session-helper';
import globalMethods from '@/global-methods';
import { experimentTriggers } from '@/constants/experiments';
import applicationConfig from '@/constants/application-config';
import { issPageValues } from '@/router/router-constants/issPage-values';
import issPageValues from '@/router/router-constants/issPage-values';
import damageLocationsSelected from '@/constants/damage-locations-selected';
import coverageStatuses from '@/constants/coverage-statuses';

View file

@ -1,7 +1,51 @@
/* eslint-disable max-len */
import { shallowMount, RouterLinkStub } from '@vue/test-utils';
import { getMountOptions } from '@/helpers/unit-test-helper.js';
import alert from './alert';
import alert from '@/ux-components/alert/alert.vue';
const mockMixin = {
methods: {
getCmsContent: jest.fn(),
getFooterInfoBoxHeight: jest.fn(() => 50)
},
computed: {
dynamicStrings: jest.fn(() => ({ ROUTER_LINK: 'routerLink:' })),
cssClassNameForCmsWidget() {
return 'widget-name-';
}
}
};
/** @ignore */
function setUpViewPort(height) {
Object.defineProperty(global.window, 'innerHeight', {
writable: true,
configurable: true,
value: height
});
Object.defineProperty(window.document.documentElement, 'clientHeight', {
writable: true,
configurable: true,
value: height
});
}
/** @ignore */
function setupMocks(mountOptionsMockData = {}) {
const defaultMountOptions = {
propsData: {
manualHeadline: 'testHeader',
manualCopy: 'testCopy',
cmsWidgetName: 'alert'
},
mixins: [mockMixin]
};
const baseMountOptions = getMountOptions(Object.assign(defaultMountOptions, mountOptionsMockData));
const allMountOptions = Object.assign(defaultMountOptions, baseMountOptions);
return allMountOptions;
}
describe('alert.vue', () => {
it("Should add class 'alert-dismissible' if isDismissible is true", async () => {
@ -88,7 +132,7 @@ describe('alert.vue', () => {
Element.prototype.scrollIntoView = mockScrollIntoView;
// Act
const wrapper = shallowMount(alert, setupMocks({}));
shallowMount(alert, setupMocks({}));
// Assert
// This is an implementation detail - we just need to test that the final step of snapping
@ -108,7 +152,7 @@ describe('alert.vue', () => {
Element.prototype.scrollIntoView = mockScrollIntoView;
// Act
const wrapper = shallowMount(alert, setupMocks({}));
shallowMount(alert, setupMocks({}));
// Assert
// This is an implementation detail - we just need to test that the final step of snapping
@ -128,7 +172,7 @@ describe('alert.vue', () => {
Element.prototype.scrollIntoView = mockScrollIntoView;
// Act
const wrapper = shallowMount(alert,
shallowMount(alert,
setupMocks({
propsData: {
shouldScrollToOnMount: false,
@ -156,7 +200,7 @@ describe('alert.vue', () => {
Element.prototype.scrollIntoView = mockScrollIntoView;
// Act
const wrapper = shallowMount(alert, setupMocks({}));
shallowMount(alert, setupMocks({}));
// Assert
// This is an implementation detail - we just need to test that the final step of snapping
@ -165,52 +209,3 @@ describe('alert.vue', () => {
expect(mockScrollIntoView).not.toHaveBeenCalled();
});
});
const mockMixin = {
methods: {
getCmsContent: jest.fn(),
getFooterInfoBoxHeight: jest.fn(() => 50)
},
computed: {
dynamicStrings: jest.fn(() => ({ ROUTER_LINK: 'routerLink:' })),
cssClassNameForCmsWidget() {
return 'widget-name-';
}
}
};
/**
*
* @param height
*/
function setUpViewPort(height) {
Object.defineProperty(global.window, 'innerHeight', {
writable: true,
configurable: true,
value: height
});
Object.defineProperty(window.document.documentElement, 'clientHeight', {
writable: true,
configurable: true,
value: height
});
}
/**
*
* @param mountOptionsMockData
*/
function setupMocks(mountOptionsMockData = {}) {
const defaultMountOptions = {
propsData: {
manualHeadline: 'testHeader',
manualCopy: 'testCopy',
cmsWidgetName: 'alert'
},
mixins: [mockMixin]
};
const baseMountOptions = getMountOptions(Object.assign(defaultMountOptions, mountOptionsMockData));
const allMountOptions = Object.assign(defaultMountOptions, baseMountOptions);
return allMountOptions;
}

View file

@ -78,7 +78,7 @@ export default {
type: String,
default(rawProps) {
if (!rawProps.cmsWidgetName) {
console.log('Error: Missing a CMS Widget Name (required field)');
window.console.log('Error: Missing a CMS Widget Name (required field)');
}
return 'widgetUndefined';
}

View file

@ -1,7 +1,16 @@
import { shallowMount } from '@vue/test-utils';
import { getMountOptions } from '@/helpers/unit-test-helper.js';
import { nextTick } from 'vue';
import buttonMain from './button-main';
import buttonMain from '@/ux-components/button-main/button-main.vue';
/** @ignore */
function setupMocks(mountOptionsMockData = {}) {
const defaultMountOptions = { route: { query: { issPage: 'page-name' } } };
const baseMountOptions = getMountOptions(Object.assign(defaultMountOptions, mountOptionsMockData));
const allMountOptions = Object.assign(defaultMountOptions, baseMountOptions);
return allMountOptions;
}
describe('buttonMain.vue', () => {
it('Should return btn-primary class', async () => {
@ -48,8 +57,6 @@ describe('buttonMain.vue', () => {
// Assert
const label = wrapper.find('label');
wrapper.vm.clicked();
await nextTick();
@ -71,8 +78,6 @@ describe('buttonMain.vue', () => {
// Assert
const label = wrapper.find('label');
wrapper.vm.clicked();
await nextTick();
@ -82,15 +87,3 @@ describe('buttonMain.vue', () => {
expect(loader.attributes('class')).toContain('right');
});
});
/**
*
* @param mountOptionsMockData
*/
function setupMocks(mountOptionsMockData = {}) {
const defaultMountOptions = { route: { query: { issPage: 'page-name' } } };
const baseMountOptions = getMountOptions(Object.assign(defaultMountOptions, mountOptionsMockData));
const allMountOptions = Object.assign(defaultMountOptions, baseMountOptions);
return allMountOptions;
}

View file

@ -17,7 +17,7 @@
</template>
<script>
import loader from '@/ux-components/loader/loader';
import loader from '@/ux-components/loader/loader.vue';
export default {
name: 'button-main',

View file

@ -1,5 +1,5 @@
import { shallowMount } from '@vue/test-utils';
import checkbox from './checkbox';
import checkbox from '@/ux-components/checkbox/checkbox.vue';
describe('checkbox.vue', () => {
it('Should return checkbox name', async () => {

View file

@ -1,6 +1,22 @@
import { mount } from '@vue/test-utils';
import inputButtonWrapperMixin from '@/mixins/input-button-wrapper-mixin';
import listButtonHorizontal from './list-button-horizontal';
import listButtonHorizontal from '@/ux-components/list-button-horizontal/list-button-horizontal.vue';
/** @ignore */
function setupMocks({ mockData }) {
const wrapper = mount(listButtonHorizontal, {
...mockData,
propsData: {
...mockData.propsData,
groupName: 'my-group',
modelValue: mockData.propsData?.isMultiSelect ? ['5'] : '5',
value: mockData.propsData?.isMultiSelect ? ['4'] : '4'
},
mixins: [inputButtonWrapperMixin]
});
return { wrapper };
}
describe('list-button-horizontal.vue', () => {
describe('styling/UI', () => {
@ -122,23 +138,3 @@ describe('list-button-horizontal.vue', () => {
});
});
});
/**
*
* @param root0
* @param root0.mockData
*/
function setupMocks({ mockData }) {
const wrapper = mount(listButtonHorizontal, {
...mockData,
propsData: {
...mockData.propsData,
groupName: 'my-group',
modelValue: mockData.propsData?.isMultiSelect ? ['5'] : '5',
value: mockData.propsData?.isMultiSelect ? ['4'] : '4'
},
mixins: [inputButtonWrapperMixin]
});
return { wrapper };
}

View file

@ -29,7 +29,7 @@
</template>
<script>
import baseInputButton from '@/digital-components/base-input-button/base-input-button';
import baseInputButton from '@/digital-components/base-input-button/base-input-button.vue';
import inputButtonWrapperMixin from '@/mixins/input-button-wrapper-mixin';
export default {

View file

@ -1,7 +1,17 @@
import { mount } from '@vue/test-utils';
import { GaActions } from '@/constants/analytics';
import inputButtonWrapperMixin from '@/mixins/input-button-wrapper-mixin';
import listButton from './list-button';
import listButton from '@/ux-components/list-button/list-button.vue';
/** @ignore */
function setupMocks({ mockData }) {
const wrapper = mount(listButton, {
...mockData,
mixins: [inputButtonWrapperMixin]
});
return { wrapper };
}
describe('list-button.vue', () => {
describe('loader', () => {
@ -293,17 +303,3 @@ describe('list-button.vue', () => {
});
});
});
/**
*
* @param root0
* @param root0.mockData
*/
function setupMocks({ mockData }) {
const wrapper = mount(listButton, {
...mockData,
mixins: [inputButtonWrapperMixin]
});
return { wrapper };
}

View file

@ -30,8 +30,8 @@
</template>
<script>
import loader from '@/ux-components/loader/loader';
import baseInputButton from '@/digital-components/base-input-button/base-input-button';
import loader from '@/ux-components/loader/loader.vue';
import baseInputButton from '@/digital-components/base-input-button/base-input-button.vue';
import inputButtonWrapperMixin from '@/mixins/input-button-wrapper-mixin';
export default {

View file

@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils';
import listCard from './list-card';
import listCard from '@/ux-components/list-card/list-card.vue';
describe('list-card.vue', () => {
it('Should return input type checkbox if isMultiSelect is true', () => {

View file

@ -42,7 +42,7 @@
</template>
<script>
import baseInputButton from '@/digital-components/base-input-button/base-input-button';
import baseInputButton from '@/digital-components/base-input-button/base-input-button.vue';
import inputButtonWrapperMixin from '@/mixins/input-button-wrapper-mixin';
export default {

View file

@ -1,7 +1,16 @@
import { shallowMount } from '@vue/test-utils';
import { getMountOptions } from '@/helpers/unit-test-helper.js';
import { nextTick } from 'vue';
import modalButtonMain from './modal-button-main';
import modalButtonMain from '@/ux-components/modal-button-main/modal-button-main.vue';
/** @ignore */
function setupMocks(mountOptionsMockData = {}) {
const defaultMountOptions = { route: { query: { issPage: 'page-name' } } };
const baseMountOptions = getMountOptions(Object.assign(defaultMountOptions, mountOptionsMockData));
const allMountOptions = Object.assign(defaultMountOptions, baseMountOptions);
return allMountOptions;
}
describe('modal-button-main.vue', () => {
it('Should return btn-primary class', () => {
@ -90,7 +99,6 @@ describe('modal-button-main.vue', () => {
await nextTick();
// Assert
const loader = wrapper.find('loader-stub');
expect(wrapper.vm.isLoaderDisplayed).toBe(false);
});
@ -160,15 +168,3 @@ describe('modal-button-main.vue', () => {
expect(wrapper.emitted('click-event')).toBeFalsy();
});
});
/**
*
* @param mountOptionsMockData
*/
function setupMocks(mountOptionsMockData = {}) {
const defaultMountOptions = { route: { query: { issPage: 'page-name' } } };
const baseMountOptions = getMountOptions(Object.assign(defaultMountOptions, mountOptionsMockData));
const allMountOptions = Object.assign(defaultMountOptions, baseMountOptions);
return allMountOptions;
}

View file

@ -18,7 +18,7 @@
</template>
<script>
import loader from '@/ux-components/loader/loader';
import loader from '@/ux-components/loader/loader.vue';
export default {
name: 'modal-button-main',

View file

@ -1,5 +1,5 @@
import { shallowMount } from '@vue/test-utils';
import radio from './radio';
import radio from '@/ux-components/radio/radio.vue';
describe('radio.vue', () => {
it('Should return group name', async () => {

View file

@ -1,5 +1,5 @@
import { shallowMount } from '@vue/test-utils';
import textLink from './text-link';
import textLink from '@/ux-components/text-link/text-link.vue';
describe('text-link.vue', () => {
it('Should return class navigation-link', async () => {