From e650ac966690e1ffa51180ab3f408bb31f3be1bb Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 7 Jul 2026 15:25:34 -0400 Subject: [PATCH 01/16] Moved policy lookup to behind save session on both no-duplicate and duplicate paths. --- .../duplicate-check/duplicate-check.vue | 30 ++++++-- src/layouts/welcome-page/welcome-page.vue | 33 +++++---- src/router/index.js | 17 ----- src/router/router.beforeEach.spec.js | 71 ------------------- 4 files changed, 43 insertions(+), 108 deletions(-) delete mode 100644 src/router/router.beforeEach.spec.js diff --git a/src/layouts/duplicate-check/duplicate-check.vue b/src/layouts/duplicate-check/duplicate-check.vue index ec33c88b..265f6b4e 100644 --- a/src/layouts/duplicate-check/duplicate-check.vue +++ b/src/layouts/duplicate-check/duplicate-check.vue @@ -62,6 +62,7 @@ import BaseFormMixin from '@/mixins/base-form-mixin.js'; import { useMainStore } from '@/store/index.js'; import globalRules from '@/constants/global-rules.js'; import { formatDate, toTitleCase } from '@/helpers/text-helper.js'; +import { saveSession } from '@/helpers/order-helper'; const dupeCheckDateFormatter = new Intl.DateTimeFormat('en-US', { timeZone: 'UTC', month: '2-digit', day: '2-digit', year: 'numeric' }); @@ -136,21 +137,38 @@ export default { async forwardButtonAction() { // If user clicked foward without selecting an option or user click on "start a new claim" button. if (this.selectedAnswer == null || this.selectedAnswer === 'NewClaim') { - this.navigateForward(); - return; + // Call SaveSession to create referral. + await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); } + else + { + const selectedReferral = + this.mainStore.applicationUser.duplicateOrders.find((o) => o.correlationId === this.selectedAnswer); - const selectedReferral = - this.mainStore.applicationUser.duplicateOrders.find((o) => o.correlationId === this.selectedAnswer); + if (selectedReferral) { + await this.mainStore.loadSessionFromDuplicate(selectedReferral); + } + } + + // Call getCoveragePolicyInfo to get the policy info. + await this.mainStore.getCoveragePolicyInfo(); + + this.pushEventToGA("policy_search", "policy_found", this.mainStore.isPolicyLookupSuccessful ? "Yes" : "No", true); - if (selectedReferral) { - await this.mainStore.loadSessionFromDuplicate(selectedReferral); + if ( this.mainStore.isPolicyLookupSuccessful) { + this.pushEventToGA("zip_validation", "success", "N/A", true); + } + else { + if ( this.mainStore.order.policy.policyLookupErrorCode === 2) { + this.pushEventToGA("zip_validation", "fail", "N/A", true); + } } this.navigateForward(); }, navigateForward() { this.mainStore.updateDuplicateCheckVisited(true); + if (!this.mainStore.isPolicyLookupSuccessful) { this.$router.navigate( this.navigationScenarios.CLICKED_FORWARD_POLICY_UNVERIFIED, diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 1dd76bc6..315f91bf 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -350,24 +350,29 @@ export default { this.mainStore.clearDuplicateOrders(); } - const promises = [ - this.mainStore.getBillToInfo() - ]; + await this.mainStore.getBillToInfo(); + // Skip duplicate check if loaded from cookie or already visited duplicate check page. if (!this.mainStore.order.loadedFromCookie && !this.mainStore.order.visitedDuplicateCheckPage) { - promises.push(this.mainStore.getDuplicateReferrals()); - } - promises.push(this.mainStore.getCoveragePolicyInfo()); - await Promise.all(promises); + await this.mainStore.getDuplicateReferrals(); - this.pushEventToGA("policy_search", "policy_found", this.mainStore.isPolicyLookupSuccessful ? "Yes" : "No", true); + // If we do not have any duplicates. + // Call SaveSession to create referral. + // Then call getCoveragePolicyInfo to get the policy info. + if ( this.mainStore.applicationUser.duplicateOrders?.length == 0 ) { + await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); + await this.mainStore.getCoveragePolicyInfo(); + + this.pushEventToGA("policy_search", "policy_found", this.mainStore.isPolicyLookupSuccessful ? "Yes" : "No", true); - if ( this.mainStore.isPolicyLookupSuccessful) { - this.pushEventToGA("zip_validation", "success", "N/A", true); - } - else { - if ( this.mainStore.order.policy.policyLookupErrorCode === 2) { - this.pushEventToGA("zip_validation", "fail", "N/A", true); + if ( this.mainStore.isPolicyLookupSuccessful) { + this.pushEventToGA("zip_validation", "success", "N/A", true); + } + else { + if ( this.mainStore.order.policy.policyLookupErrorCode === 2) { + this.pushEventToGA("zip_validation", "fail", "N/A", true); + } + } } } diff --git a/src/router/index.js b/src/router/index.js index 96918285..72395d6a 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -157,23 +157,6 @@ router.beforeEach(async (to, from) => { showIssLoadingModal(true); } - const callSaveSession = !store.order?.referralNumber && (to.name === issPageValues.VEHICLE_SELECTION || to.name === issPageValues.POLICY_VEHICLES); - if (callSaveSession) { - // Forcing a synchronous savesession call here to create the referral for the first time. - // AfterEach does not support synchronous calls that block navigation. Which is why this is in the beforeEach method. - // This only needs to be called once in a certain location, all other saveSession calls are async in afterEach (except the last one on order submission) - // NOTE: This call should be creating the referral number. After this point in the site flow, referral number is critical for several pieces of logic and logging. - // Therefore, we want to force a bailout here if it errors out. - showIssLoadingModal(true); - try { - await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); - } - catch (error) { - // Only remove spinner on error. Successfull new page load will remove it by default. - showIssLoadingModal(false); - } - } - const toQueryPage = to.query?.issPage; const notToPayInAdvanceReturn = toQueryPage !== issPageValues.PAYMENT_RETURN; const isInIframe = window !== window.top || fromQueryPage === issPageValues.PAYMENT_PAGE; diff --git a/src/router/router.beforeEach.spec.js b/src/router/router.beforeEach.spec.js deleted file mode 100644 index 4e13614a..00000000 --- a/src/router/router.beforeEach.spec.js +++ /dev/null @@ -1,71 +0,0 @@ -import issPageValues from '@/router/router-constants/issPage-values'; - -let router; -let saveSession; -let showIssLoadingModal; -let mockBeforeEachHandler; -let mockStore; - -jest.mock('vue-router', () => ({ - createWebHistory: jest.fn(() => ({ state: {} })), - createRouter: jest.fn((options) => ({ - options, - beforeEach: jest.fn((handler) => { - mockBeforeEachHandler = handler; - }), - afterEach: jest.fn(), - addRoute: jest.fn(), - getRoutes: jest.fn(() => []), - hasRoute: jest.fn(() => true), - push: jest.fn(), - go: jest.fn(), - currentRoute: { value: { query: { issPage: 'welcome-page' } } } - })) -})); - -jest.mock('@/helpers/order-helper.js', () => ({ - saveSession: jest.fn(() => Promise.resolve()) -})); - -jest.mock('@/helpers/loading-modal-helper', () => jest.fn()); - -jest.mock('@/store', () => ({ - useMainStore: jest.fn(() => mockStore) -})); - -describe('Router beforeEach callSaveSession', () => { - beforeAll(() => { - router = require('@/router/').default; - ({ saveSession } = require('@/helpers/order-helper.js')); - const loadingModalModule = require('@/helpers/loading-modal-helper'); - showIssLoadingModal = loadingModalModule.default || loadingModalModule; - }); - - beforeEach(() => { - mockStore = { - order: {}, - isBailout: false - }; - - jest.clearAllMocks(); - }); - - it('calls saveSession synchronously when entering vehicle-selection without a referral number', async () => { - const result = await mockBeforeEachHandler( - { - name: issPageValues.VEHICLE_SELECTION, - query: { issPage: issPageValues.VEHICLE_SELECTION }, - href: '/?issPage=vehicle-selection' - }, - { - name: issPageValues.WELCOME_PAGE, - query: { issPage: issPageValues.WELCOME_PAGE } - } - ); - - expect(saveSession).toHaveBeenCalledTimes(1); - expect(saveSession).toHaveBeenCalledWith({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); - expect(showIssLoadingModal).toHaveBeenNthCalledWith(1, true); - expect(result).toBe(true); - }); -}); \ No newline at end of file From c338c12f1c9941c86797d9c2e05615f71e150544 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 7 Jul 2026 15:33:03 -0400 Subject: [PATCH 02/16] Added loader for this navigation path. --- src/layouts/duplicate-check/duplicate-check.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layouts/duplicate-check/duplicate-check.vue b/src/layouts/duplicate-check/duplicate-check.vue index 265f6b4e..325145e2 100644 --- a/src/layouts/duplicate-check/duplicate-check.vue +++ b/src/layouts/duplicate-check/duplicate-check.vue @@ -63,6 +63,7 @@ import { useMainStore } from '@/store/index.js'; import globalRules from '@/constants/global-rules.js'; import { formatDate, toTitleCase } from '@/helpers/text-helper.js'; import { saveSession } from '@/helpers/order-helper'; +import showIssLoadingModal from '@/helpers/loading-modal-helper'; const dupeCheckDateFormatter = new Intl.DateTimeFormat('en-US', { timeZone: 'UTC', month: '2-digit', day: '2-digit', year: 'numeric' }); @@ -135,6 +136,8 @@ export default { * @summary Steps to perform when forward button clicked. */ async forwardButtonAction() { + showIssLoadingModal(true); + // If user clicked foward without selecting an option or user click on "start a new claim" button. if (this.selectedAnswer == null || this.selectedAnswer === 'NewClaim') { // Call SaveSession to create referral. From c6def1fd8a390ee29d06e131f1cd0741fd38694d Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 7 Jul 2026 15:56:29 -0400 Subject: [PATCH 03/16] Some more guarding. --- .../duplicate-check/duplicate-check.vue | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/layouts/duplicate-check/duplicate-check.vue b/src/layouts/duplicate-check/duplicate-check.vue index 325145e2..cdfd087d 100644 --- a/src/layouts/duplicate-check/duplicate-check.vue +++ b/src/layouts/duplicate-check/duplicate-check.vue @@ -138,23 +138,32 @@ export default { async forwardButtonAction() { showIssLoadingModal(true); - // If user clicked foward without selecting an option or user click on "start a new claim" button. - if (this.selectedAnswer == null || this.selectedAnswer === 'NewClaim') { - // Call SaveSession to create referral. - await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); - } - else + try { - const selectedReferral = - this.mainStore.applicationUser.duplicateOrders.find((o) => o.correlationId === this.selectedAnswer); - - if (selectedReferral) { - await this.mainStore.loadSessionFromDuplicate(selectedReferral); + // If user clicked foward without selecting an option or user click on "start a new claim" button. + if (this.selectedAnswer == null || this.selectedAnswer === 'NewClaim') { + // Call SaveSession to create referral. + await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); } + else + { + const selectedReferral = + this.mainStore.applicationUser.duplicateOrders.find((o) => o.correlationId === this.selectedAnswer); + + if (selectedReferral) { + await this.mainStore.loadSessionFromDuplicate(selectedReferral); + } + } + + // Call getCoveragePolicyInfo to get the policy info. + await this.mainStore.getCoveragePolicyInfo(); + } + catch (error) { + // No error handling here needed. + // SaveSession will bailout. + // LoadSession will bailout. + // GetCoveragePolicyInfo handles exception / error internally. } - - // Call getCoveragePolicyInfo to get the policy info. - await this.mainStore.getCoveragePolicyInfo(); this.pushEventToGA("policy_search", "policy_found", this.mainStore.isPolicyLookupSuccessful ? "Yes" : "No", true); From ff391733f0e10aff0e64f688f5d1124b700d7974 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 7 Jul 2026 16:07:03 -0400 Subject: [PATCH 04/16] Updated unit tests to make sure new logic is being hit. --- .../duplicate-check/duplicate-check.spec.js | 88 ++++++++++++++++--- src/layouts/welcome-page/welcome-page.spec.js | 50 +++++++++++ 2 files changed, 125 insertions(+), 13 deletions(-) diff --git a/src/layouts/duplicate-check/duplicate-check.spec.js b/src/layouts/duplicate-check/duplicate-check.spec.js index ada47fc0..18908e19 100644 --- a/src/layouts/duplicate-check/duplicate-check.spec.js +++ b/src/layouts/duplicate-check/duplicate-check.spec.js @@ -13,6 +13,7 @@ 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'; +import { saveSession } from '@/helpers/order-helper'; // Mock fetchCmsContentForPage jest.mock('@/helpers/cms-content-helper', () => ({ @@ -22,6 +23,9 @@ jest.mock('@/helpers/cms-content-helper', () => ({ // Mock our module for promises. jest.mock('@/helpers/layout-helper.js', () => jest.fn()); +jest.mock('@/helpers/order-helper', () => ({ + saveSession: jest.fn().mockResolvedValue({}) +})); function getMountedComponent(mainInitialState = {}, initialData = {}, methodToRunAfterInitializingStore = () => {}) { const mountOptions = getMountOptions({ @@ -278,6 +282,33 @@ describe('duplicateCheck.vue', () => { }); describe('forwardButtonAction', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('No selected duplicate => calls saveSession and getCoveragePolicyInfo, not loadSessionFromDuplicate', async () => { + // Arrange + const { wrapper } = getMountedComponent({ + applicationUser: { + duplicateOrders: [ + { + referralNumber: getRandomString(6, 6), + correlationId: getRandomString(6, 6) + } + ] + } + }); + wrapper.vm.mainStore.loadSessionFromDuplicate = jest.fn().mockResolvedValue({}); + + // Act + await wrapper.vm.forwardButtonAction(); + + // Assert + expect(saveSession).toHaveBeenCalledTimes(1); + expect(wrapper.vm.mainStore.loadSessionFromDuplicate).not.toHaveBeenCalled(); + expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); + }); + test('Selected duplicate => load session called', async () => { // Arrange const selectedAnswer = getRandomString(6, 6); @@ -296,17 +327,48 @@ describe('duplicateCheck.vue', () => { } }); - wrapper.setData({ selectedAnswer }); - useMainStore().loadSessionFromDuplicate = jest.fn().mockImplementation(() => Promise.resolve({})); + await wrapper.setData({ selectedAnswer }); + wrapper.vm.mainStore.loadSessionFromDuplicate = jest.fn().mockResolvedValue({}); // Act await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.mainStore.loadSessionFromDuplicate).toHaveBeenCalledTimes(1); + expect(saveSession).not.toHaveBeenCalled(); + expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); }); - test('Selected new order => load session not called', async () => { + test('Selected NewClaim => calls saveSession, not loadSessionFromDuplicate', async () => { + // Arrange + 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) + } + ] + } + }); + + await wrapper.setData({ selectedAnswer: 'NewClaim' }); + wrapper.vm.mainStore.loadSessionFromDuplicate = jest.fn().mockResolvedValue({}); + + // Act + await wrapper.vm.forwardButtonAction(); + + // Assert + expect(saveSession).toHaveBeenCalledTimes(1); + expect(wrapper.vm.mainStore.loadSessionFromDuplicate).toHaveBeenCalledTimes(0); + expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); + expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); + }); + test('Unmatched selection => does not call saveSession or loadSessionFromDuplicate', async () => { // Arrange const newOrderSelectionName = getRandomString(6, 6); const { wrapper } = getMountedComponent({ @@ -324,14 +386,16 @@ describe('duplicateCheck.vue', () => { } }); - wrapper.setData({ selectedAnswer: newOrderSelectionName }); - useMainStore().loadSessionFromDuplicate = jest.fn().mockImplementation(() => Promise.resolve({})); + await wrapper.setData({ selectedAnswer: newOrderSelectionName }); + wrapper.vm.mainStore.loadSessionFromDuplicate = jest.fn().mockResolvedValue({}); // Act await wrapper.vm.forwardButtonAction(); // Assert + expect(saveSession).toHaveBeenCalledTimes(0); expect(wrapper.vm.mainStore.loadSessionFromDuplicate).toHaveBeenCalledTimes(0); + expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); }); test('Load session throws error => still navigate forward', async () => { @@ -352,20 +416,18 @@ describe('duplicateCheck.vue', () => { } }); - wrapper.setData({ selectedAnswer }); + await wrapper.setData({ selectedAnswer }); const error = 'load session error'; - useMainStore().loadSessionFromDuplicate = jest.fn().mockImplementation(() => Promise.reject(error)); + wrapper.vm.mainStore.loadSessionFromDuplicate = jest.fn().mockImplementation(() => Promise.reject(error)); // Act + await wrapper.vm.forwardButtonAction(); // Assert - expect.assertions(2); - try { - await wrapper.vm.forwardButtonAction(); - } catch (e) { - expect(e).toMatch(error); - } expect(wrapper.vm.mainStore.loadSessionFromDuplicate).toHaveBeenCalledTimes(1); + expect(saveSession).not.toHaveBeenCalled(); + expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(0); + expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); }); test('coverageType deductible and policy vehicles returned => CLICKED_FORWARD_POLICY_VERIFIED_WITH_VEHICLES', async () => { // Arrange diff --git a/src/layouts/welcome-page/welcome-page.spec.js b/src/layouts/welcome-page/welcome-page.spec.js index f18d486e..707c6ab2 100644 --- a/src/layouts/welcome-page/welcome-page.spec.js +++ b/src/layouts/welcome-page/welcome-page.spec.js @@ -12,6 +12,7 @@ import { useMainStore } from '@/store'; import navigationScenarios from '@/router/router-constants/navigation-scenarios'; import routerParams from '@/router/router-constants/router-params'; import coverageType from '@/constants/coverage-type'; +import { saveSession } from '@/helpers/order-helper'; // Mock our module for promises. jest.mock('@/helpers/layout-helper.js', () => jest.fn()); @@ -23,6 +24,9 @@ jest.mock('@/helpers/cms-content-helper', () => ({ jest.mock('@/global-methods', () => ({ callHttpClient: jest.fn() })); +jest.mock('@/helpers/order-helper', () => ({ + saveSession: jest.fn().mockResolvedValue({}) +})); /** @ignore */ function setupMocks({ @@ -133,6 +137,10 @@ describe('welcome-page.vue', () => { }); describe('navigation', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('When zip code check fails', () => { test('Navigation should not happen', async () => { // Arrange @@ -255,6 +263,48 @@ describe('navigation', () => { { [routerParams.SKIP_SAVE_SESSION]: true } ); }); + test('if no duplicates, calls saveSession and getCoveragePolicyInfo', async () => { + // Arrange + const { wrapper } = setupMocks({}); + useMainStore().getDuplicateReferrals = jest.fn().mockImplementation(() => Promise.resolve({})); + useMainStore().applicationUser.duplicateOrders = []; + useMainStore().order.loadedFromCookie = false; + useMainStore().order.visitedDuplicateCheckPage = false; + + wrapper.vm.mainStore.validateZip = jest.fn().mockImplementation(() => Promise.resolve({ + data: { + isValid: true + } + })); + + // Act + await wrapper.vm.forwardButtonAction(); + + // Assert + expect(saveSession).toHaveBeenCalledTimes(1); + expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); + }); + test('if duplicates found, does not call saveSession or getCoveragePolicyInfo', async () => { + // Arrange + const { wrapper } = setupMocks({}); + useMainStore().getDuplicateReferrals = jest.fn().mockImplementation(() => Promise.resolve({})); + useMainStore().applicationUser.duplicateOrders = [{ test: 'duplicate-order' }]; + useMainStore().order.loadedFromCookie = false; + useMainStore().order.visitedDuplicateCheckPage = false; + + wrapper.vm.mainStore.validateZip = jest.fn().mockImplementation(() => Promise.resolve({ + data: { + isValid: true + } + })); + + // Act + await wrapper.vm.forwardButtonAction(); + + // Assert + expect(saveSession).not.toHaveBeenCalled(); + expect(wrapper.vm.mainStore.getCoveragePolicyInfo).not.toHaveBeenCalled(); + }); test('if policy is found, but no vehicles and no duplicates, navigate to vehicle-selection page', async () => { // Arrange const { wrapper } = setupMocks({}); From 7cb346fe506b0bf7f307a01bb862c44fce078bac Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 7 Jul 2026 16:16:52 -0400 Subject: [PATCH 05/16] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/layouts/welcome-page/welcome-page.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 315f91bf..2c0d7f27 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -359,7 +359,7 @@ export default { // If we do not have any duplicates. // Call SaveSession to create referral. // Then call getCoveragePolicyInfo to get the policy info. - if ( this.mainStore.applicationUser.duplicateOrders?.length == 0 ) { + if (this.mainStore.applicationUser.duplicateOrders?.length === 0) { await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); await this.mainStore.getCoveragePolicyInfo(); From 0a2fc03a9171b021882a016888b301867441f7fe Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 7 Jul 2026 16:17:09 -0400 Subject: [PATCH 06/16] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/layouts/duplicate-check/duplicate-check.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/duplicate-check/duplicate-check.vue b/src/layouts/duplicate-check/duplicate-check.vue index cdfd087d..7064ec01 100644 --- a/src/layouts/duplicate-check/duplicate-check.vue +++ b/src/layouts/duplicate-check/duplicate-check.vue @@ -140,7 +140,7 @@ export default { try { - // If user clicked foward without selecting an option or user click on "start a new claim" button. + // If user clicked forward without selecting an option or user click on "start a new claim" button. if (this.selectedAnswer == null || this.selectedAnswer === 'NewClaim') { // Call SaveSession to create referral. await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); From bc458af611c40ec81d35c7e701c0e437a57c91e0 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Wed, 8 Jul 2026 08:43:05 -0400 Subject: [PATCH 07/16] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/layouts/welcome-page/welcome-page.spec.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layouts/welcome-page/welcome-page.spec.js b/src/layouts/welcome-page/welcome-page.spec.js index 707c6ab2..ffa340c2 100644 --- a/src/layouts/welcome-page/welcome-page.spec.js +++ b/src/layouts/welcome-page/welcome-page.spec.js @@ -283,6 +283,9 @@ describe('navigation', () => { // Assert expect(saveSession).toHaveBeenCalledTimes(1); expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); + expect(saveSession.mock.invocationCallOrder[0]).toBeLessThan( + wrapper.vm.mainStore.getCoveragePolicyInfo.mock.invocationCallOrder[0] + ); }); test('if duplicates found, does not call saveSession or getCoveragePolicyInfo', async () => { // Arrange From dd321370a3a14aedc02f798beff7bf634262ddb7 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Wed, 8 Jul 2026 08:43:26 -0400 Subject: [PATCH 08/16] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/layouts/duplicate-check/duplicate-check.spec.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layouts/duplicate-check/duplicate-check.spec.js b/src/layouts/duplicate-check/duplicate-check.spec.js index 18908e19..04ed661b 100644 --- a/src/layouts/duplicate-check/duplicate-check.spec.js +++ b/src/layouts/duplicate-check/duplicate-check.spec.js @@ -307,6 +307,9 @@ describe('duplicateCheck.vue', () => { expect(saveSession).toHaveBeenCalledTimes(1); expect(wrapper.vm.mainStore.loadSessionFromDuplicate).not.toHaveBeenCalled(); expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); + expect(saveSession.mock.invocationCallOrder[0]).toBeLessThan( + wrapper.vm.mainStore.getCoveragePolicyInfo.mock.invocationCallOrder[0] + ); }); test('Selected duplicate => load session called', async () => { From 75720b26602cae3d264a9374935102c66435577a Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Wed, 8 Jul 2026 09:33:01 -0400 Subject: [PATCH 09/16] Updated savesession logic on duplicate check page. --- .../duplicate-check/duplicate-check.spec.js | 5 +- .../duplicate-check/duplicate-check.vue | 58 +++++++++++++------ 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/layouts/duplicate-check/duplicate-check.spec.js b/src/layouts/duplicate-check/duplicate-check.spec.js index 04ed661b..df58325e 100644 --- a/src/layouts/duplicate-check/duplicate-check.spec.js +++ b/src/layouts/duplicate-check/duplicate-check.spec.js @@ -396,7 +396,8 @@ describe('duplicateCheck.vue', () => { await wrapper.vm.forwardButtonAction(); // Assert - expect(saveSession).toHaveBeenCalledTimes(0); + // When selection doesn't match any duplicate, saveSession should be called to create a new referral + expect(saveSession).toHaveBeenCalledTimes(1); expect(wrapper.vm.mainStore.loadSessionFromDuplicate).toHaveBeenCalledTimes(0); expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); @@ -429,7 +430,7 @@ describe('duplicateCheck.vue', () => { // Assert expect(wrapper.vm.mainStore.loadSessionFromDuplicate).toHaveBeenCalledTimes(1); expect(saveSession).not.toHaveBeenCalled(); - expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(0); + expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); }); test('coverageType deductible and policy vehicles returned => CLICKED_FORWARD_POLICY_VERIFIED_WITH_VEHICLES', async () => { diff --git a/src/layouts/duplicate-check/duplicate-check.vue b/src/layouts/duplicate-check/duplicate-check.vue index 7064ec01..ef68050f 100644 --- a/src/layouts/duplicate-check/duplicate-check.vue +++ b/src/layouts/duplicate-check/duplicate-check.vue @@ -138,30 +138,50 @@ export default { async forwardButtonAction() { showIssLoadingModal(true); - try - { - // If user clicked forward without selecting an option or user click on "start a new claim" button. - if (this.selectedAnswer == null || this.selectedAnswer === 'NewClaim') { - // Call SaveSession to create referral. - await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); - } - else - { - const selectedReferral = - this.mainStore.applicationUser.duplicateOrders.find((o) => o.correlationId === this.selectedAnswer); + let callSaveSession = false; + let selectedReferral = null; - if (selectedReferral) { - await this.mainStore.loadSessionFromDuplicate(selectedReferral); - } + // If user clicked forward without selecting an option or user click on "start a new claim" button. + if (this.selectedAnswer == null || this.selectedAnswer === 'NewClaim') { + // User did not pick a duplicate, so call SaveSession to create referral. + callSaveSession = true; + } + else + { + selectedReferral = + this.mainStore.applicationUser.duplicateOrders.find((o) => o.correlationId === this.selectedAnswer); + + if (!selectedReferral) { + // If duplicate not found in list (unable to load), then call SaveSession to create referral. + callSaveSession = true; } - - // Call getCoveragePolicyInfo to get the policy info. + } + + // Call LoadSession if duplicate was found. + if (selectedReferral) { + try { + await this.mainStore.loadSessionFromDuplicate(selectedReferral); + } + catch (error) { + // LoadSession will bailout. + } + } + + // Call SaveSession to create referral. + if (callSaveSession) { + try { + await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); + } + catch (error) { + // SaveSession will bailout. + } + } + + // Call getCoveragePolicyInfo to get the policy info. + try { await this.mainStore.getCoveragePolicyInfo(); } catch (error) { - // No error handling here needed. - // SaveSession will bailout. - // LoadSession will bailout. // GetCoveragePolicyInfo handles exception / error internally. } From 1eb238c37e7321c7a34c5c91faf113d3d046b372 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Wed, 8 Jul 2026 10:38:14 -0400 Subject: [PATCH 10/16] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/layouts/duplicate-check/duplicate-check.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/duplicate-check/duplicate-check.spec.js b/src/layouts/duplicate-check/duplicate-check.spec.js index df58325e..40d350d8 100644 --- a/src/layouts/duplicate-check/duplicate-check.spec.js +++ b/src/layouts/duplicate-check/duplicate-check.spec.js @@ -371,7 +371,7 @@ describe('duplicateCheck.vue', () => { expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); }); - test('Unmatched selection => does not call saveSession or loadSessionFromDuplicate', async () => { + test('Unmatched selection => calls saveSession, not loadSessionFromDuplicate', async () => { // Arrange const newOrderSelectionName = getRandomString(6, 6); const { wrapper } = getMountedComponent({ From 75a9fd8405b41e66a53661482e9772f5ef4df9fc Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Wed, 8 Jul 2026 10:38:30 -0400 Subject: [PATCH 11/16] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/layouts/welcome-page/welcome-page.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 2c0d7f27..cbf44a36 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -356,7 +356,7 @@ export default { if (!this.mainStore.order.loadedFromCookie && !this.mainStore.order.visitedDuplicateCheckPage) { await this.mainStore.getDuplicateReferrals(); - // If we do not have any duplicates. + // If we do not have any duplicates. // Call SaveSession to create referral. // Then call getCoveragePolicyInfo to get the policy info. if (this.mainStore.applicationUser.duplicateOrders?.length === 0) { From 1cdfae73547b76e6d63f83ef5534d0104cd71950 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Wed, 8 Jul 2026 10:38:44 -0400 Subject: [PATCH 12/16] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/layouts/welcome-page/welcome-page.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index cbf44a36..541fa032 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -365,7 +365,7 @@ export default { this.pushEventToGA("policy_search", "policy_found", this.mainStore.isPolicyLookupSuccessful ? "Yes" : "No", true); - if ( this.mainStore.isPolicyLookupSuccessful) { + if (this.mainStore.isPolicyLookupSuccessful) { this.pushEventToGA("zip_validation", "success", "N/A", true); } else { From e516aea57708adc96e0fa07de853b84b206c7acd Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Wed, 8 Jul 2026 10:38:55 -0400 Subject: [PATCH 13/16] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/layouts/welcome-page/welcome-page.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 541fa032..9f44b380 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -369,7 +369,7 @@ export default { this.pushEventToGA("zip_validation", "success", "N/A", true); } else { - if ( this.mainStore.order.policy.policyLookupErrorCode === 2) { + if (this.mainStore.order.policy.policyLookupErrorCode === 2) { this.pushEventToGA("zip_validation", "fail", "N/A", true); } } From ecfbfb9588625cbfed239f768c84797afc4c475e Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Wed, 8 Jul 2026 10:49:28 -0400 Subject: [PATCH 14/16] Fixed some issues caused by co-pilot changes. --- .../duplicate-check/duplicate-check.spec.js | 4 +- .../duplicate-check/duplicate-check.vue | 41 ++++++++----------- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/src/layouts/duplicate-check/duplicate-check.spec.js b/src/layouts/duplicate-check/duplicate-check.spec.js index 40d350d8..fc58e758 100644 --- a/src/layouts/duplicate-check/duplicate-check.spec.js +++ b/src/layouts/duplicate-check/duplicate-check.spec.js @@ -402,7 +402,7 @@ describe('duplicateCheck.vue', () => { expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); }); - test('Load session throws error => still navigate forward', async () => { + test('Load session throws error => should bailout, should not navigate forward', async () => { // Arrange const selectedAnswer = getRandomString(6, 6); const { wrapper } = getMountedComponent({ @@ -431,7 +431,7 @@ describe('duplicateCheck.vue', () => { expect(wrapper.vm.mainStore.loadSessionFromDuplicate).toHaveBeenCalledTimes(1); expect(saveSession).not.toHaveBeenCalled(); expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); - expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); + expect(wrapper.vm.$router.navigate).not.toHaveBeenCalledWith(); }); test('coverageType deductible and policy vehicles returned => CLICKED_FORWARD_POLICY_VERIFIED_WITH_VEHICLES', async () => { // Arrange diff --git a/src/layouts/duplicate-check/duplicate-check.vue b/src/layouts/duplicate-check/duplicate-check.vue index ef68050f..f8e6144f 100644 --- a/src/layouts/duplicate-check/duplicate-check.vue +++ b/src/layouts/duplicate-check/duplicate-check.vue @@ -139,7 +139,6 @@ export default { showIssLoadingModal(true); let callSaveSession = false; - let selectedReferral = null; // If user clicked forward without selecting an option or user click on "start a new claim" button. if (this.selectedAnswer == null || this.selectedAnswer === 'NewClaim') { @@ -148,41 +147,33 @@ export default { } else { - selectedReferral = + const selectedReferral = this.mainStore.applicationUser.duplicateOrders.find((o) => o.correlationId === this.selectedAnswer); - if (!selectedReferral) { + if (selectedReferral) { + // LoadSession will bailout on error. + await this.mainStore.loadSessionFromDuplicate(selectedReferral); + } + else { // If duplicate not found in list (unable to load), then call SaveSession to create referral. callSaveSession = true; } } - // Call LoadSession if duplicate was found. - if (selectedReferral) { - try { - await this.mainStore.loadSessionFromDuplicate(selectedReferral); - } - catch (error) { - // LoadSession will bailout. - } - } - - // Call SaveSession to create referral. - if (callSaveSession) { - try { + try + { + // Call SaveSession to create referral. + if ( callSaveSession ) { + // SaveSession will bailout on error. await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); - } - catch (error) { - // SaveSession will bailout. } - } - - // Call getCoveragePolicyInfo to get the policy info. - try { + + // Call getCoveragePolicyInfo to get the policy info. await this.mainStore.getCoveragePolicyInfo(); - } + } catch (error) { - // GetCoveragePolicyInfo handles exception / error internally. + // No error handling here needed. + // GetCoveragePolicyInfo handles exception / error internally. We do not care if it fails, user continues in unverified path. } this.pushEventToGA("policy_search", "policy_found", this.mainStore.isPolicyLookupSuccessful ? "Yes" : "No", true); From e31998db9cc19fa12bb0a93854601f92510e859d Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Wed, 8 Jul 2026 11:33:23 -0400 Subject: [PATCH 15/16] Fixed some logic and unit tests. --- .../duplicate-check/duplicate-check.spec.js | 31 ------------------- .../duplicate-check/duplicate-check.vue | 25 +++++++++++---- src/layouts/welcome-page/welcome-page.vue | 14 ++++++++- 3 files changed, 32 insertions(+), 38 deletions(-) diff --git a/src/layouts/duplicate-check/duplicate-check.spec.js b/src/layouts/duplicate-check/duplicate-check.spec.js index fc58e758..791f0900 100644 --- a/src/layouts/duplicate-check/duplicate-check.spec.js +++ b/src/layouts/duplicate-check/duplicate-check.spec.js @@ -402,37 +402,6 @@ describe('duplicateCheck.vue', () => { expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); expect(wrapper.vm.$router.navigate).toHaveBeenCalledTimes(1); }); - test('Load session throws error => should bailout, should not 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 - } - ] - } - }); - - await wrapper.setData({ selectedAnswer }); - const error = 'load session error'; - wrapper.vm.mainStore.loadSessionFromDuplicate = jest.fn().mockImplementation(() => Promise.reject(error)); - - // Act - await wrapper.vm.forwardButtonAction(); - - // Assert - expect(wrapper.vm.mainStore.loadSessionFromDuplicate).toHaveBeenCalledTimes(1); - expect(saveSession).not.toHaveBeenCalled(); - expect(wrapper.vm.mainStore.getCoveragePolicyInfo).toHaveBeenCalledTimes(1); - expect(wrapper.vm.$router.navigate).not.toHaveBeenCalledWith(); - }); test('coverageType deductible and policy vehicles returned => CLICKED_FORWARD_POLICY_VERIFIED_WITH_VEHICLES', async () => { // Arrange const { wrapper } = getMountedComponent({ diff --git a/src/layouts/duplicate-check/duplicate-check.vue b/src/layouts/duplicate-check/duplicate-check.vue index f8e6144f..b390e92d 100644 --- a/src/layouts/duplicate-check/duplicate-check.vue +++ b/src/layouts/duplicate-check/duplicate-check.vue @@ -152,7 +152,17 @@ export default { if (selectedReferral) { // LoadSession will bailout on error. - await this.mainStore.loadSessionFromDuplicate(selectedReferral); + try + { + await this.mainStore.loadSessionFromDuplicate(selectedReferral); + } + catch (error) + { + // No error handling here needed. Error is already logged. + // If LoadSession fails, user gets redirected to bailout page. No need to call save session. + // Return here to stop current navigation. + return; + } } else { // If duplicate not found in list (unable to load), then call SaveSession to create referral. @@ -167,14 +177,17 @@ export default { // SaveSession will bailout on error. await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); } - - // Call getCoveragePolicyInfo to get the policy info. - await this.mainStore.getCoveragePolicyInfo(); } catch (error) { - // No error handling here needed. - // GetCoveragePolicyInfo handles exception / error internally. We do not care if it fails, user continues in unverified path. + // No error handling here needed. Error is already logged. + // Return here to stop current navigation. + return; } + + // Call getCoveragePolicyInfo to get the policy info. + // GetCoveragePolicyInfo handles exception / error internally. We do not care if it fails, user continues in unverified path. + await this.mainStore.getCoveragePolicyInfo(); + this.pushEventToGA("policy_search", "policy_found", this.mainStore.isPolicyLookupSuccessful ? "Yes" : "No", true); diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 9f44b380..0d482097 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -354,13 +354,25 @@ export default { // Skip duplicate check if loaded from cookie or already visited duplicate check page. if (!this.mainStore.order.loadedFromCookie && !this.mainStore.order.visitedDuplicateCheckPage) { + // getDuplicateReferrals handles exception / error internally. We do not care if it fails, user continues with creating new referral. await this.mainStore.getDuplicateReferrals(); // If we do not have any duplicates. // Call SaveSession to create referral. // Then call getCoveragePolicyInfo to get the policy info. if (this.mainStore.applicationUser.duplicateOrders?.length === 0) { - await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); + try { + // SaveSession will bailout on error. + await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }); + } + catch (error) { + // No error handling here needed. Error is already logged. + // Return here to stop current navigation. + return; + } + + // Call getCoveragePolicyInfo to get the policy info. + // GetCoveragePolicyInfo handles exception / error internally. We do not care if it fails, user continues in unverified path. await this.mainStore.getCoveragePolicyInfo(); this.pushEventToGA("policy_search", "policy_found", this.mainStore.isPolicyLookupSuccessful ? "Yes" : "No", true); From f9d253c9405ad9dbfe72f72cdbc8fbf890ec727a Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Wed, 8 Jul 2026 11:37:36 -0400 Subject: [PATCH 16/16] Force build checks to rerun again. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 2252a83f..36af87f3 100644 --- a/README.md +++ b/README.md @@ -22,4 +22,3 @@ npm run test:unit ### Customize configuration See [Configuration Reference](https://cli.vuejs.org/config/). -