// Components import { shallowMount } from '@vue/test-utils'; import { createTestingPinia } from '@pinia/testing'; import duplicateCheck from '@/layouts/duplicate-check/duplicate-check.vue'; // Supporting Files import baseMixin from '@/mixins/base-mixin'; import { getMountOptions } from '@/helpers/unit-test-helper.js'; import navigationScenarios from '@/router/router-constants/navigation-scenarios.js'; import { getRandomString } from '@/helpers/data-generation.js'; import { useMainStore } from '@/store'; import settleAllPromises from '@/helpers/layout-helper.js'; import { fetchCmsContentForPage } from '@/helpers/cms-content-helper'; import coverageStatuses from '@/constants/coverage-statuses'; import coverageType from '@/constants/coverage-type'; // Mock fetchCmsContentForPage jest.mock('@/helpers/cms-content-helper', () => ({ fetchCmsContentForPage: jest.fn(), doesCopyContainRouterLink: jest.fn() })); // Mock our module for promises. jest.mock('@/helpers/layout-helper.js', () => jest.fn()); function getMountedComponent(mainInitialState = {}, initialData = {}, methodToRunAfterInitializingStore = () => {}) { const mountOptions = getMountOptions({ router: { navigate: jest.fn() } }); const testingPinia = createTestingPinia({ initialState: { main: mainInitialState } }); useMainStore(testingPinia); methodToRunAfterInitializingStore(); mountOptions.global.plugins = [testingPinia]; mountOptions.data = () => (initialData); const apiResponses = { cmsContent: {} }; settleAllPromises.mockImplementation(() => apiResponses); fetchCmsContentForPage.mockImplementation(() => Promise.resolve()); const wrapper = shallowMount(duplicateCheck, mountOptions); wrapper.vm.getCmsContent = jest.fn().mockImplementation(() => {}); wrapper.vm.setCmsContent = jest.fn(); wrapper.vm.$router.navigateWithSpinner = jest.fn(); wrapper.vm.navigateBack = baseMixin.methods.navigateBack; return { wrapper }; } const duplicateOrderText = 'Finish Existing Claim'; describe('duplicateCheck.vue', () => { describe('Rendering', () => { test('Should render site header', () => { // Arrange const wrapper = shallowMount(duplicateCheck, getMountOptions()); // Act const siteHeader = wrapper.findComponent({ ref: 'siteHeader' }); // Assert expect(siteHeader.exists()).toBeTruthy(); }); test('Should render sub title', () => { // Arrange const wrapper = shallowMount(duplicateCheck, getMountOptions()); // Act const siteSubHeader = wrapper.findComponent({ ref: 'siteSubHeader' }); // Assert expect(siteSubHeader.exists()).toBeTruthy(); }); test('Should render question subcomponent', () => { // Arrange const wrapper = shallowMount(duplicateCheck, getMountOptions()); // Act const question = wrapper.findComponent({ ref: 'buttonQuestion' }); // Assert expect(question.exists()).toBeTruthy(); }); test('Should render site footer', () => { // Arrange const wrapper = shallowMount(duplicateCheck, getMountOptions()); // Act const footer = wrapper.findComponent({ ref: 'siteFooter' }); // Assert expect(footer.exists()).toBeTruthy(); }); }); describe('computed properties', () => { describe('duplicateOrders computed', () => { test('duplicateOrders in store undefined => returns empty list', () => { // Arrange const { wrapper } = getMountedComponent({ applicationUser: { duplicateOrders: undefined } }); // Assert expect(wrapper.vm.duplicateOrders.length).toBe(0); }); test('duplicateOrders in store empty => returns empty list', () => { // Arrange const { wrapper } = getMountedComponent({ applicationUser: { duplicateOrders: [] } }); // Assert expect(wrapper.vm.duplicateOrders.length).toBe(0); }); test('duplicateOrder in store with null vehicle year => returns order with only date in subtext', () => { // Arrange const referralNumber = getRandomString(6, 6); const { wrapper } = getMountedComponent({ applicationUser: { duplicateOrders: [ { vehicleYear: null, vehicleMake: getRandomString(5, 5), vehicleModel: getRandomString(5, 5), responseDate: '1990-09-23T01:12:34', referralNumber, correlationId: getRandomString(5, 5) } ] } }); const expectedSubtext = '9/23/1990'; // Assert expect(wrapper.vm.duplicateOrders.length).toBe(1); expect(wrapper.vm.duplicateOrders[0]).toStrictEqual({ Text: duplicateOrderText, Name: referralNumber, SubText: expectedSubtext, value: useMainStore().applicationUser.duplicateOrders[0].correlationId }); }); test('duplicateOrder in store with null vehicle make => returns order with only date subtext', () => { // Arrange const referralNumber = getRandomString(6, 6); const { wrapper } = getMountedComponent({ applicationUser: { duplicateOrders: [ { vehicleYear: getRandomString(6, 6), vehicleMake: null, vehicleModel: getRandomString(5, 5), responseDate: '2004-11-01T01:12:34', referralNumber, correlationId: getRandomString(6, 6) } ] } }); const expectedSubtext = '11/1/2004'; // Assert expect(wrapper.vm.duplicateOrders.length).toBe(1); expect(wrapper.vm.duplicateOrders[0]).toStrictEqual({ Text: duplicateOrderText, Name: referralNumber, SubText: expectedSubtext, value: useMainStore().applicationUser.duplicateOrders[0].correlationId }); }); test('duplicateOrder in store with null vehicle model => returns order with only date subtext', () => { // Arrange const referralNumber = getRandomString(6, 6); const { wrapper } = getMountedComponent({ applicationUser: { duplicateOrders: [ { vehicleYear: getRandomString(6, 6), vehicleMake: getRandomString(6, 6), vehicleModel: null, responseDate: '1999-01-15T01:12:34', referralNumber, correlationId: getRandomString(6, 6) } ] } }); const expectedSubtext = '1/15/1999'; // Assert expect(wrapper.vm.duplicateOrders.length).toBe(1); expect(wrapper.vm.duplicateOrders[0]).toStrictEqual({ Text: duplicateOrderText, Name: referralNumber, SubText: expectedSubtext, value: useMainStore().applicationUser.duplicateOrders[0].correlationId }); }); test('duplicateOrder in store with all vehicle info => returns order with year, make, model and date in subtext', () => { // Arrange const referralNumber = getRandomString(6, 6); const { wrapper } = getMountedComponent({ applicationUser: { duplicateOrders: [ { vehicleYear: 'YEAR', vehicleMake: 'make', vehicleModel: 'MoDel', responseDate: '2018-03-01T01:12:34', referralNumber, correlationId: getRandomString(6, 6) } ] } }); const expectedVehicle = 'Year Make Model'; const expectedDate = '3/1/2018'; // Assert expect(wrapper.vm.duplicateOrders.length).toBe(1); expect(wrapper.vm.duplicateOrders[0]).toStrictEqual({ Text: duplicateOrderText, Name: referralNumber, SubText: `${expectedVehicle}, ${expectedDate}`, value: useMainStore().applicationUser.duplicateOrders[0].correlationId }); }); }); describe('getNewOrderSelectionName', () => { test('answersFromCms null => returns empty string', () => { // Arrange const mountOptions = getMountOptions({ router: { navigate: jest.fn() } }); const answersFromCmsValue = null; mountOptions.mixins = [{ methods: { getCmsContent: jest.fn().mockImplementation((_, label) => (label === 'Answers' ? answersFromCmsValue : '')) } }]; const wrapper = shallowMount(duplicateCheck, mountOptions); // Assert expect(wrapper.vm.getNewOrderSelectionName).toBe(''); }); test('answersFromCms empty list => returns empty string', () => { // Arrange const mountOptions = getMountOptions({ router: { navigate: jest.fn() } }); const answersFromCmsValue = []; mountOptions.mixins = [{ methods: { getCmsContent: jest.fn().mockImplementation((_, label) => (label === 'Answers' ? answersFromCmsValue : '')) } }]; const wrapper = shallowMount(duplicateCheck, mountOptions); // Assert expect(wrapper.vm.getNewOrderSelectionName).toBe(''); }); test('answersFromCms non-empty list whose first item has no Name property => returns empty string', () => { // Arrange const mountOptions = getMountOptions({ router: { navigate: jest.fn() } }); const answersFromCmsValue = [{ test: getRandomString(6, 6) }]; mountOptions.mixins = [{ methods: { getCmsContent: jest.fn().mockImplementation((_, label) => (label === 'Answers' ? answersFromCmsValue : '')) } }]; const wrapper = shallowMount(duplicateCheck, mountOptions); // Assert expect(wrapper.vm.getNewOrderSelectionName).toBe(''); }); test('answersFromCms first item has Name property => returns expected', () => { // Arrange const mountOptions = getMountOptions({ router: { navigate: jest.fn() } }); const expectedName = getRandomString(6, 6); const answersFromCmsValue = [{ Name: expectedName }]; mountOptions.mixins = [{ methods: { getCmsContent: jest.fn().mockImplementation((_, label) => (label === 'Answers' ? answersFromCmsValue : '')) } }]; const wrapper = shallowMount(duplicateCheck, mountOptions); // Assert expect(wrapper.vm.getNewOrderSelectionName).toBe(expectedName); }); }); }); describe('Navigation', () => { test('Back button clicked triggers navigation', () => { // Arrange const { wrapper } = getMountedComponent({}); wrapper.vm.navigateBack = baseMixin.methods.navigateBack; // Act wrapper.vm.navigateBack(); // Assert expect(wrapper.vm.$router.navigateWithSpinner).toHaveBeenCalled(); expect(wrapper.vm.$router.navigateWithSpinner) .toHaveBeenCalledWith(navigationScenarios.CLICKED_BACK, undefined); }); describe('forwardButtonAction', () => { test('Selected duplicate => load session called', async () => { // Arrange const selectedAnswer = getRandomString(6, 6); const { wrapper } = getMountedComponent({ applicationUser: { duplicateOrders: [ { vehicleYear: 'YEAR', vehicleMake: 'make', vehicleModel: 'MoDel', responseDate: '2018-03-01T01:12:34', referralNumber: getRandomString(6, 6), correlationId: selectedAnswer } ] } }); wrapper.setData({ selectedAnswer }); useMainStore().loadSession = jest.fn().mockImplementation(() => Promise.resolve({})); // Act await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.mainStore.loadSession).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); }); test('Selected new order => load session not called', async () => { // Arrange const newOrderSelectionName = getRandomString(6, 6); const { wrapper } = getMountedComponent({ applicationUser: { duplicateOrders: [ { vehicleYear: 'YEAR', vehicleMake: 'make', vehicleModel: 'MoDel', responseDate: '2018-03-01T01:12:34', referralNumber: getRandomString(6, 6), correlationId: getRandomString(6, 6) } ] } }); wrapper.setData({ selectedAnswer: newOrderSelectionName }); useMainStore().loadSession = jest.fn().mockImplementation(() => Promise.resolve({})); // Act await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.mainStore.loadSession).toHaveBeenCalledTimes(0); expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); }); test('Load session throws error => still navigate forward', async () => { // Arrange const selectedAnswer = getRandomString(6, 6); const { wrapper } = getMountedComponent({ applicationUser: { duplicateOrders: [ { vehicleYear: 'YEAR', vehicleMake: 'make', vehicleModel: 'MoDel', responseDate: '2018-03-01T01:12:34', referralNumber: getRandomString(6, 6), correlationId: selectedAnswer } ] } }); wrapper.setData({ selectedAnswer }); const error = 'load session error'; useMainStore().loadSession = jest.fn().mockImplementation(() => Promise.reject(error)); // Act await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.mainStore.loadSession).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); }); test('coverageType deductible and policy vehicles returned => CLICKED_FORWARD_POLICY_VERIFIED_WITH_VEHICLES', async () => { // Arrange const { wrapper } = getMountedComponent({ order: { insuranceCoverage: { coverageStatus: coverageStatuses.PENDING, coverageType: coverageType.Deductible }, policy: { vehicles: [{ test: 'a' }] } } }); // Act await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate) .toHaveBeenCalledWith(navigationScenarios.CLICKED_FORWARD_POLICY_VERIFIED_WITH_VEHICLES, undefined); }); test('coverageType deductible and no policy vehicles returned => CLICKED_FORWARD_POLICY_VERIFIED_NO_VEHICLES', async () => { // Arrange const { wrapper } = getMountedComponent({ order: { insuranceCoverage: { coverageStatus: coverageStatuses.PENDING, coverageType: coverageType.Deductible }, policy: { vehicles: [] } } }); // Act await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate) .toHaveBeenCalledWith(navigationScenarios.CLICKED_FORWARD_POLICY_VERIFIED_NO_VEHICLES, undefined); }); test('coverageType none => CLICKED_FORWARD_POLICY_UNVERIFIED', async () => { // Arrange const { wrapper } = getMountedComponent({ order: { insuranceCoverage: { coverageStatus: coverageStatuses.PENDING, coverageType: coverageType.NONE } } }); // Act await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate) .toHaveBeenCalledWith(navigationScenarios.CLICKED_FORWARD_POLICY_UNVERIFIED, undefined); }); // eslint-disable-next-line max-len test('coverageType deductible and loaded duplicate with policy vehicle => CLICKED_FORWARD_LOADED_DUPLICATE_WITH_POLICY_VEHICLE', async () => { // Arrange const vin = getRandomString(17, 17); const { wrapper } = getMountedComponent({ order: { insuranceCoverage: { coverageStatus: coverageStatuses.PENDING, coverageType: coverageType.Deductible }, policy: { vehicles: [{ vin }] }, vehicle: { vin }, loadedFromDupeCheck: true } }); // Act await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate) .toHaveBeenCalledWith(navigationScenarios.CLICKED_FORWARD_LOADED_DUPLICATE_WITH_POLICY_VEHICLE, undefined); }); // eslint-disable-next-line max-len test('coverageType deductible and loaded duplicate with non policy vehicle => CLICKED_FORWARD_LOADED_DUPLICATE_WITH_NON_POLICY_VEHICLE', async () => { // Arrange const vin = getRandomString(17, 17); const { wrapper } = getMountedComponent({ order: { insuranceCoverage: { coverageStatus: coverageStatuses.PENDING, coverageType: coverageType.Deductible }, policy: { vehicles: [{ vin }] }, vehicle: { vin: null }, loadedFromDupeCheck: true } }); // Act await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate) .toHaveBeenCalledWith(navigationScenarios.CLICKED_FORWARD_LOADED_DUPLICATE_WITH_NON_POLICY_VEHICLE, undefined); }); // eslint-disable-next-line max-len test('coverageType deductible and loaded duplicate with no policy vehicles => CLICKED_FORWARD_LOADED_DUPLICATE_WITH_NO_POLICY_VEHICLES', async () => { // Arrange const { wrapper } = getMountedComponent({ order: { insuranceCoverage: { coverageStatus: coverageStatuses.PENDING, coverageType: coverageType.Deductible }, policy: { vehicles: [] }, vehicle: { vin: null }, loadedFromDupeCheck: true } }); // Act await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate) .toHaveBeenCalledWith(navigationScenarios.CLICKED_FORWARD_LOADED_DUPLICATE_WITH_NO_POLICY_VEHICLES, undefined); }); }); }); });