From 73969b4352db50fbbc4124171cf174f2475d5bfc Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Wed, 10 Apr 2024 15:44:23 -0400 Subject: [PATCH 01/11] Initial changes --- .../cart-dropdown/cart-dropdown.vue | 9 +++++---- .../coverage-statement/coverage-statement.vue | 8 ++++---- src/layouts/entry-page/entry-page.vue | 4 ++++ src/layouts/payment-method/payment-method.vue | 16 ++++++++-------- src/layouts/tpa-submit/tpa-submit.vue | 3 ++- src/store/index.js | 11 ++++++----- 6 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 54031ec5..3e6c9cb0 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -207,8 +207,9 @@ export default { return getPriceOfLineItems(this.baseServiceLineItems); }, isUnverified() { - return !useMainStore().isNoComp && !useMainStore().policy.isITAC - && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus); + return (useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) + || (!useMainStore().isNoComp && !useMainStore().policy.isITAC + && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus)); }, subTotal() { const basePrice = !useMainStore().isNoComp && !useMainStore().policy.isITAC @@ -350,8 +351,8 @@ export default { }, getDisplayed(amount) { return this.isUnverified - && !useMainStore().isNoComp - && !useMainStore().policy.isITAC + // && ((useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) + // || (!useMainStore().isNoComp && !useMainStore().policy.isITAC)) ? VERIFYING_COVERAGE : formatAmountInDollars(amount); }, diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index bd1e0162..9f866e2f 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -208,11 +208,11 @@ export default { }, data() { const { isRepair } = useMainStore().damage; - const { policyLookupSuccessful, noCoverage } = useMainStore().policy; + const { policyLookupSuccessful } = useMainStore().policy; return { isRepair, policyLookupSuccessful, - isNoComp: noCoverage ?? false, + isNoComp: useMainStore().isNoComp, baseServiceLineItems: [], selectedProvider: '', deductibleText: 'Your deductible is', @@ -292,7 +292,7 @@ export default { return useMainStore().payment.insuranceCoverage.isVerified; }, verifiedNoComp() { - return this.policyLookupSuccessful && this.isNoComp; + return this.policyLookupSuccessful && this.isNoComp && useMainStore().issConfig.enableNoCompQuote; }, verifiedITAC() { return this.policyLookupSuccessful @@ -300,7 +300,7 @@ export default { && this.deductibleValue > this.totalServicePrice; }, coveredAndServicePriceAboveOrEqualDeductible() { - return !this.verifiedNoComp && this.totalServicePrice >= this.deductibleValue; + return !this.isNoComp && this.totalServicePrice >= this.deductibleValue; }, verifiedDeductible() { return useMainStore().isClaimRegistrationRequired diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue index a060ab39..b2da8ab2 100644 --- a/src/layouts/entry-page/entry-page.vue +++ b/src/layouts/entry-page/entry-page.vue @@ -117,6 +117,10 @@ export default { if (clientFlags.ClaimRegistrationRequired) { this.mainStore.issConfig.isClaimRegistrationRequired = true; } + + if (clientFlags.EnableNoCompQuote) { + this.mainStore.issConfig.enableNoCompQuote = true; + } } } catch (e) { console.error(`Error parsing client flags: ${e}`); diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index c5014290..1fbd3d62 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -129,12 +129,10 @@ export default { let hasBailedOut = false; const pricedVaps = await useMainStore().getPriceOrderItems(unpricedVaps) .catch((err) => { - useMainStore().setBailout( - bailoutMessage.pricingResponseError( - unpricedVaps.map((li) => li.partNumber), - { code: err.code, message: err.message, data: err.data } - ) - ); + useMainStore().setBailout(bailoutMessage.pricingResponseError( + unpricedVaps.map((li) => li.partNumber), + { code: err.code, message: err.message, data: err.data } + )); hasBailedOut = true; next(`/?issPage=${issPageValues.BAILOUT_PAGE}`); }); @@ -182,8 +180,10 @@ export default { return !isEnabled || this.isUnverified; }, isUnverified() { - return !useMainStore().isNoComp && !useMainStore().isITAC - && (useMainStore().order.currentDeductible == null || !useMainStore().isVerifiedCoverageStatus); + return (useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) + || (!useMainStore().isNoComp + && !useMainStore().isITAC + && (useMainStore().order.currentDeductible == null || !useMainStore().isVerifiedCoverageStatus)); }, paymentMethod() { return this.paymentMethodInternalModel; diff --git a/src/layouts/tpa-submit/tpa-submit.vue b/src/layouts/tpa-submit/tpa-submit.vue index 590a4645..dc19a8d8 100644 --- a/src/layouts/tpa-submit/tpa-submit.vue +++ b/src/layouts/tpa-submit/tpa-submit.vue @@ -192,7 +192,8 @@ export default { return this.getCmsContent(this.widget.footer, widgetFields.FOOTER_WIDGET.FORWARD_BUTTON_TEXT); }, isVerified() { - return useMainStore().order.payment.insuranceCoverage.isVerified; + return !(useMainStore().isNoComp && !useMainStore().enableNoCompQuote) + && useMainStore().order.payment.insuranceCoverage.isVerified; }, currentDeductible() { return useMainStore().order.currentDeductible; diff --git a/src/store/index.js b/src/store/index.js index e4e129ec..03d2f8f2 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -23,7 +23,7 @@ import { } from '@/helpers/policy-vehicle-helper'; import partTypeStrings from '@/constants/part-type-strings'; import bailoutMessage from '@/constants/bailoutMessage'; -import bailoutCode from "@/constants/bailoutCode"; +import bailoutCode from '@/constants/bailoutCode'; const storeId = 'main'; @@ -238,7 +238,8 @@ export const getDefaultState = () => ({ policyZipCode: null, dateOfLoss: null }, - siteType: null + siteType: null, + enableNoCompQuote: false } }); @@ -265,7 +266,7 @@ export const useMainStore = defineStore({ isClaimAlreadyRegistered: (state) => state.order.payment.insuranceCoverage.claimNumber !== null, isBailout: (state) => state.applicationUser.pageData[issPageValues.BAILOUT_PAGE] != null, bailoutCode: (state) => state.applicationUser.pageData[issPageValues.BAILOUT_PAGE]?.bailoutCode, - isNoComp: (state) => !!state.order.policy.noCoverage, + isNoComp: (s) => !!s.order.policy.noCoverage, isITAC: (state) => !!state.order.policy.isITAC, isVerifiedCoverageStatus: (state) => state.order.payment.insuranceCoverage.coverageStatus === coverageStatuses.VERIFIED, eventBusItem: (state) => (eventCategory, eventSubCategory) => { @@ -2262,13 +2263,13 @@ export const useMainStore = defineStore({ setBailout(bailoutData) { const params = new URL(document.location.toString()).searchParams; - const currentPage = params.get('issPage'); + const currentPage = params.get('issPage'); this.updatePageData({ page: issPageValues.BAILOUT_PAGE, data: { url: window.location.href, - page: currentPage || 'Unknown Page', + page: currentPage || 'Unknown Page', bailoutCode: bailoutData.code, errorMessage: bailoutData.message, submit: false From b2cb23ca18a13be8c15866aff18c6740c89f321d Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Wed, 10 Apr 2024 17:35:21 -0400 Subject: [PATCH 02/11] Tidying coverage statement again --- .../coverage-statement-page-variations.js | 8 + .../cart-dropdown/cart-dropdown.vue | 7 +- .../coverage-statement.spec.js | 173 ++++++++++++------ .../coverage-statement/coverage-statement.vue | 156 +++++++++------- 4 files changed, 224 insertions(+), 120 deletions(-) create mode 100644 src/constants/coverage-statement-page-variations.js diff --git a/src/constants/coverage-statement-page-variations.js b/src/constants/coverage-statement-page-variations.js new file mode 100644 index 00000000..1f2039e2 --- /dev/null +++ b/src/constants/coverage-statement-page-variations.js @@ -0,0 +1,8 @@ +const coverageStatementPageVariations = Object.freeze({ + DEDUCTIBLE: 0, + ITAC: 1, + NO_COMP: 2, + UNVERIFIED: 3 +}); + +export default coverageStatementPageVariations; diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index e4a85022..11559fb3 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -212,6 +212,7 @@ export default { baseServicePrice() { return getPriceOfLineItems(this.baseServiceLineItems) ?? 0; }, + // TODO update tests isUnverified() { return (useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) || (!useMainStore().isNoComp && !useMainStore().isITAC @@ -248,7 +249,7 @@ export default { let result = 0; - if (useMainStore().payment.insuranceCoverage.isVerified) { + if (!this.isUnverified) { if (useMainStore().isITAC || useMainStore().isNoComp) { result += sumTax(this.baseServiceLineItems); } else { @@ -413,10 +414,6 @@ export default { }, getDisplayed(amount) { return this.isUnverified - // && ((useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) - // || (!useMainStore().isNoComp && !useMainStore().policy.isITAC)) - // && !useMainStore().isNoComp - // && !useMainStore().isITAC ? VERIFYING_COVERAGE : formatAmountInDollars(amount); }, diff --git a/src/layouts/coverage-statement/coverage-statement.spec.js b/src/layouts/coverage-statement/coverage-statement.spec.js index 91ac7ab7..8bbcde26 100644 --- a/src/layouts/coverage-statement/coverage-statement.spec.js +++ b/src/layouts/coverage-statement/coverage-statement.spec.js @@ -10,7 +10,7 @@ import navigationScenarios from '@/router/router-constants/navigation-scenarios. import { getRandomString, getRandomInt } from '@/helpers/data-generation.js'; import settleAllPromises from '@/helpers/layout-helper.js'; import { fetchCmsContentForPage } from '@/helpers/cms-content-helper'; -import { useMainStore } from '@/store/index.js'; +import { useMainStore, getDefaultState } from '@/store'; import getPriceOfLineItems from '@/helpers/price-calculator.js'; jest.mock('@/helpers/layout-helper.js', () => jest.fn()); @@ -90,6 +90,14 @@ function getMountedComponent(mainInitialState = {}, initialData = {}, methodToRu return { wrapper }; } +beforeEach(() => { + const store = useMainStore(); + const defaultState = getDefaultState(); + Object.keys(defaultState).forEach((key) => { + store[key] = defaultState[key]; + }); +}); + describe('coverageStatement.vue-working', () => { test('returns the initial data', () => { // Arrange @@ -164,43 +172,67 @@ describe('coverageStatement.vue-working', () => { }); describe('Computed', () => { describe('verifiedNoComp', () => { - test.each([true, false])('returns false when policyLookupSuccessful false', (isNoComp) => { - // Arrange - const mainInitialState = { - order: { - policy: { - noCoverage: isNoComp, - policyLookupSuccessful: false - } - } - }; - const { wrapper } = getMountedComponent(mainInitialState); + describe('isNoCompQuoteVisible true', () => { + const enableNoCompQuote = true; + test.each([true, false])('returns false when policyLookupSuccessful false', (isNoComp) => { + // Arrange + const mainInitialState = { + order: { + policy: { + noCoverage: isNoComp, + policyLookupSuccessful: false + } + }, + issConfig: { enableNoCompQuote } + }; + const { wrapper } = getMountedComponent(mainInitialState); - // Act - const result = wrapper.vm.verifiedNoComp; + // Act + const result = wrapper.vm.isNoCompQuoteVisible; - // Assert - expect(result).toBeFalsy(); + // Assert + expect(result).toBeFalsy(); + }); + test.each([true, false])('returns false when isNoComp false', (policyLookupSuccessful) => { + // Arrange + const mainInitialState = { + order: { + policy: { + noCoverage: false, + policyLookupSuccessful + } + }, + issConfig: { enableNoCompQuote } + }; + const { wrapper } = getMountedComponent(mainInitialState); + + // Act + const result = wrapper.vm.isNoCompQuoteVisible; + + // Assert + expect(result).toBeFalsy(); + }); + test('returns true when policyLookupSuccessful true, noCoverage true, and enableNoCompQuote true', () => { + // Arrange + const mainInitialState = { + order: { + policy: { + noCoverage: true, + policyLookupSuccessful: true + } + }, + issConfig: { enableNoCompQuote } + }; + const { wrapper } = getMountedComponent(mainInitialState); + + // Act + const result = wrapper.vm.isNoCompQuoteVisible; + + // Assert + expect(result).toBeTruthy(); + }); }); - test.each([true, false])('returns false when isNoComp false', (policyLookupSuccessful) => { - // Arrange - const mainInitialState = { - order: { - policy: { - noCoverage: false, - policyLookupSuccessful - } - } - }; - const { wrapper } = getMountedComponent(mainInitialState); - - // Act - const result = wrapper.vm.verifiedNoComp; - - // Assert - expect(result).toBeFalsy(); - }); - test('returns true when policyLookupSuccessful true and policyLookupSuccessful true', () => { + test('returns false when policyLookupSuccessful true, noCoverage true and enableNoCompQuote false', () => { // Arrange const mainInitialState = { order: { @@ -208,18 +240,21 @@ describe('coverageStatement.vue-working', () => { noCoverage: true, policyLookupSuccessful: true } + }, + issConfig: { + enableNoCompQuote: false } }; const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedNoComp; + const result = wrapper.vm.isNoCompQuoteVisible; // Assert - expect(result).toBeTruthy(); + expect(result).toBeFalsy(); }); }); - describe('verifiedITAC', () => { + describe('isITACQuoteVisible', () => { const priceOfLineItems = 213; test.each([true, false])('returns false when policyLookupSuccessful false', (isNoComp) => { // Arrange @@ -236,7 +271,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedITAC; + const result = wrapper.vm.isITACQuoteVisible; // Assert expect(result).toBeFalsy(); @@ -256,7 +291,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedITAC; + const result = wrapper.vm.isITACQuoteVisible; // Assert expect(result).toBeFalsy(); @@ -281,7 +316,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedITAC; + const result = wrapper.vm.isITACQuoteVisible; // Assert expect(result).toBeFalsy(); @@ -308,7 +343,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedITAC; + const result = wrapper.vm.isITACQuoteVisible; // Assert expect(result).toBeFalsy(); @@ -329,13 +364,13 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedITAC; + const result = wrapper.vm.isITACQuoteVisible; // Assert expect(result).toBeTruthy(); }); }); - describe('verifiedDeductible', () => { + describe('isDeductibleVisible', () => { const servicePrice = 123; describe('claim registration required', () => { const issConfig = { isClaimRegistrationRequired: true }; @@ -351,7 +386,7 @@ describe('coverageStatement.vue-working', () => { }, policy: { noCoverage: false, - policyLookupSuccessful: false + policyLookupSuccessful: true }, currentDeductible: servicePrice - 1 } @@ -365,7 +400,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeFalsy(); @@ -377,7 +412,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeFalsy(); @@ -387,7 +422,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(verifiedDeductibleStoreState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeTruthy(); @@ -420,7 +455,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeFalsy(); @@ -430,7 +465,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(verifiedDeductibleStoreState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeTruthy(); @@ -459,7 +494,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(storeState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeFalsy(); @@ -486,7 +521,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(storeState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeFalsy(); @@ -683,7 +718,7 @@ describe('coverageStatement.vue-working', () => { // Assert expect(result).toBeFalsy(); }); - test('returns true when isNoComp true', () => { + test('returns false when isNoComp true and enableNoCompQuote false', () => { // Arrange const mainInitialState = { order: { @@ -692,6 +727,32 @@ describe('coverageStatement.vue-working', () => { noCoverage: true }, currentDeductible: priceOfLineItems + }, + issConfig: { + enableNoCompQuote: false + } + }; + getPriceOfLineItems.mockImplementationOnce(() => priceOfLineItems); + const { wrapper } = getMountedComponent(mainInitialState); + + // Act + const result = wrapper.vm.isQuoteDisplayed; + + // Assert + expect(result).toBeFalsy(); + }); + test('returns true when isNoComp true and enableNoCompQuote true', () => { + // Arrange + const mainInitialState = { + order: { + policy: { + policyLookupSuccessful: true, + noCoverage: true + }, + currentDeductible: priceOfLineItems + }, + issConfig: { + enableNoCompQuote: true } }; getPriceOfLineItems.mockImplementationOnce(() => priceOfLineItems); @@ -1010,6 +1071,9 @@ describe('coverageStatement.vue-working', () => { noCoverage: true, policyLookupSuccessful: true } + }, + issConfig: { + enableNoCompQuote: true } }; const { wrapper } = getMountedComponent(mainInitialState); @@ -1038,6 +1102,9 @@ describe('coverageStatement.vue-working', () => { noCoverage: true, policyLookupSuccessful: true } + }, + issConfig: { + enableNoCompQuote: true } }; const { wrapper } = getMountedComponent(mainInitialState); diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 9f866e2f..86162da5 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -33,23 +33,23 @@ v-html="secondaryText">
- {{ deductibleForDisplay }} + {{ formatAmountInDollars(deductibleValue) }}
- {{ servicePriceForDisplay }} + {{ formatAmountInDollars(totalServicePrice) }}
{{ deductibleText }}  - {{ deductibleForDisplay }} + {{ formatAmountInDollars(deductibleValue) }}
this.totalServicePrice) { + return pageVariations.ITAC; + } + + if (isClaimRegistrationRequired) { + if (registerClaimSuccessful) { + return pageVariations.DEDUCTIBLE; + } + return pageVariations.UNVERIFIED; + } + return pageVariations.DEDUCTIBLE; + }, coverageStatementSubHeader() { return this.getTextFromCmsWithCustomIfStatements( this.widget.subheader, @@ -249,10 +292,14 @@ export default { ); }, verifiedItacAlertBody() { + const itacCostSavings = this.deductibleValue - this.totalServicePrice; return this.getCmsContent( this.widget.verifiedItacAlert, widgetFields.ALERT_WIDGET.BODY_TEXT - )?.replaceAll('{custom:costSavings}', this.itacCostSavingsForDisplay); + )?.replaceAll( + '{custom:costSavings}', + formatAmountInDollars(itacCostSavings) + ); }, secondaryText() { return this.getTextFromCmsWithCustomIfStatements( @@ -285,50 +332,25 @@ export default { deductibleValue() { return useMainStore().order.currentDeductible; }, - deductibleForDisplay() { - return formatAmountInDollars(this.deductibleValue); + isNoCompQuoteVisible() { + return this.pageVariation === pageVariations.NO_COMP; }, - registerClaimSuccessful() { - return useMainStore().payment.insuranceCoverage.isVerified; + isITACQuoteVisible() { + return this.pageVariation === pageVariations.ITAC; }, - verifiedNoComp() { - return this.policyLookupSuccessful && this.isNoComp && useMainStore().issConfig.enableNoCompQuote; + isDeductibleVisible() { + return this.pageVariation === pageVariations.DEDUCTIBLE; }, - verifiedITAC() { - return this.policyLookupSuccessful - && !this.isNoComp - && this.deductibleValue > this.totalServicePrice; - }, - coveredAndServicePriceAboveOrEqualDeductible() { - return !this.isNoComp && this.totalServicePrice >= this.deductibleValue; - }, - verifiedDeductible() { - return useMainStore().isClaimRegistrationRequired - ? this.registerClaimSuccessful - && this.coveredAndServicePriceAboveOrEqualDeductible - && this.deductibleValue !== null - : this.policyLookupSuccessful - && this.coveredAndServicePriceAboveOrEqualDeductible; - }, - unverified() { - return !this.verifiedDeductible && !this.verifiedITAC && !this.verifiedNoComp; + isUnverifiedVisible() { + return this.pageVariation === pageVariations.UNVERIFIED; }, isADAS() { - const parts = useMainStore().order.lineItems.glassParts; - return parts !== null && !!parts.find((part) => part.requiresRecalibration); + const { glassParts } = useMainStore().order.lineItems; + return glassParts !== null && !!glassParts.find((part) => part.requiresRecalibration); }, totalServicePrice() { return getPriceOfLineItems(this.baseServiceLineItems); }, - servicePriceForDisplay() { - return formatAmountInDollars(this.totalServicePrice); - }, - itacCostSavings() { - return this.deductibleValue - this.totalServicePrice; - }, - itacCostSavingsForDisplay() { - return formatAmountInDollars(this.itacCostSavings); - }, serviceProviderQuestionText() { return this.getCmsContent( this.widget.serviceProviderQuestion, @@ -342,15 +364,23 @@ export default { ); }, isQuoteDisplayed() { - return this.verifiedITAC || this.verifiedNoComp; + return this.isITACQuoteVisible || this.isNoCompQuoteVisible; }, + // TODO can we simplify this shouldRegisterClaim() { - return this.policyLookupSuccessful - && useMainStore().vehicle.policyVehicleId != null - && useMainStore().vehicle.policyVehicleId >= 0 - && useMainStore().isClaimRegistrationRequired - && !useMainStore().isClaimAlreadyRegistered - && (this.coveredAndServicePriceAboveOrEqualDeductible || this.verifiedITAC); + const { + policy, + vehicle, + isClaimRegistrationRequired, + isClaimAlreadyRegistered + } = useMainStore(); + const { policyVehicleId } = vehicle; + return policy.policyLookupSuccessful + && policyVehicleId != null + && policyVehicleId >= 0 + && isClaimRegistrationRequired + && !isClaimAlreadyRegistered + && (this.isDeductibleVisible || this.isITACQuoteVisible); } }, watch: { @@ -373,8 +403,9 @@ export default { return !!useMainStore().vehicle.carId; }, async initializeComponent() { - useMainStore().updatePolicyITACFlag(this.verifiedITAC); - const coverageStatus = this.verifiedITAC || this.verifiedNoComp + useMainStore().updatePolicyITACFlag(this.isITACQuoteVisible); + // TODO how should coverage status be updated + const coverageStatus = this.isITACQuoteVisible || this.isNoCompQuoteVisible ? coverageStatuses.VERIFIED : coverageStatuses.PENDING; useMainStore().updateCoverageStatus(coverageStatus); @@ -384,10 +415,10 @@ export default { this.$refs.loadingModal.hideModal(); }, async navigateForward() { - if (this.unverified || this.verifiedDeductible) { + if (this.isUnverifiedVisible || this.isDeductibleVisible) { useMainStore().updateSupportingItems(this.supportingItems); this.navigateWithScenario(navigationScenarios.CLICKED_FORWARD); - } else if (this.verifiedITAC || this.verifiedNoComp) { + } else if (this.isITACQuoteVisible || this.isNoCompQuoteVisible) { useMainStore().updateIsSafeliteProvider(this.selectedProvider === SAFELITE_PROVIDER); if (this.selectedProvider === SAFELITE_PROVIDER) { useMainStore().updateSupportingItems(this.supportingItems); @@ -411,13 +442,13 @@ export default { getCustomValueFromString(str) { switch (str) { case 'coverageUnverified': - return this.unverified; + return this.isUnverifiedVisible; case 'verifiedDeductible': - return this.verifiedDeductible; + return this.isDeductibleVisible; case 'verifiedITAC': - return this.verifiedITAC; + return this.isITACQuoteVisible; case 'verifiedNoComp': - return this.verifiedNoComp; + return this.isNoCompQuoteVisible; case 'ADASReplace': return !this.isRepair && this.isADAS; case 'nonADASReplace': @@ -425,9 +456,9 @@ export default { case 'nonADASRepair': return this.isRepair; case 'deductibleOverZero': - return this.verifiedDeductible && this.deductibleValue !== 0; // TODO what if deductible is negative? + return this.isDeductibleVisible && this.deductibleValue !== 0; // TODO what if deductible is negative? case 'isDeductibleZero': - return this.verifiedDeductible && this.deductibleValue === 0; + return this.isDeductibleVisible && this.deductibleValue === 0; default: return null; } @@ -437,7 +468,8 @@ export default { }, setBaseServiceLineItems(lineItems) { this.baseServiceLineItems = lineItems; - } + }, + formatAmountInDollars } }; From 954a08972108ca6bdc641be8b164327cd6a9ed99 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 11 Apr 2024 14:52:17 -0400 Subject: [PATCH 03/11] Removing unnecessary --- .../coverage-statement/coverage-statement.vue | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 86162da5..697bc088 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -181,7 +181,8 @@ export default { let hasBailedOut = false; let pricingResults = []; - if (useMainStore().policy.policyLookupSuccessful && useMainStore().vehicle.policyVehicleId >= 0) { + const { policy, vehicle } = useMainStore(); + if (policy.policyLookupSuccessful && vehicle.policyVehicleId >= 0) { await useMainStore().getFinalDeductible(); pricingResults = await useMainStore().getPriceOrderItems(availableLineItems) .catch((err) => { @@ -210,12 +211,7 @@ export default { } }, data() { - const { isRepair } = useMainStore().damage; - // const { policyLookupSuccessful } = useMainStore().policy; return { - isRepair, - // policyLookupSuccessful, - isNoComp: useMainStore().isNoComp, baseServiceLineItems: [], selectedProvider: '', deductibleText: 'Your deductible is', @@ -440,6 +436,7 @@ export default { return processIfStatements(rawText, 'custom', this.getCustomValueFromString); }, getCustomValueFromString(str) { + const { isRepair } = useMainStore().damage; switch (str) { case 'coverageUnverified': return this.isUnverifiedVisible; @@ -450,11 +447,11 @@ export default { case 'verifiedNoComp': return this.isNoCompQuoteVisible; case 'ADASReplace': - return !this.isRepair && this.isADAS; + return !isRepair && this.isADAS; case 'nonADASReplace': - return !this.isRepair && !this.isADAS; + return !isRepair && !this.isADAS; case 'nonADASRepair': - return this.isRepair; + return isRepair; case 'deductibleOverZero': return this.isDeductibleVisible && this.deductibleValue !== 0; // TODO what if deductible is negative? case 'isDeductibleZero': From beadf916a2eff6efaba77eec1137397788de7120 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 11 Apr 2024 15:28:30 -0400 Subject: [PATCH 04/11] Adding is unverified to store --- .../cart-dropdown/cart-dropdown.vue | 10 ++-------- src/layouts/payment-method/payment-method.vue | 8 +------- src/layouts/tpa-submit/tpa-submit.vue | 3 +-- src/store/index.js | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 11559fb3..fea8ad4c 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -212,12 +212,6 @@ export default { baseServicePrice() { return getPriceOfLineItems(this.baseServiceLineItems) ?? 0; }, - // TODO update tests - isUnverified() { - return (useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) - || (!useMainStore().isNoComp && !useMainStore().isITAC - && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus)); - }, subTotal() { const { supportingItems, glassParts, otherParts, vaps, mobileFee } = useMainStore().lineItems; const allLineItems = [ @@ -249,7 +243,7 @@ export default { let result = 0; - if (!this.isUnverified) { + if (!useMainStore().isUnverified) { if (useMainStore().isITAC || useMainStore().isNoComp) { result += sumTax(this.baseServiceLineItems); } else { @@ -413,7 +407,7 @@ export default { this.isExpanded = !this.isExpanded; }, getDisplayed(amount) { - return this.isUnverified + return useMainStore().isUnverified ? VERIFYING_COVERAGE : formatAmountInDollars(amount); }, diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 1fbd3d62..a743b180 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -177,13 +177,7 @@ export default { const piaExperience = this.getSettingValue(experimentSettings.ISS_DISPLAY_PAY_IN_ADVANCE); const isEnabled = piaExperience === 'true'; - return !isEnabled || this.isUnverified; - }, - isUnverified() { - return (useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) - || (!useMainStore().isNoComp - && !useMainStore().isITAC - && (useMainStore().order.currentDeductible == null || !useMainStore().isVerifiedCoverageStatus)); + return !isEnabled || useMainStore().isUnverified; }, paymentMethod() { return this.paymentMethodInternalModel; diff --git a/src/layouts/tpa-submit/tpa-submit.vue b/src/layouts/tpa-submit/tpa-submit.vue index dc19a8d8..590a4645 100644 --- a/src/layouts/tpa-submit/tpa-submit.vue +++ b/src/layouts/tpa-submit/tpa-submit.vue @@ -192,8 +192,7 @@ export default { return this.getCmsContent(this.widget.footer, widgetFields.FOOTER_WIDGET.FORWARD_BUTTON_TEXT); }, isVerified() { - return !(useMainStore().isNoComp && !useMainStore().enableNoCompQuote) - && useMainStore().order.payment.insuranceCoverage.isVerified; + return useMainStore().order.payment.insuranceCoverage.isVerified; }, currentDeductible() { return useMainStore().order.currentDeductible; diff --git a/src/store/index.js b/src/store/index.js index 03d2f8f2..3fd9dd4c 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -268,6 +268,24 @@ export const useMainStore = defineStore({ bailoutCode: (state) => state.applicationUser.pageData[issPageValues.BAILOUT_PAGE]?.bailoutCode, isNoComp: (s) => !!s.order.policy.noCoverage, isITAC: (state) => !!state.order.policy.isITAC, + isUnverified: (s) => { + const { policyLookupSuccessful, payment, currentDeductible } = s.order; + const registerClaimSuccessful = payment.insuranceCoverage.isVerified; + if (!policyLookupSuccessful) { + return true; + } + if (s.isNoComp && !s.issConfig.enableNoCompQuote) { + return true; + } + if (!s.isNoComp && currentDeductible == null) { + return true; + } + if (s.isClaimRegistrationRequired && !registerClaimSuccessful) { + return true; + } + return false; + }, + // TODO condense verification logic isVerifiedCoverageStatus: (state) => state.order.payment.insuranceCoverage.coverageStatus === coverageStatuses.VERIFIED, eventBusItem: (state) => (eventCategory, eventSubCategory) => { const matchedEvent = state.applicationUser.eventBus.find(({ category, subCategory }) => category === eventCategory && subCategory === eventSubCategory); From 4747165e16aba6b6fae57d6793c575a6c7057bbe Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 11 Apr 2024 15:36:25 -0400 Subject: [PATCH 05/11] Reverting --- src/iss-components/cart-dropdown/cart-dropdown.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index fea8ad4c..5d1505e0 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -408,6 +408,8 @@ export default { }, getDisplayed(amount) { return useMainStore().isUnverified + && !useMainStore().isNoComp + && !useMainStore().isITAC ? VERIFYING_COVERAGE : formatAmountInDollars(amount); }, From e3cb1ef37abb8f28432c578b841536577c7a0d56 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 11 Apr 2024 15:43:12 -0400 Subject: [PATCH 06/11] Removing comment --- src/layouts/entry-page/entry-page.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue index 5443ee37..b2da8ab2 100644 --- a/src/layouts/entry-page/entry-page.vue +++ b/src/layouts/entry-page/entry-page.vue @@ -105,7 +105,6 @@ export default { try { if (data.clientFlags) { const clientFlags = JSON.parse(data.clientFlags); - console.log(clientFlags); if (clientFlags.TPAEnabled) { this.mainStore.issConfig.enableTPAFlow = true; From e3852f2b7b85f828f34db36fa4d170fa83295016 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 11 Apr 2024 16:26:33 -0400 Subject: [PATCH 07/11] Updating shouldRegisterClaim tests --- src/layouts/coverage-statement/coverage-statement.spec.js | 6 +++++- src/layouts/coverage-statement/coverage-statement.vue | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/layouts/coverage-statement/coverage-statement.spec.js b/src/layouts/coverage-statement/coverage-statement.spec.js index 8bbcde26..36dde95e 100644 --- a/src/layouts/coverage-statement/coverage-statement.spec.js +++ b/src/layouts/coverage-statement/coverage-statement.spec.js @@ -773,7 +773,10 @@ describe('coverageStatement.vue-working', () => { shouldRegisterClaimStoreStateItac = { order: { payment: { - insuranceCoverage: { claimNumber: null } + insuranceCoverage: { + claimNumber: null, + isVerified: true // Added + } }, policy: { policyLookupSuccessful: true, @@ -862,6 +865,7 @@ describe('coverageStatement.vue-working', () => { // Assert expect(result).toBeFalsy(); }); + test('returns false when insuranceCoverage not verified', () => {}); describe('returns true when policy lookup success, vehicleId set to %p, claim reg req, claim not yet reg', () => { test('and itac', () => { // Arrange diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 697bc088..d63bc50b 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -362,7 +362,6 @@ export default { isQuoteDisplayed() { return this.isITACQuoteVisible || this.isNoCompQuoteVisible; }, - // TODO can we simplify this shouldRegisterClaim() { const { policy, From 1e80a0b486e02cc67a3e2707f83293de0b827663 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Fri, 12 Apr 2024 13:20:49 -0400 Subject: [PATCH 08/11] Adding tests --- .../cart-dropdown/cart-dropdown.spec.js | 330 ++++++++---------- .../payment-method/payment-method.spec.js | 186 +++++++++- src/store/index.js | 2 +- src/store/store.spec.js | 73 ++++ 4 files changed, 387 insertions(+), 204 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.spec.js b/src/iss-components/cart-dropdown/cart-dropdown.spec.js index 69be39a8..80ee78d9 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.spec.js +++ b/src/iss-components/cart-dropdown/cart-dropdown.spec.js @@ -313,115 +313,6 @@ describe('cart-dropdown component', () => { }); }); describe('computed', () => { - describe('isUnverified', () => { - test('returns false when no comp', () => { - // Arrange - const storeData = { - order: { - policy: { - isITAC: false, - noCoverage: true - }, - currentDeductible: null - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.isUnverified; - - // Assert - expect(result).toBeFalsy(); - }); - test('returns false when itac', () => { - // Arrange - const storeData = { - order: { - payment: { - insuranceCoverage: { - coverageStatus: coverageStatuses.PENDING - } - }, - policy: { - isITAC: true - }, - currentDeductible: null - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.isUnverified; - - // Assert - expect(result).toBeFalsy(); - }); - test('returns false when deductible not null and verified coverage status', () => { - // Arrange - const storeData = { - order: { - payment: { - insuranceCoverage: { - coverageStatus: coverageStatuses.VERIFIED - } - }, - policy: { - isITAC: false - }, - currentDeductible: 23 - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.isUnverified; - - // Assert - expect(result).toBeFalsy(); - }); - test('returns true when not no comp, not itac, and deductible is null', () => { - // Arrange - const storeData = { - order: { - policy: { - isITAC: false, - noCoverage: false - }, - currentDeductible: null - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.isUnverified; - - // Assert - expect(result).toBeTruthy(); - }); - test('returns true when not no comp, not itac, and coverage status is not verified', () => { - // Arrange - const storeData = { - order: { - payment: { - insuranceCoverage: { - coverageStatus: coverageStatuses.PENDING - } - }, - policy: { - isITAC: false - }, - currentDeductible: 12 - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.isUnverified; - - // Assert - expect(result).toBeTruthy(); - }); - }); describe('amountDue', () => { test('returns 0 when showAsPaid is true', () => { // Arrange @@ -556,15 +447,22 @@ describe('cart-dropdown component', () => { // Arrange const storeData = { order: { + policyLookupSuccessful: true, + currentDeductible: 250, lineItems: { glassParts: null, otherParts: null, supportingItems: null, vaps: null + }, + payment: { + insuranceCoverage: { isVerified: true } } + }, + issConfig: { + isClaimRegistrationRequired: true } }; - const { wrapper } = getMountedComponent(storeData); // Act @@ -578,6 +476,8 @@ describe('cart-dropdown component', () => { // Arrange const storeData = { order: { + policyLookupSuccessful: true, + currentDeductible: 250, lineItems: { glassParts: [ { partType: 'mock', salesTax: null }, @@ -591,7 +491,13 @@ describe('cart-dropdown component', () => { { partType: 'mock', salesTax: null }, { partType: 'mock', salesTax: undefined } ] + }, + payment: { + insuranceCoverage: { isVerified: true } } + }, + issConfig: { + isClaimRegistrationRequired: true } }; const { wrapper } = getMountedComponent(storeData); @@ -606,6 +512,8 @@ describe('cart-dropdown component', () => { // Arrange const storeData = { order: { + policyLookupSuccessful: true, + currentDeductible: 250, lineItems: { glassParts: [{ partType: 'mock', salesTax: 10 }], supportingItems: [ @@ -619,10 +527,11 @@ describe('cart-dropdown component', () => { vaps: [] }, payment: { - insuranceCoverage: { - isVerified: false - } + insuranceCoverage: { isVerified: false } } + }, + issConfig: { + isClaimRegistrationRequired: true } }; const { wrapper } = getMountedComponent(storeData); @@ -636,15 +545,25 @@ describe('cart-dropdown component', () => { test('Returns sum of vaps sales tax when coverage is unverified and order has vaps.', () => { // Arrange - const storeData = useMainStore().$state; - storeData.order.lineItems.glassParts = [ - { partType: 'mock', salesTax: 10 } - ]; - storeData.order.lineItems.vaps = [ - { partType: 'mock', salesTax: 1 }, - { partType: 'mock', salesTax: 2 } - ]; - storeData.order.payment.insuranceCoverage.isVerified = false; + const storeData = { + order: { + policyLookupSuccessful: true, + currentDeductible: 250, + lineItems: { + glassParts: [{ partType: 'mock', salesTax: 10 }], + vaps: [ + { partType: 'mock', salesTax: 1 }, + { partType: 'mock', salesTax: 2 } + ] + }, + payment: { + insuranceCoverage: { isVerified: false } + } + }, + issConfig: { + isClaimRegistrationRequired: true + } + }; const { wrapper } = getMountedComponent(storeData); @@ -657,16 +576,30 @@ describe('cart-dropdown component', () => { test('Returns Recycle Fee tax when coverage is Verified-Deductible, replace service, and no vaps.', () => { // Arrange - const storeData = useMainStore().$state; - storeData.order.currentDeductible = 250; - storeData.order.lineItems.glassParts = [ - { partType: 'mock', salesTax: 10, sellingPrice: 150 } - ]; - storeData.order.lineItems.supportingItems = [ - { partNumber: partNumberStrings.RECYCLE_FEE, partType: 'mock', salesTax: 10, sellingPrice: 39.99 } - ]; - storeData.order.lineItems.vaps = null; - storeData.order.payment.insuranceCoverage.isVerified = true; + const storeData = { + order: { + policyLookupSuccessful: true, + currentDeductible: 250, + lineItems: { + glassParts: [{ partType: 'mock', salesTax: 10, sellingPrice: 150 }], + supportingItems: [ + { + partNumber: partNumberStrings.RECYCLE_FEE, + partType: 'mock', + salesTax: 10, + sellingPrice: 39.99 + } + ], + vaps: null + }, + payment: { + insuranceCoverage: { isVerified: true } + } + }, + issConfig: { + isClaimRegistrationRequired: true + } + }; const { wrapper } = getMountedComponent(storeData); @@ -679,24 +612,30 @@ describe('cart-dropdown component', () => { test('Returns sum of vaps + recycle fee sales tax when Verified-Deductible, replace service, and has vaps.', () => { // Arrange - const storeData = useMainStore().$state; - storeData.order.currentDeductible = 250; - storeData.order.lineItems.glassParts = [ - { partType: 'mock', salesTax: 10, sellingPrice: 100 } - ]; - storeData.order.lineItems.otherParts = [ - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.supportingItems = [ - { partNumber: partNumberStrings.RECYCLE_FEE, partType: 'mock', salesTax: 10, sellingPrice: 39.99 }, - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.vaps = [ - { partType: 'mock', salesTax: 2 }, - { partType: 'mock', salesTax: 3 } - ]; - storeData.order.payment.insuranceCoverage.isVerified = true; - + const storeData = { + order: { + policyLookupSuccessful: true, + currentDeductible: 250, + lineItems: { + glassParts: [{ partType: 'mock', salesTax: 10, sellingPrice: 100 }], + otherParts: [{ partType: 'mock', salesTax: 10, kitPrice: 100 }], + supportingItems: [ + { partNumber: partNumberStrings.RECYCLE_FEE, partType: 'mock', salesTax: 10, sellingPrice: 39.99 }, + { partType: 'mock', salesTax: 10, kitPrice: 100 } + ], + vaps: [ + { partType: 'mock', salesTax: 2 }, + { partType: 'mock', salesTax: 3 } + ] + }, + payment: { + insuranceCoverage: { isVerified: true } + } + }, + issConfig: { + isClaimRegistrationRequired: true + } + }; const { wrapper } = getMountedComponent(storeData); // Act @@ -708,23 +647,27 @@ describe('cart-dropdown component', () => { test('Returns sum of sales tax when Verified-ITAC.', () => { // Arrange - const storeData = useMainStore().$state; - storeData.order.currentDeductible = 0; - storeData.order.lineItems.glassParts = [ - { partType: 'mock', salesTax: 10, sellingPrice: 100 } - ]; - storeData.order.lineItems.otherParts = [ - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.supportingItems = [ - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.vaps = [ - { partType: 'mock', salesTax: 5 } - ]; - storeData.order.payment.insuranceCoverage.isVerified = true; - storeData.order.policy.isITAC = true; - + const storeData = { + order: { + policyLookupSuccessful: true, + currentDeductible: 0, + lineItems: { + glassParts: [{ partType: 'mock', salesTax: 10, sellingPrice: 100 }], + otherParts: [{ partType: 'mock', salesTax: 10, kitPrice: 100 }], + supportingItems: [{ partType: 'mock', salesTax: 10, kitPrice: 100 }], + vaps: [{ partType: 'mock', salesTax: 5 }] + }, + payment: { + insuranceCoverage: { isVerified: true } + }, + policy: { + isITAC: true + } + }, + issConfig: { + isClaimRegistrationRequired: true + } + }; const { wrapper } = getMountedComponent(storeData); // Act @@ -736,23 +679,28 @@ describe('cart-dropdown component', () => { test('Returns sum of sales tax when Verified-NoComp.', () => { // Arrange - const storeData = useMainStore().$state; - storeData.order.currentDeductible = 0; - storeData.order.lineItems.glassParts = [ - { partType: 'mock', salesTax: 10, sellingPrice: 100 } - ]; - storeData.order.lineItems.otherParts = [ - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.supportingItems = [ - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.vaps = [ - { partType: 'mock', salesTax: 5 } - ]; - storeData.order.payment.insuranceCoverage.isVerified = true; - storeData.order.policy.noCoverage = true; - + const storeData = { + order: { + policyLookupSuccessful: true, + currentDeductible: 0, + lineItems: { + glassParts: [{ partType: 'mock', salesTax: 10, sellingPrice: 100 }], + otherParts: [{ partType: 'mock', salesTax: 10, kitPrice: 100 }], + supportingItems: [{ partType: 'mock', salesTax: 10, kitPrice: 100 }], + vaps: [{ partType: 'mock', salesTax: 5 }] + }, + payment: { + insuranceCoverage: { isVerified: true } + }, + policy: { + noCoverage: true + } + }, + issConfig: { + isClaimRegistrationRequired: true, + enableNoCompQuote: true + } + }; const { wrapper } = getMountedComponent(storeData); // Act @@ -1791,21 +1739,19 @@ describe('cart-dropdown component', () => { // Arrange const storeData = { order: { - payment: { - insuranceCoverage: { - coverageStatus: coverageStatuses.VERIFIED - } - }, policy: { - isITAC: false + isITAC: false, + isNoComp: false }, - currentDeductible: 321 + currentDeductible: 321, + policyLookupSuccessful: true } }; const { wrapper } = getMountedComponent(storeData); const amount = 123; const dollarAmount = '$84.00'; - formatAmountInDollars.mockImplementationOnce(() => dollarAmount); + formatAmountInDollars + .mockImplementationOnce((value) => (value === amount ? dollarAmount : 1)); // Act const result = wrapper.vm.getDisplayed(amount); diff --git a/src/layouts/payment-method/payment-method.spec.js b/src/layouts/payment-method/payment-method.spec.js index 9967aeb7..a3509e14 100644 --- a/src/layouts/payment-method/payment-method.spec.js +++ b/src/layouts/payment-method/payment-method.spec.js @@ -3,20 +3,28 @@ import paymentMethod from '@/layouts/payment-method/payment-method.vue'; // Supporting Files import { shallowMount } from '@vue/test-utils'; +import { createTestingPinia } from '@pinia/testing'; import { getMountOptions } from '@/helpers/unit-test-helper.js'; -import { useMainStore } from '@/store'; +import { useMainStore, getDefaultState } from '@/store'; import issPageValues from '@/router/router-constants/issPage-values'; import { paymentMethods } from '@/constants/payment-method-constants'; import queryStrings from '@/constants/query-strings'; import { experimentSettings } from '@/constants/experiments'; -function setupMocks({ customMountOptions = {}, queryString }) { +function setupMocks({ customMountOptions = {}, queryString }, mainInitialState = {}, customMixin = null) { const mountOptions = getMountOptions({ ...customMountOptions, route: { query: { issPage: issPageValues.PAYMENT_METHOD, ...queryString }, params: {} } }); - const mockMixin = { + const testingPinia = createTestingPinia({ + initialState: { + main: mainInitialState + } + }); + useMainStore(testingPinia); + + const mockMixin = customMixin ?? { methods: { getSettingValue: jest.fn((settingName) => { if (settingName === experimentSettings.ISS_DISPLAY_PAY_IN_ADVANCE) { @@ -28,6 +36,7 @@ function setupMocks({ customMountOptions = {}, queryString }) { } }; + mountOptions.global.plugins = [testingPinia]; mountOptions.global.mixins = [mockMixin]; const wrapper = shallowMount(paymentMethod, mountOptions); @@ -35,13 +44,28 @@ function setupMocks({ customMountOptions = {}, queryString }) { return wrapper; } +beforeEach(() => { + const store = useMainStore(); + const defaultState = getDefaultState(); + Object.keys(defaultState).forEach((key) => { + store[key] = defaultState[key]; + }); +}); + describe('payment-method.vue', () => { describe('Payment Method Type', () => { test('getting payment method when method is pay later', async () => { - // Arrange - const wrapper = setupMocks({}); + // Arrange const payLaterPaymentMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE; - useMainStore().savePaymentMethodChoice(payLaterPaymentMethod); + const store = { + order: { + payment: { + isPayInAdvance: true, + payInAdvanceType: payLaterPaymentMethod + } + } + }; + const wrapper = setupMocks({}, store); // Act const paymethod = wrapper.vm.getPaymentMethodFromStore(); @@ -50,16 +74,22 @@ describe('payment-method.vue', () => { expect(paymethod).toBe(payLaterPaymentMethod); }); test('getting payment method when method is pay in advance', async () => { - // Arrange - const wrapper = setupMocks({}); - const payInAdvancePaymentMethod = paymentMethods.CREDIT_CARD; - useMainStore().savePaymentMethodChoice(payInAdvancePaymentMethod); + // Arrange + const store = { + order: { + payment: { + isPayInAdvance: false, + payInAdvanceType: null + } + } + }; + const wrapper = setupMocks({}, store); // Act const paymethod = wrapper.vm.getPaymentMethodFromStore(); // Assert - expect(paymethod).not.toBe(payInAdvancePaymentMethod); + expect(paymethod).toBeNull(); }); }); @@ -86,4 +116,138 @@ describe('payment-method.vue', () => { expect(payInAdvanceErrorAlert.exists()).toBeFalsy(); }); }); + + describe('isPayInAdvanceDisabled', () => { + let store = {}; + let mixin = { + methods: { + getSettingValue: jest.fn((settingName) => { + if (settingName === experimentSettings.ISS_DISPLAY_PAY_IN_ADVANCE) { + return 'true'; + } + return 'false'; + }) + } + }; + beforeEach(() => { + store = { + order: { + policy: { + isITAC: false, + noCoverage: false + }, + payment: { + insuranceCoverage: { + isVerified: true + } + }, + currentDeductible: 123, + policyLookupSuccessful: true + }, + issConfig: { + isClaimRegistrationRequired: true, + enableNoCompQuote: true + }, + applicationUser: { + experiments: [ + { + settings: { + ISSDisplayPIAInsurance_ISS: 'true' + } + } + ] + } + }; + }); + test('returns true when policyLookupSuccessful false', () => { + // Arrange + store.order.policyLookupSuccessful = false; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeTruthy(); + }); + test('returns true when no comp and enableNoCompQuote false', () => { + // Arrange + store.order.policy.noCoverage = true; + store.issConfig.enableNoCompQuote = false; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeTruthy(); + }); + test('returns true when not no comp and currentDeductible null', () => { + // Arrange + store.order.policy.noCoverage = false; + store.order.currentDeductible = null; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeTruthy(); + }); + test('returns true when isClaimRegistrationRequired true and insurance coverage not verified', () => { + // Arrange + store.order.payment.insuranceCoverage.isVerified = false; + store.issConfig.isClaimRegistrationRequired = true; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeTruthy(); + }); + test('returns false when no comp, enableNoCompQuote true, and currentDeductible null and pia enabled', () => { + // Arrange + store.order.policy.noCoverage = true; + store.issConfig.enableNoCompQuote = true; + store.order.currentDeductible = null; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeFalsy(); + }); + test('returns false when not no comp, currentDeductible not null and pia enabled', () => { + // Arrange + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeFalsy(); + }); + test('returns true when pia not enabled', () => { + // Arrange + mixin = { + methods: { + getSettingValue: jest.fn((settingName) => { + if (settingName === experimentSettings.ISS_DISPLAY_PAY_IN_ADVANCE) { + return 'false'; + } + return 'true'; + }) + } + }; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeTruthy(); + }); + }); }); diff --git a/src/store/index.js b/src/store/index.js index 3fd9dd4c..01542d04 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -270,7 +270,7 @@ export const useMainStore = defineStore({ isITAC: (state) => !!state.order.policy.isITAC, isUnverified: (s) => { const { policyLookupSuccessful, payment, currentDeductible } = s.order; - const registerClaimSuccessful = payment.insuranceCoverage.isVerified; + const registerClaimSuccessful = !!payment.insuranceCoverage.isVerified; if (!policyLookupSuccessful) { return true; } diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 29c5c538..300ea4ea 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -1438,6 +1438,79 @@ describe('Store', () => { }); }); + describe('isUnverified', () => { + beforeEach(() => { + store.order.policy.isITAC = false; + store.order.policy.noCoverage = false; + store.order.payment.insuranceCoverage.isVerified = true; + store.order.currentDeductible = 123; + store.order.policyLookupSuccessful = true; + store.issConfig.isClaimRegistrationRequired = true; + store.issConfig.enableNoCompQuote = true; + }); + it('returns true when policyLookupSuccessful false', () => { + // Arrange + store.order.policyLookupSuccessful = false; + + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeTruthy(); + }); + it('returns true when no comp and enableNoCompQuote false', () => { + // Arrange + store.order.policy.noCoverage = true; + store.issConfig.enableNoCompQuote = false; + + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeTruthy(); + }); + it('returns true when not no comp and currentDeductible null', () => { + // Arrange + store.order.policy.noCoverage = false; + store.order.currentDeductible = null; + + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeTruthy(); + }); + it('returns true when isClaimRegistrationRequired true and insurance coverage not verified', () => { + // Arrange + store.order.payment.insuranceCoverage.isVerified = false; + + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeTruthy(); + }); + it('returns false when no comp, enableNoCompQuote true, and currentDeductible null', () => { + // Arrange + store.order.policy.noCoverage = true; + store.order.currentDeductible = null; + store.issConfig.enableNoCompQuote = true; + + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeFalsy(); + }); + it('returns false when not no comp, currentDeductible not null', () => { + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeFalsy(); + }); + }); + describe('isMobileAppointment', () => { it('Should return true for mobile appointments', () => { // Arrange From 5cfb0581a2482ddc36bb78c89b93ae04692089b5 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Fri, 12 Apr 2024 13:48:29 -0400 Subject: [PATCH 09/11] Updating comment with ticket number --- src/layouts/coverage-statement/coverage-statement.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index d63bc50b..b0cba354 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -172,8 +172,7 @@ export default { const clonedGlassParts = useMainStore().lineItems.glassParts ? JSON.parse(JSON.stringify(useMainStore().lineItems.glassParts)) : []; - // TODO note that recycle fee is being included in this calculation. Assuming - // this is an error + // TODO SSR-1165: Recycle fee needs removed from quote calculation const availableLineItems = [ ...(resultMap.supportingItems ?? []), ...(clonedGlassParts ?? []) From 413bf762bbb2f9b58e3af6b921f8eb18c3d6dc57 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Fri, 12 Apr 2024 14:18:39 -0400 Subject: [PATCH 10/11] Fixing bugs --- .../coverage-statement.spec.js.snap | 3 -- .../coverage-statement.spec.js | 16 +++++--- .../payment-method/payment-method.spec.js | 41 ++++++++++--------- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap b/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap index c16fcaf5..660043a6 100644 --- a/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap +++ b/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap @@ -4,14 +4,11 @@ exports[`coverageStatement.vue-working returns the initial data 1`] = ` Object { "baseServiceLineItems": Array [], "deductibleText": "Your deductible is", - "isNoComp": false, - "isRepair": true, "loadingText": Array [ "Connecting to your insurance company", "Nearly there", "Finishing up", ], - "policyLookupSuccessful": true, "rules": Object { "selectionRequired": "option-required", }, diff --git a/src/layouts/coverage-statement/coverage-statement.spec.js b/src/layouts/coverage-statement/coverage-statement.spec.js index 36dde95e..de23cd1b 100644 --- a/src/layouts/coverage-statement/coverage-statement.spec.js +++ b/src/layouts/coverage-statement/coverage-statement.spec.js @@ -107,8 +107,8 @@ describe('coverageStatement.vue-working', () => { isRepair: true }, policy: { - policyLookupSuccessful: true, - noCoverage: false + noCoverage: false, + policyLookupSuccessful: true } } }; @@ -1237,11 +1237,15 @@ describe('coverageStatement.vue-working', () => { const initialStore = { order: { payment: { - insuranceCoverage: { claimNumber: null } + insuranceCoverage: { + claimNumber: null, + isVerified: true + } }, policy: { - policyLookupSuccessful: true, - noCoverage: false + noCoverage: false, + isITAC: false, + policyLookupSuccessful: true }, vehicle: { policyVehicleId: 1 @@ -1262,6 +1266,8 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(initialStore, {}, mockStoreActions); const next = (method) => { method(wrapper.vm); }; + console.log(wrapper.vm.pageVariation); + // Act coverageStatement.beforeRouteEnter.call(wrapper.vm, undefined, undefined, next); for (let i = 0; i < 7; i++) { diff --git a/src/layouts/payment-method/payment-method.spec.js b/src/layouts/payment-method/payment-method.spec.js index a3509e14..5d1c4eaf 100644 --- a/src/layouts/payment-method/payment-method.spec.js +++ b/src/layouts/payment-method/payment-method.spec.js @@ -56,25 +56,7 @@ describe('payment-method.vue', () => { describe('Payment Method Type', () => { test('getting payment method when method is pay later', async () => { // Arrange - const payLaterPaymentMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE; - const store = { - order: { - payment: { - isPayInAdvance: true, - payInAdvanceType: payLaterPaymentMethod - } - } - }; - const wrapper = setupMocks({}, store); - - // Act - const paymethod = wrapper.vm.getPaymentMethodFromStore(); - - // Assert - expect(paymethod).toBe(payLaterPaymentMethod); - }); - test('getting payment method when method is pay in advance', async () => { - // Arrange + const payLaterMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE; const store = { order: { payment: { @@ -89,7 +71,26 @@ describe('payment-method.vue', () => { const paymethod = wrapper.vm.getPaymentMethodFromStore(); // Assert - expect(paymethod).toBeNull(); + expect(paymethod).toBe(payLaterMethod); + }); + test('getting payment method when method is pay in advance', async () => { + // Arrange + const payInAdvanceMethod = paymentMethods.CREDIT_CARD; + const store = { + order: { + payment: { + isPayInAdvance: true, + payInAdvanceType: payInAdvanceMethod + } + } + }; + const wrapper = setupMocks({}, store); + + // Act + const paymethod = wrapper.vm.getPaymentMethodFromStore(); + + // Assert + expect(paymethod).toBe(payInAdvanceMethod); }); }); From a1a1440a8686d3b150ea60360bc89c74ea8977e5 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Mon, 15 Apr 2024 13:41:36 -0400 Subject: [PATCH 11/11] modifying reset issconfig state --- src/store/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/store/index.js b/src/store/index.js index 01542d04..7bf09725 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1692,6 +1692,7 @@ export const useMainStore = defineStore({ this.issConfig.disabledFields.policyZipCode = false; this.issConfig.disabledFields.dateOfLoss = false; this.issConfig.siteType = null; + this.issConfig.enableNoCompQuote = false; }, disableKeyFields() {