DigitalConsumer.ISS/src/layouts/coverage-statement/coverage-statement.spec.js

906 lines
30 KiB
JavaScript

// Components
import coverageStatement from '@/layouts/coverage-statement/coverage-statement.vue';
// Supporting Files
import { nextTick } from 'vue';
import { mount } from '@vue/test-utils';
import { getMountOptions } from '@/helpers/unit-test-helper.js';
import { createTestingPinia } from '@pinia/testing';
import navigationScenarios from '@/router/router-constants/navigation-scenarios.js';
import { getRandomString, getRandomInt } from '@/helpers/data-generation.js';
import settleAllPromises from '@/helpers/layout-helper.js';
import { fetchCmsContentForPage } from '@/helpers/cms-content-helper';
import routerParams from '@/router/router-constants/router-params';
import { useMainStore } from '@/store/index.js';
jest.mock('@/helpers/layout-helper.js', () => jest.fn());
jest.mock('@/helpers/cms-content-helper', () => ({
fetchCmsContentForPage: jest.fn(),
setupModalLinks: jest.fn(),
processIfStatements: jest.fn()
}));
const mockMixin = {
methods: {
getCmsContent: jest.fn().mockImplementation(() => ''),
setCmsContent: jest.fn()
}
};
const footerStub = {
render: () => {},
methods: {
updateButtonText: jest.fn()
}
};
const loadingModalStub = {
render: () => {},
methods: {
showModal: jest.fn(),
hideModal: jest.fn()
}
};
function getMountedComponent(mainInitialState = {}, initialData = {}, methodToRun = () => {}) {
const mountOptions = getMountOptions({
router: {
navigate: jest.fn()
}
});
mountOptions.global.stubs = {
siteFooter: footerStub,
siteHeader: true,
recalModal: true,
contentGroupModal: true,
alert: true,
loadingModal: loadingModalStub
};
const testingPinia = createTestingPinia({
initialState: {
main: mainInitialState
}
});
useMainStore(testingPinia);
methodToRun();
mountOptions.global.plugins = [testingPinia];
mountOptions.mixins = [mockMixin];
mountOptions.data = () => (
initialData
);
const apiResponses = {
supportingItems: []
};
const apiPromise = Promise.resolve(apiResponses);
settleAllPromises.mockImplementation(() => apiPromise);
fetchCmsContentForPage.mockImplementation(() => Promise.resolve());
const wrapper = mount(coverageStatement, mountOptions);
return { wrapper };
}
describe.skip('coverageStatement.vue', () => {
describe('method arePagePrerequisitesValid...', () => {
test('Should return true for valid page requisites if vin exists', () => {
// Arrange
const { wrapper } = getMountedComponent({
order: {
vehicle: {
vin: getRandomString(5, 20)
}
}
});
// Act
const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid();
// Assert
expect(arePagePrerequisitesValid).toBeTruthy();
});
test('Should return false for valid page requisites if vin is missing', () => {
// Arrange
const { wrapper } = getMountedComponent({
order: {
vehicle: {
vin: null
}
}
});
// Act
const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid();
// Assert
expect(arePagePrerequisitesValid).not.toBeTruthy();
});
});
describe('Rendering', () => {
test('Should render site header', () => {
// Arrange
const { wrapper } = getMountedComponent({});
// Act
const siteHeader = wrapper.findComponent({ ref: 'siteHeader' });
// Assert
expect(siteHeader.exists()).toBe(true);
});
test('Should render site subheader', () => {
// Arrange
const { wrapper } = getMountedComponent({});
// Act
const subheader = wrapper.find({ ref: 'siteSubHeader' });
// Assert
expect(subheader.exists()).toBe(true);
});
test('Should render explanatory text', () => {
// Arrange
const { wrapper } = getMountedComponent({});
// Act
const explanatoryText = wrapper.find({ ref: 'explanatoryText' });
// Assert
expect(explanatoryText.exists()).toBe(true);
});
test('Should render secondary text', () => {
// Arrange
const { wrapper } = getMountedComponent({});
// Act
const secondaryText = wrapper.find({ ref: 'secondaryText' });
// Assert
expect(secondaryText.exists()).toBe(true);
});
test('Should render site footer', () => {
// Arrange
const { wrapper } = getMountedComponent({});
// Act
const footer = wrapper.findComponent({ ref: 'siteFooter' });
// Assert
expect(footer.exists()).toBe(true);
});
});
describe('Verified ITAC scenario', () => {
test('If policy lookup successful, not No Comp, and deductible > service price, verifiedITAC returns true', () => {
// Arrange
const sellingPrice = getRandomInt(100, 500);
const deductible = sellingPrice + 1;
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: false,
deductible: {
repair: deductible
},
policyLookupSuccessful: true
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
wrapper.setData({
availableLineItems: [
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
]
});
// Assert
expect(wrapper.vm.verifiedITAC).toBeTruthy();
});
test('If policy lookup unsuccessful, verifiedITAC returns false', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
policyLookupSuccessful: false
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.verifiedITAC).toBeFalsy();
});
test('If No Comp, verifiedITAC returns false', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: true
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.verifiedITAC).toBeFalsy();
});
test('If deductible < service price, verifiedITAC returns false', () => {
// Arrange
const sellingPrice = getRandomInt(100, 500);
const deductible = sellingPrice - 1;
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: false,
deductible: {
repair: deductible
}
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
wrapper.setData({
availableLineItems: [
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
]
});
// Assert
expect(wrapper.vm.verifiedITAC).toBeFalsy();
});
});
describe('Verified Deductible scenario', () => {
test('If policy lookup successful, not No Comp, and service price > deductible, verifiedITAC returns true', () => {
// Arrange
const sellingPrice = getRandomInt(100, 500);
const deductible = sellingPrice - 1;
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: false,
deductible: {
repair: deductible
},
policyLookupSuccessful: true
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
wrapper.setData({
availableLineItems: [
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
]
});
// Assert
expect(wrapper.vm.verifiedDeductible).toBeTruthy();
});
test('If policy lookup unsuccessful, verifiedDeductible returns false', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
policyLookupSuccessful: false
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.verifiedDeductible).toBeFalsy();
});
test('If No Comp, verifiedDeductible returns false', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: true
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.verifiedDeductible).toBeFalsy();
});
test('If service price < deductible, verifiedDeductible returns false', () => {
const sellingPrice = getRandomInt(100, 500);
const deductible = sellingPrice + 1;
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: false,
deductible: {
repair: deductible
}
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
wrapper.setData({
availableLineItems: [
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
]
});
// Assert
expect(wrapper.vm.verifiedDeductible).toBeFalsy();
});
test('If deductible is null, verifiedDeductible returns false', () => {
const sellingPrice = getRandomInt(100, 500);
const deductible = null;
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: false,
deductible: {
repair: deductible
}
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
wrapper.setData({
availableLineItems: [
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
]
});
// Assert
expect(wrapper.vm.verifiedDeductible).toBeFalsy();
});
});
describe('No Comp scenario', () => {
test('If noCoverage = true, verifiedNoComp returns true', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: true,
policyLookupSuccessful: true
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.verifiedNoComp).toBeTruthy();
});
test('If noCoverage = false, verifiedNoComp returns false', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: false
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.verifiedNoComp).toBeFalsy();
});
});
describe('Unverified scenario', () => {
test('If policyLookupSuccessful false, unverified returns true', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
policyLookupSuccessful: false
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.unverified).toBeTruthy();
});
test('If policyLookupSuccessful is true, unverified returns false', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
policyLookupSuccessful: true
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.unverified).toBeFalsy();
});
});
describe('Navigation', () => {
test('If Unverified, navigate forward with CLICKED_FORWARD scenario', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
policyLookupSuccessful: false
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Act
wrapper.vm.forwardButtonAction();
// Assert
expect(wrapper.vm.$router.navigate)
.toHaveBeenCalledWith(
navigationScenarios.CLICKED_FORWARD,
undefined,
{},
{ [routerParams.SAVE_SESSION_SYNCHRONOUS]: true }
);
});
test('If Verified Deductible, navigate forward with CLICKED_FORWARD scenario', () => {
// Arrange
const sellingPrice = getRandomInt(100, 500);
const deductible = sellingPrice - 1;
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: false,
deductible: {
repair: deductible
},
policyLookupSuccessful: true
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
wrapper.setData({
availableLineItems: [
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
]
});
// Act
wrapper.vm.forwardButtonAction();
// Assert
expect(wrapper.vm.$router.navigate)
.toHaveBeenCalledWith(
navigationScenarios.CLICKED_FORWARD,
undefined,
{},
{ [routerParams.SAVE_SESSION_SYNCHRONOUS]: true }
);
});
test('If Verified ITAC and selected Safelite, navigate forward with CLICKED_FORWARD_WITH_SAFELITE scenario', () => {
// Arrange
const sellingPrice = getRandomInt(100, 500);
const deductible = sellingPrice + 1;
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: false,
deductible: {
repair: deductible
},
policyLookupSuccessful: true
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
wrapper.setData({
availableLineItems: [
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
],
selectedProvider: 'Safelite'
});
// Act
wrapper.vm.forwardButtonAction();
// Assert
expect(wrapper.vm.$router.navigate)
.toHaveBeenCalledWith(
navigationScenarios.CLICKED_FORWARD_WITH_SAFELITE,
undefined,
{},
{ [routerParams.SAVE_SESSION_SYNCHRONOUS]: true }
);
});
test('If Verified ITAC, selected other shop, and TPA enabled, navigate forward w/ CLICKED_FORWARD_WITH_TPA_ENABLED', () => {
// Arrange
const sellingPrice = getRandomInt(100, 500);
const deductible = sellingPrice + 1;
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: false,
deductible: {
repair: deductible
},
policyLookupSuccessful: true
}
},
issConfig: {
enableTPAFlow: true
}
};
const { wrapper } = getMountedComponent(mainInitialState);
wrapper.setData({
availableLineItems: [
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
],
selectedProvider: 'Other'
});
// Act
wrapper.vm.forwardButtonAction();
// Assert
expect(wrapper.vm.$router.navigate)
.toHaveBeenCalledWith(
navigationScenarios.CLICKED_FORWARD_WITH_TPA_ENABLED,
undefined,
{},
{ [routerParams.SAVE_SESSION_SYNCHRONOUS]: true }
);
});
test('If Verified ITAC, selected other shop, and TPA disabled, navigate forward w/ CLICKED_FORWARD_WITH_TPA_DISABLED', () => {
// Arrange
const sellingPrice = getRandomInt(100, 500);
const deductible = sellingPrice + 1;
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: false,
deductible: {
repair: deductible
},
policyLookupSuccessful: true
}
},
issConfig: {
enableTPAFlow: false
}
};
const { wrapper } = getMountedComponent(mainInitialState);
wrapper.setData({
availableLineItems: [
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
],
selectedProvider: 'Other'
});
// Act
wrapper.vm.forwardButtonAction();
// Assert
expect(wrapper.vm.$router.navigate)
.toHaveBeenCalledWith(
navigationScenarios.CLICKED_FORWARD_WITH_TPA_DISABLED,
undefined,
{},
{ [routerParams.SAVE_SESSION_SYNCHRONOUS]: true }
);
});
test('If No Comp and selected Safelite, navigate forward with CLICKED_FORWARD scenario', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
},
policy: {
noCoverage: true,
policyLookupSuccessful: true
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
wrapper.setData({
isVerified: false,
selectedProvider: 'Safelite'
});
// Act
wrapper.vm.forwardButtonAction();
// Assert
expect(wrapper.vm.$router.navigate)
.toHaveBeenCalledWith(
navigationScenarios.CLICKED_FORWARD_WITH_SAFELITE,
undefined,
{},
{ [routerParams.SAVE_SESSION_SYNCHRONOUS]: true }
);
});
});
describe('ADAS', () => {
test('if Replace and parts require recalibration, isADAS should return true', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: false
},
lineItems: {
glassParts: [
{
requiresRecalibration: true
}
]
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.isADAS).toBeTruthy();
});
test('if Replace and parts do not require recalibration, isADAS should return false', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: false
},
lineItems: {
glassParts: [
{
requiresRecalibration: false
}
]
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.isADAS).toBeFalsy();
});
test('if Repair, isADAS should return true', () => {
// Arrange
const mainInitialState = {
order: {
damage: {
isRepair: true
}
}
};
const { wrapper } = getMountedComponent(mainInitialState);
// Assert
expect(wrapper.vm.isADAS).toBeFalsy();
});
});
describe('claim registration api call', () => {
it('claim registration not required => method not called', async () => {
// Arrange
const { wrapper } = getMountedComponent({
issConfig: {
isClaimRegistrationRequired: false
}
});
// Assert
expect(wrapper.vm.mainStore.registerClaim).not.toHaveBeenCalled();
});
it('claim registration required => register claim method called', async () => {
// Arrange
const sellingPrice = getRandomInt(50, 100);
const deductible = sellingPrice - 1;
const initialStore = {
order: {
policy: {
policyLookupSuccessful: true,
noCoverage: false,
deductible: {
repair: deductible
}
},
damage: {
isRepair: true
}
},
issConfig: {
isClaimRegistrationRequired: true
}
};
const mockStoreActions = () => {
useMainStore().getWipers = jest.fn().mockImplementation(() => Promise.resolve());
useMainStore().getRainDefense = jest.fn().mockImplementation(() => Promise.resolve());
useMainStore().getSupportingItems = jest.fn().mockImplementation(() => Promise.resolve());
useMainStore().getPriceOrderItems = jest.fn().mockImplementation(() => Promise.resolve([
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
]));
};
const { wrapper } = getMountedComponent(initialStore, {}, mockStoreActions);
const next = (method) => { method(wrapper.vm); };
// Act
coverageStatement.beforeRouteEnter.call(wrapper.vm, undefined, undefined, next);
for (let i = 0; i < 7; i++) {
// eslint-disable-next-line no-await-in-loop
await nextTick();
}
// Assert
expect(wrapper.vm.mainStore.registerClaim).toHaveBeenCalled();
});
});
});
describe('coverageStatement.vue-working', () => {
describe('ITAC flag', () => {
test('ITAC flag updated once component is initialized', async () => {
// Arrange
const mainInitialState = {
order: {
policy: {
isITAC: null
}
}
};
const mockStoreActions = () => {
useMainStore().getPriceOrderItems = jest.fn().mockImplementation(() => Promise.resolve([]));
};
const { wrapper } = getMountedComponent(mainInitialState, {}, mockStoreActions);
// Act
wrapper.vm.initializeComponent();
// Assert
expect(wrapper.vm.mainStore.updatePolicyITACFlag)
.toHaveBeenCalledTimes(1);
});
it('Loaded duplicate with previously registered claim => claim registration is not called', async () => {
// Arrange
const sellingPrice = getRandomInt(50, 100);
const deductible = sellingPrice - 1;
const initialStore = {
order: {
policy: {
policyLookupSuccessful: true,
noCoverage: false,
deductible: {
repair: deductible
}
},
damage: {
isRepair: false
},
payment: {
insuranceCoverage: {
claimNumber: getRandomString(10, 10)
}
}
},
issConfig: {
isClaimRegistrationRequired: true
}
};
const mockStoreActions = () => {
useMainStore().getWipers = jest.fn().mockImplementation(() => Promise.resolve());
useMainStore().getRainDefense = jest.fn().mockImplementation(() => Promise.resolve());
useMainStore().getSupportingItems = jest.fn().mockImplementation(() => Promise.resolve());
useMainStore().getPriceOrderItems = jest.fn().mockImplementation(() => Promise.resolve([
{
sellingPrice,
kitPrice: 0,
laborAmount: 0
}
]));
};
const { wrapper } = getMountedComponent(initialStore, {}, mockStoreActions);
const next = (method) => { method(wrapper.vm); };
// Act
coverageStatement.beforeRouteEnter.call(wrapper.vm, undefined, undefined, next);
for (let i = 0; i < 7; i++) {
// eslint-disable-next-line no-await-in-loop
await nextTick();
}
// Assert
expect(wrapper.vm.mainStore.registerClaim).toHaveBeenCalledTimes(0);
});
});
});