From 6f51031ecea3e1ba78588fb3344bf9a137425bf5 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Wed, 17 Jun 2026 15:44:48 -0400 Subject: [PATCH 01/11] INSR-9937: Add source system and company code to register claim request --- src/store/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/store/index.js b/src/store/index.js index 62a80354..8b7e8295 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -165,7 +165,8 @@ export const getDefaultState = () => ({ coverageStatus: coverageStatuses.PENDING, coverageType: coverageType.NONE, isItacOptimized: false, - claimNumber: null + claimNumber: null, + companyCode: null }, payment: { parentAccountNumber: 0, @@ -596,6 +597,7 @@ export const useMainStore = defineStore({ order.customer.address.zipCode = insured?.zipCode?.toString(); order.customer.firstName = insured?.firstName; order.customer.lastName = insured?.lastName; + order.insuranceCoverage.companyCode = insured?.companyCode; // populate additional fields order.policy.policyData = responsePolicy.policyData; @@ -646,6 +648,7 @@ export const useMainStore = defineStore({ // This is here in case we have to deploy site for other fixes before coverage service gets updated. isRepair: this.order.damage.isRepair, isItac: isITAC, + sourceSystem: applicationConfig.APPLICATION_NAME, insured: { firstName: this.order.customer.firstName, lastName: this.order.customer.lastName, @@ -676,6 +679,7 @@ export const useMainStore = defineStore({ actualDeductible: this.currentDeductible.toString() ?? '', currentRepairDeductible: this.order.currentDeductible.repair, currentReplaceDeductible: this.order.currentDeductible.replace, + company: this.order.insuranceCoverage.companyCode }, lossInfo: { dateOfLoss: this.order.policy.dateOfLoss, @@ -1943,6 +1947,7 @@ export const useMainStore = defineStore({ this.order.insuranceCoverage.coverageType = coverageType.NONE; this.order.insuranceCoverage.isItacOptimized = false; this.order.insuranceCoverage.claimNumber = null; + this.order.insuranceCoverage.companyCode = null; }, updateGlassFees(feeData) { if (feeData == null) { From 6d52832b4af8fa2021eb58f130076c73ca2f14e4 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Wed, 17 Jun 2026 16:01:19 -0400 Subject: [PATCH 02/11] Clear companyCode on failed/empty policy lookup, just in case --- src/store/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/store/index.js b/src/store/index.js index 8b7e8295..16af68c3 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -609,9 +609,11 @@ export const useMainStore = defineStore({ order.policy.policyLookupErrorCode = response?.data?.errorCode; } this.updateCoverageType(coverageType.NONE); + order.insuranceCoverage.companyCode = null; } } catch (e) { this.updateCoverageType(coverageType.NONE); + order.insuranceCoverage.companyCode = null; } }, clearDuplicateOrders() { From 89e04c0019e7c0d5391794830d62853c1520bf6a Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Wed, 17 Jun 2026 16:54:38 -0400 Subject: [PATCH 03/11] Unit test updates --- src/store/store.spec.js | 46 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 7b9d4355..91dd82b0 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -16,6 +16,7 @@ import coverageType from '@/constants/coverage-type'; import { getEnumName } from '@/helpers/unit-test-helper'; import { strictEqual } from 'assert'; import partNumberStrings from '@/constants/part-number-strings'; +import applicationConfig from '@/constants/application-config'; describe('Store', () => { let store; @@ -481,6 +482,42 @@ describe('Store', () => { expect(store.order.insuranceCoverage.coverageStatus).toBe(coverageStatuses.NO_COVERAGE); expect(store.order.insuranceCoverage.claimNumber).toBe(null); }); + + it.only('calls api with expected data', async () => { + // Arrange + const companyCode = getRandomString(6, 6); + const originalDeductible = { + replace: 500, + repair: 0 + }; + const currentDeductible = { + replace: 500, + repair: 0 + }; + store.order.originalDeductible = { + replace: originalDeductible.replace, + repair: originalDeductible.repair + }; + store.order.currentDeductible = { + replace: currentDeductible.replace, + repair: currentDeductible.repair + }; + store.order.insuranceCoverage.companyCode = companyCode; + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); + + // Act + await store.registerClaim(); + + // Asserts + expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ + payload: expect.objectContaining({ + sourceSystem: applicationConfig.APPLICATION_NAME, + policyInfo: expect.objectContaining({ + company: companyCode + }) + }) + })); + }); }); describe('updateContactInfo method', () => { @@ -1299,6 +1336,7 @@ describe('Store', () => { const zipCode = getRandomString(6, 6); const firstName = getRandomString(6, 6); const lastName = getRandomString(6, 6); + const companyCode = getRandomString(6, 6); const vehicle = { id: '123' }; @@ -1313,7 +1351,8 @@ describe('Store', () => { state, zipCode, firstName, - lastName + lastName, + companyCode } ], vehicles: [ @@ -1335,6 +1374,7 @@ describe('Store', () => { await expect(store.order.customer.address.zipCode).toBe(zipCode); await expect(store.order.customer.firstName).toBe(firstName); await expect(store.order.customer.lastName).toBe(lastName); + await expect(store.order.insuranceCoverage.companyCode).toBe(companyCode) await expect(store.order.policy.vehicles).toStrictEqual([vehicle]); }); it('calls api with expected data', async () => { @@ -1404,7 +1444,8 @@ describe('Store', () => { lastName: getRandomString(6, 6), city: getRandomString(6, 6), state: getRandomString(6, 6), - zipCode: getRandomString(6, 6) + zipCode: getRandomString(6, 6), + companyCode: getRandomString(6, 6) }; const vehicles = [ { name: getRandomString(6, 6) }, @@ -1435,6 +1476,7 @@ describe('Store', () => { expect(store.order.customer.address.zipCode).toBe(insured.zipCode); expect(store.order.customer.firstName).toBe(insured.firstName); expect(store.order.customer.lastName).toBe(insured.lastName); + expect(store.order.insuranceCoverage.companyCode).toBe(insured.companyCode); expect(store.order.policy.vehicles).toEqual(vehicles); }); From b19e63e70205b332eed82b073f0559b14eaece57 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Wed, 17 Jun 2026 17:13:01 -0400 Subject: [PATCH 04/11] Move companyCode from insuranceCoverage to customer, fix tests --- src/store/index.js | 16 ++++++++-------- src/store/store.spec.js | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index 16af68c3..04916d18 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -125,7 +125,8 @@ export const getDefaultState = () => ({ }, firstName: null, lastName: null, - emailAddress: null + emailAddress: null, + companyCode: null }, serviceLocation: { address: null, @@ -165,8 +166,7 @@ export const getDefaultState = () => ({ coverageStatus: coverageStatuses.PENDING, coverageType: coverageType.NONE, isItacOptimized: false, - claimNumber: null, - companyCode: null + claimNumber: null }, payment: { parentAccountNumber: 0, @@ -597,7 +597,7 @@ export const useMainStore = defineStore({ order.customer.address.zipCode = insured?.zipCode?.toString(); order.customer.firstName = insured?.firstName; order.customer.lastName = insured?.lastName; - order.insuranceCoverage.companyCode = insured?.companyCode; + order.customer.companyCode = insured?.companyCode; // populate additional fields order.policy.policyData = responsePolicy.policyData; @@ -609,11 +609,11 @@ export const useMainStore = defineStore({ order.policy.policyLookupErrorCode = response?.data?.errorCode; } this.updateCoverageType(coverageType.NONE); - order.insuranceCoverage.companyCode = null; + order.customer.companyCode = null; } } catch (e) { this.updateCoverageType(coverageType.NONE); - order.insuranceCoverage.companyCode = null; + order.customer.companyCode = null; } }, clearDuplicateOrders() { @@ -681,7 +681,7 @@ export const useMainStore = defineStore({ actualDeductible: this.currentDeductible.toString() ?? '', currentRepairDeductible: this.order.currentDeductible.repair, currentReplaceDeductible: this.order.currentDeductible.replace, - company: this.order.insuranceCoverage.companyCode + company: this.order.customer.companyCode }, lossInfo: { dateOfLoss: this.order.policy.dateOfLoss, @@ -1949,7 +1949,6 @@ export const useMainStore = defineStore({ this.order.insuranceCoverage.coverageType = coverageType.NONE; this.order.insuranceCoverage.isItacOptimized = false; this.order.insuranceCoverage.claimNumber = null; - this.order.insuranceCoverage.companyCode = null; }, updateGlassFees(feeData) { if (feeData == null) { @@ -2182,6 +2181,7 @@ export const useMainStore = defineStore({ this.order.customer.address.zipCode = null; this.order.customer.address.streetAddress = null; this.order.customer.address.streetAddress2 = null; + this.order.customer.companyCode = null; }, resetContactInfo() { diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 91dd82b0..8cf40ee3 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -483,7 +483,7 @@ describe('Store', () => { expect(store.order.insuranceCoverage.claimNumber).toBe(null); }); - it.only('calls api with expected data', async () => { + it('calls api with expected data', async () => { // Arrange const companyCode = getRandomString(6, 6); const originalDeductible = { @@ -502,7 +502,7 @@ describe('Store', () => { replace: currentDeductible.replace, repair: currentDeductible.repair }; - store.order.insuranceCoverage.companyCode = companyCode; + store.order.customer.companyCode = companyCode; globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act @@ -1374,7 +1374,7 @@ describe('Store', () => { await expect(store.order.customer.address.zipCode).toBe(zipCode); await expect(store.order.customer.firstName).toBe(firstName); await expect(store.order.customer.lastName).toBe(lastName); - await expect(store.order.insuranceCoverage.companyCode).toBe(companyCode) + await expect(store.order.customer.companyCode).toBe(companyCode) await expect(store.order.policy.vehicles).toStrictEqual([vehicle]); }); it('calls api with expected data', async () => { @@ -1476,7 +1476,7 @@ describe('Store', () => { expect(store.order.customer.address.zipCode).toBe(insured.zipCode); expect(store.order.customer.firstName).toBe(insured.firstName); expect(store.order.customer.lastName).toBe(insured.lastName); - expect(store.order.insuranceCoverage.companyCode).toBe(insured.companyCode); + expect(store.order.customer.companyCode).toBe(insured.companyCode); expect(store.order.policy.vehicles).toEqual(vehicles); }); From 56ae9cd1949c0cda059ae8a24de1ee7cae59b891 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 18 Jun 2026 11:15:28 -0400 Subject: [PATCH 05/11] INSR-8493: Add MSR fee alert to service location component --- .../service-location/service-location.vue | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 0681c0f9..51ce0372 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -94,6 +94,12 @@ {{ militaryBaseWarningText }} + {{ mobileZipError }} - 0 && (this.mobileFeePart.partNumber === partNumberStrings.RECAL_MOBILEDUAL || this.mobileFeePart.partNumber === partNumberStrings.RECAL_MOBILE); + }, + msrFeeAlertCopy() { + let content = this.getCmsContent('AlertMSRFeeWidget', widgetFields.ALERT_WIDGET.BODY_TEXT); + content = content.replace('{custom:fee}', `$${this.mobileFeePart.sellingPrice.toFixed(2)}`); + return content; } }, watch: { From f8345d5b9f4e2d78af5ae743b5c3571f415029f6 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 18 Jun 2026 11:28:02 -0400 Subject: [PATCH 06/11] INSR-9937: No longer need to null out company code on policy lookup fail --- src/store/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index 04916d18..04c916e6 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -609,11 +609,9 @@ export const useMainStore = defineStore({ order.policy.policyLookupErrorCode = response?.data?.errorCode; } this.updateCoverageType(coverageType.NONE); - order.customer.companyCode = null; } } catch (e) { this.updateCoverageType(coverageType.NONE); - order.customer.companyCode = null; } }, clearDuplicateOrders() { From 6f0a6ce44cdb2f27e7df30e7be62582ecee875be Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 18 Jun 2026 14:59:18 -0400 Subject: [PATCH 07/11] INSR-8493: More robust MSR fee alert logic, fix custom copy --- src/helpers/recal-helper.js | 6 ++++- .../service-location/service-location.vue | 24 ++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/helpers/recal-helper.js b/src/helpers/recal-helper.js index 0bb650ff..5b86e63a 100644 --- a/src/helpers/recal-helper.js +++ b/src/helpers/recal-helper.js @@ -120,5 +120,9 @@ export function anyPartWithRequiresRecalFlag(lineItems) { } export function hasMSRPart(lineItems) { - return lineItems?.feeItems?.some((item) => item.partNumber === partNumberStrings.RECAL_MOBILEDUAL || item.partNumber === partNumberStrings.RECAL_MOBILE) ?? false + return lineItems?.feeItems?.some((item) => isMSRPart(item)) ?? false; +} + +export function isMSRPart(part) { + return part.partNumber === partNumberStrings.RECAL_MOBILEDUAL || part.partNumber === partNumberStrings.RECAL_MOBILE; } diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 51ce0372..991f0587 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -135,7 +135,7 @@ import { getMobileZipCodeData } from '@/helpers/service-location-helper'; import { toTitleCase } from '@/helpers/text-helper.js'; -import { isRecalOrder } from '@/helpers/recal-helper'; +import { isMSRPart, isRecalOrder } from '@/helpers/recal-helper'; // Import Component import alert from '@/ux-components/alert/alert.vue'; @@ -148,6 +148,7 @@ import recalModal from '@/iss-components/recal-modal/recal-modal.vue'; import { getPricedMobileFeePart } from '@/helpers/service-location-helper'; import { processIfStatements } from '@/helpers/cms-content-helper'; import partNumberStrings from '@/constants/part-number-strings'; +import { experimentSettings } from '@/constants/experiments'; const RECAL_MODAL_REF_NAME = 'RecalModal'; @@ -294,11 +295,28 @@ export default { return this.processIfStatements(bodyText, 'custom', this.getCustomValueFromString); }, displayMSRFeeAlert() { - return this.mobileFeePart !== null && this.mobileFeePart.sellingPrice > 0 && (this.mobileFeePart.partNumber === partNumberStrings.RECAL_MOBILEDUAL || this.mobileFeePart.partNumber === partNumberStrings.RECAL_MOBILE); + if (!this.mobileFeePart || this.mobileFeePart.sellingPrice === 0 || !isMSRPart(this.mobileFeePart)) { + return false; + } + + if (this.mainStore.isITAC || this.mainStore.isNoComp) { + return true; + } + + const isSplitPayEnabled = this.getSettingValue(experimentSettings.MSR_SPLIT_PAY_ENABLED) === 'true'; + if (!isSplitPayEnabled) { + return false; + } + + if (!this.mobileFeePart.isInsurable) { + return true; + } + + return false; }, msrFeeAlertCopy() { let content = this.getCmsContent('AlertMSRFeeWidget', widgetFields.ALERT_WIDGET.BODY_TEXT); - content = content.replace('{custom:fee}', `$${this.mobileFeePart.sellingPrice.toFixed(2)}`); + content = content.replace('{custom:mobileFee}', `${this.mobileFeePart.sellingPrice.toFixed(2)}`); return content; } }, From c616ad51b41315d234b0bde28440e0d21a1bb1c0 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Thu, 18 Jun 2026 15:06:29 -0400 Subject: [PATCH 08/11] INSR-8493: Remove unused partNumberStrings import --- src/layouts/schedule-page/service-location/service-location.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 991f0587..8dac1ad7 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -147,7 +147,6 @@ import widgetFields from '@/constants/cms-widget-fields'; import recalModal from '@/iss-components/recal-modal/recal-modal.vue'; import { getPricedMobileFeePart } from '@/helpers/service-location-helper'; import { processIfStatements } from '@/helpers/cms-content-helper'; -import partNumberStrings from '@/constants/part-number-strings'; import { experimentSettings } from '@/constants/experiments'; const RECAL_MODAL_REF_NAME = 'RecalModal'; From 57a1067a3d89d1a7f5f6325ce3538f2b0e9b6233 Mon Sep 17 00:00:00 2001 From: AHumphriesSL Date: Thu, 18 Jun 2026 15:08:37 -0400 Subject: [PATCH 09/11] MSR Fee amount fix Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../service-location/service-location.vue | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 8dac1ad7..875e2d61 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -294,7 +294,15 @@ export default { return this.processIfStatements(bodyText, 'custom', this.getCustomValueFromString); }, displayMSRFeeAlert() { - if (!this.mobileFeePart || this.mobileFeePart.sellingPrice === 0 || !isMSRPart(this.mobileFeePart)) { + if (!this.mobileFeePart || !isMSRPart(this.mobileFeePart)) { + return false; + } + + const mobileFeeAmount = (this.mobileFeePart.kitPrice ?? 0) + + (this.mobileFeePart.laborAmount ?? 0) + + (this.mobileFeePart.sellingPrice ?? 0); + + if (mobileFeeAmount <= 0) { return false; } @@ -307,15 +315,15 @@ export default { return false; } - if (!this.mobileFeePart.isInsurable) { - return true; - } - - return false; + return !this.mobileFeePart.isInsurable; }, msrFeeAlertCopy() { + const mobileFeeAmount = (this.mobileFeePart?.kitPrice ?? 0) + + (this.mobileFeePart?.laborAmount ?? 0) + + (this.mobileFeePart?.sellingPrice ?? 0); + let content = this.getCmsContent('AlertMSRFeeWidget', widgetFields.ALERT_WIDGET.BODY_TEXT); - content = content.replace('{custom:mobileFee}', `${this.mobileFeePart.sellingPrice.toFixed(2)}`); + content = content.replace('{custom:mobileFee}', `${mobileFeeAmount.toFixed(2)}`); return content; } }, From e875c16c20599466e65478f2340e1569d044b819 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 19 Jun 2026 13:25:17 -0400 Subject: [PATCH 10/11] INSR-8493: Restore existing mobile fee disclaimer --- .../schedule-page/service-location/service-location.vue | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 875e2d61..4e75c4d7 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -118,6 +118,10 @@ class="d-inline-flex mt-0" role="alert">{{ mobileZipError }} + Date: Fri, 19 Jun 2026 16:36:58 -0400 Subject: [PATCH 11/11] INSR-8493: Add tests --- .../service-location/service-location.spec.js | 127 +++++++++++++++++- .../service-location/service-location.vue | 1 - 2 files changed, 124 insertions(+), 4 deletions(-) diff --git a/src/layouts/schedule-page/service-location/service-location.spec.js b/src/layouts/schedule-page/service-location/service-location.spec.js index eb77d52c..f3485ac4 100644 --- a/src/layouts/schedule-page/service-location/service-location.spec.js +++ b/src/layouts/schedule-page/service-location/service-location.spec.js @@ -4,9 +4,11 @@ import { createTestingPinia } from '@pinia/testing'; import { AppointmentTypeStrings } from '@/constants/schedule-constants'; import navigationScenarios from '@/router/router-constants/navigation-scenarios'; import routerParams from '@/router/router-constants/router-params'; -import { getPricedMobileFeePart } from '@/helpers/service-location-helper'; import { useMainStore } from '@/store'; import serviceLocation from '@/layouts/schedule-page/service-location/service-location.vue'; +import coverageTypes from '@/constants/coverage-type'; +import coverageStatuses from '@/constants/coverage-statuses'; +import { experimentSettings } from '@/constants/experiments'; const mockGetServiceabilityDetails = () => { const serviceabilityDetails = { @@ -84,12 +86,23 @@ const mockProviders = () => Promise.resolve([ isSafeliteShop: true } ]); +const defaultMobileFeePart = { + "partNumber": "RECAL MOBILEDUAL", + "description": null, + "partType": "MOBILE FEE", + "isInsurable": false, + "displayName": "Advanced mobile", + "type": null, + "laborAmount": 0, + "sellingPrice": 50, + "kitPrice": 0 +} jest.mock( '@/helpers/service-location-helper', () => ({ getZipCodeData: jest.fn((mockServiceZipCode) => mockZipcodeData(mockServiceZipCode)), getMobileZipCodeData: jest.fn((mockServiceZipCode) => mockZipcodeData(mockServiceZipCode)), - getPricedMobileFeePart: jest.fn(() => Promise.resolve(null)) + getPricedMobileFeePart: jest.fn(() => Promise.resolve(defaultMobileFeePart)) }) ); @@ -135,13 +148,17 @@ const mountOptions = { } } }; -function setupMocks({ appointmentType = AppointmentTypeStrings.IN_SHOP }) { +function setupMocks({ appointmentType = AppointmentTypeStrings.IN_SHOP, coverageStatus = coverageStatuses.PENDING, coverageType = coverageTypes.NONE }, splitPaySettingValue = 'false') { mountOptions.global.plugins = [createTestingPinia({ initialState: { main: { order: { serviceLocation: { appointmentType + }, + insuranceCoverage: { + coverageStatus, + coverageType } } } @@ -149,6 +166,23 @@ function setupMocks({ appointmentType = AppointmentTypeStrings.IN_SHOP }) { })]; useMainStore().getSafeliteProviders = jest.fn().mockImplementation(() => mockProviders()); useMainStore().getServiceabilityDetails = jest.fn((mockServiceZipCode) => mockGetServiceabilityDetails(mockServiceZipCode)); + const mockMixin = { + methods: { + getSettingValue: jest.fn((settingName) => { + if (settingName === experimentSettings.MSR_SPLIT_PAY_ENABLED) { + return splitPaySettingValue; + } + + return 'false'; + }) + } + }; + const cmsMixin = { + methods: { + getCmsContent: jest.fn(() => "") + } + } + mountOptions.mixins = [mockMixin, cmsMixin]; const wrapper = mount(serviceLocation, mountOptions); wrapper.vm.$router.navigateWithSpinner = jest.fn(); @@ -212,4 +246,91 @@ describe('service-location.vue', () => { expect(wrapper.vm.zipContainsMilitaryBase).toBe(true); }); }); + describe('computed', () => { + describe('displayMSRFeeAlert', () => { + test('returns false with no mobile fee', () => { + // Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.mobileFeePart = null; + + // Act + const result = wrapper.vm.displayMSRFeeAlert; + + // Assert + expect(result).toBe(false); + }); + + test('returns false with a mobile fee with no price', () => { + // Arrange + const { wrapper } = setupMocks({}); + wrapper.vm.mobileFeePart = { ...defaultMobileFeePart, sellingPrice: 0 }; + + // Act + const result = wrapper.vm.displayMSRFeeAlert; + + // Assert + expect(result).toBe(false); + }); + + test('returns true for priced mobile fee for No Comp', () => { + // Arrange + const { wrapper } = setupMocks({ coverageStatus: coverageStatuses.VERIFIED, coverageType: coverageTypes.NO_COMP }); + wrapper.vm.mobileFeePart = defaultMobileFeePart; + + // Act + const result = wrapper.vm.displayMSRFeeAlert; + + // Assert + expect(result).toBe(true); + }); + + test('returns true for priced mobile fee for ITAC', () => { + // Arrange + const { wrapper } = setupMocks({ coverageStatus: coverageStatuses.VERIFIED, coverageType: coverageTypes.ITAC }); + wrapper.vm.mobileFeePart = defaultMobileFeePart; + + // Act + const result = wrapper.vm.displayMSRFeeAlert; + + // Assert + expect(result).toBe(true); + }); + + test('returns false for priced mobile fee for Deductible without Split Pay', () => { + // Arrange + const { wrapper } = setupMocks({ coverageStatus: coverageStatuses.VERIFIED, coverageType: coverageTypes.Deductible }, 'false'); + wrapper.vm.mobileFeePart = defaultMobileFeePart; + + // Act + const result = wrapper.vm.displayMSRFeeAlert; + + // Assert + expect(result).toBe(false); + }); + + test('returns false for priced mobile fee for Deductible with Split Pay and isInsurable=true', () => { + // Arrange + const { wrapper } = setupMocks({ coverageStatus: coverageStatuses.VERIFIED, coverageType: coverageTypes.Deductible }, 'true'); + wrapper.vm.mobileFeePart = { ...defaultMobileFeePart, isInsurable: true }; + + // Act + const result = wrapper.vm.displayMSRFeeAlert; + + // Assert + expect(result).toBe(false); + }); + + test('returns true for priced mobile fee for Deductible with Split Pay and isInsurable=false', () => { + // Arrange + const { wrapper } = setupMocks({ coverageStatus: coverageStatuses.VERIFIED, coverageType: coverageTypes.Deductible }, 'true'); + wrapper.vm.mobileFeePart = { ...defaultMobileFeePart, isInsurable: false }; + + // Act + const result = wrapper.vm.displayMSRFeeAlert; + + // Assert + expect(result).toBe(true); + }); + }); + }); }); diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 4e75c4d7..595cc5cb 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -308,7 +308,6 @@ export default { const mobileFeeAmount = (this.mobileFeePart.kitPrice ?? 0) + (this.mobileFeePart.laborAmount ?? 0) + (this.mobileFeePart.sellingPrice ?? 0); - if (mobileFeeAmount <= 0) { return false; }