From ade752091f26f358e9b7e940e8ce484c34bbc541 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Fri, 9 Jun 2023 09:36:33 -0400 Subject: [PATCH 01/15] Adding register claim endpoint to endpoints file --- src/constants/endpoints.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index ca2c297f..be1ad311 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -125,7 +125,11 @@ const endpoints = { CoveragePolicyInfo: { url: '/coverage/api/v1/coverage/get-policy-information', method: 'POST' -} + }, + RegisterClaim: { + url: '/coverage/api/v1/coverage/register-claim', + method: 'POST' + } }; export { endpoints }; From e6ae82780aeac09a0c1ba30346a55b2476c8db67 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Fri, 9 Jun 2023 09:55:04 -0400 Subject: [PATCH 02/15] Partial register claim method added to store --- src/store/index.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/store/index.js b/src/store/index.js index 7b7d4dd0..ca36e9a3 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -347,6 +347,28 @@ export const useMainStore = defineStore({ }; } }, + // TODO determine what inputs are required to get a response + registerClaim() { + try { + const response = globalMethods.callHttpClient({ + method: endpoints.RegisterClaim.method, + endpoint: endpoints.RegisterClaim.url, + payload: { + // accountNumber: accountNumber, + // policyNumber: policyNumber, + // dateOfLoss: dateOfLoss, + // zipCode: zipCode + } + }); + return response; + } catch (responseError) { + return { + error: { + status: responseError.status + } + }; + } + }, async lookupVinByPlate(licensePlate, licenseState) { try { const response = await globalMethods.callHttpClient({ From b16fe6656e85d20422d527a972cc315362c19e52 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Wed, 14 Jun 2023 15:48:23 -0400 Subject: [PATCH 03/15] First pass --- src/constants/coverage-statuses.js | 7 + .../coverage-statement/coverage-statement.vue | 58 +++- src/layouts/vehicle-damage/vehicle-damage.vue | 316 +++++++++--------- src/store/index.js | 68 +++- 4 files changed, 278 insertions(+), 171 deletions(-) create mode 100644 src/constants/coverage-statuses.js diff --git a/src/constants/coverage-statuses.js b/src/constants/coverage-statuses.js new file mode 100644 index 00000000..76d46f2e --- /dev/null +++ b/src/constants/coverage-statuses.js @@ -0,0 +1,7 @@ +const coverageStatuses = { + PENDING: "Pending", + NO_COMP: "No Comp", + VERIFIED: "Verified", +}; + +export { coverageStatuses }; \ No newline at end of file diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index f1128f8a..af77b84d 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -58,6 +58,7 @@ import { settleAllPromises } from '@/helpers/layout-helper'; import { getDamageString } from '@/helpers/damage-helper.js'; import { useMainStore } from "@/store"; import vehicleQuestionsMixin from "@/mixins/vehicle-questions-mixin"; +import { coverageStatuses } from '../../constants/coverage-statuses'; export default { name: 'coverage-statement', @@ -76,11 +77,11 @@ export default { }, computed: { bodyText() { - if (useMainStore().order.damage.isRepair) { + if (useMainStore().damage.isRepair) { return this.unverifiedNonADASRepairBodyText; } else { - let parts = useMainStore().order.lineItems.glassParts; + let parts = useMainStore().lineItems.glassParts; // if ADAS, display ADASNextSteps if (parts.filter(part => part.requiresRecalibration).length > 0) { @@ -124,16 +125,65 @@ export default { const resultMap = await settleAllPromises(promiseResultMap); next((vm) => { - vm.setCmsContent(resultMap.cmsContent); + vm.setCmsContent(resultMap.cmsContent); }); }, + async mounted() { + let registerClaimResponse = null; + if (useMainStore().isClaimRegistrationRequired){ + registerClaimResponse = await this.getRegisterClaimResponse(); + } + this.setInsuranceCoverageValues(registerClaimResponse); + }, methods: { arePagePrerequisitesValid() { - if (useMainStore().order.vehicle.vin) { + if (useMainStore().vehicle.vin) { return true; } return false; }, + + async getRegisterClaimResponse() { + try { + registerClaimResponse = await useMainStore().registerClaim(); + const promiseResultMap = [ + { + resultKey: 'registerClaimResponse', + promise: registerClaimResponse + }, + ]; + + const resultMap = await settleAllPromises(promiseResultMap); + return resultMap.registerClaimResponse; + } + catch(responseError) { + return { + error: { + status: responseError.status + } + } + } + }, + + // TODO wait for confirmation from Jeremy + setInsuranceCoverageValues(registerClaimResponse) { + // null => claim reg not required + // success => verified + // failed => not verified + + const registerClaimFailed = registerClaimResponse.error; + if (useMainStore().isClaimRegistrationRequired) { + useMainStore().payment.insuranceCoverage.isVerified = !registerClaimFailed; + useMainStore().payment.insuranceCoverage.coverageStatus = registerClaimFailed + ? coverageStatuses.PENDING + : coverageStatuses.VERIFIED; // TODO include no comp case as well + } + else { // TODO confirm + useMainStore().payment.insuranceCoverage.isVerified = true; + // What about no comp??? + useMainStore().payment.insuranceCoverage.coverageStatus = coverageStatuses.VERIFIED; + } + }, async forwardButtonAction() { return this.navigateForward(); diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 5106203c..c0a43337 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -315,170 +315,170 @@ export default { this.selectedGlassToReplace(), this.selectedWindshieldOptions.selectedWindshieldChipCount); return this.navigateForward(); - }, + }, - navigateForward() { - if (this.mainStore.damage.isRepair) { + navigateForward() { + if (this.mainStore.damage.isRepair) { + this.$router.navigate( + this.navigationScenarios.CLICKED_FORWARD_WITH_REPAIR, + this.$route + ); + } + else { + // If vin already exists, navigate directly to vin-lookup + if (this.mainStore.order.vehicle.vin) { this.$router.navigate( - this.navigationScenarios.CLICKED_FORWARD_WITH_REPAIR, + this.navigationScenarios.CLICKED_FORWARD_WITH_VIN, + this.$route + ); + } else { + this.$router.navigate( + this.navigationScenarios.CLICKED_FORWARD_WITHOUT_VIN, this.$route ); } - else { - // If vin already exists, navigate directly to vin-lookup - if (this.mainStore.order.vehicle.vin) { - this.$router.navigate( - this.navigationScenarios.CLICKED_FORWARD_WITH_VIN, - this.$route - ); - } else { - this.$router.navigate( - this.navigationScenarios.CLICKED_FORWARD_WITHOUT_VIN, - this.$route - ); - } - } - }, - - selectedGlassToReplace() { - const selectedGlassToReplace = []; - if (this.isWindshieldDamageLocation && !this.isWindshieldRepair) { - this.selectedWindshieldOptions.selectedWindshieldReplaceOptions.forEach( - (wsItem) => { - selectedGlassToReplace.push({ - glassLocation: damageLocationsSelected.WINDSHIELD, - glassName: wsItem, - }); - } - ); - } - - if (this.isDriverSideReplace) { - this.sideDoorOptionsData.selectedDriverSideReplaceOptions.forEach((driverItem) => { - selectedGlassToReplace.push({ - glassLocation: damageLocationsSelected.DRIVER, - glassName: driverItem, - }); - }); - } - - if (this.isPassengerSideReplace) { - this.sideDoorOptionsData.selectedPassengerSideReplaceOptions.forEach( - (passengerItem) => { - selectedGlassToReplace.push({ - glassLocation: damageLocationsSelected.PASSENGER, - glassName: passengerItem, - }); - } - ); - } - - if (this.isRearWindowDamageLocation) { - selectedGlassToReplace.push({ - glassLocation: damageLocationsSelected.REAR, - glassName: this.selectedRearReplaceOptions, - }); - } - - return selectedGlassToReplace; - }, - }, - computed: { - isWindshieldDamageLocation() { - return this.selectedDamageLocations.some((selectedDamages) => { - return selectedDamages.toUpperCase() === damageLocationsCms.WINDSHIELD; - }); - }, - isSideDoorDamageLocation() { - return this.selectedDamageLocations.some((selectedDamages) => { - return selectedDamages.toUpperCase() === damageLocationsCms.SIDEDOOR; - }); - }, - isRearWindowDamageLocation() { - return this.selectedDamageLocations.some((selectedDamages) => { - return selectedDamages.toUpperCase() === damageLocationsCms.REARWINDOW; - }); - }, - isWindshieldRepair() { - return ( - this.isWindshieldDamageLocation && - this.selectedWindshieldOptions.selectedWindshieldDamageType === - damageLocationsSelected.REPAIR - ); - }, - isDriverSideReplace() { - if (!this.isSideDoorDamageLocation) return false; - - return this.sideDoorOptionsData.selectedDoorSides.some((selectedDriverSide) => { - return selectedDriverSide.toUpperCase() === damageLocationsCms.DRIVERSIDE; - }); - }, - isPassengerSideReplace() { - if (!this.isSideDoorDamageLocation) return false; - - return this.sideDoorOptionsData.selectedDoorSides.some((selectedPassengerSide) => { - return selectedPassengerSide.toUpperCase() === damageLocationsCms.PASSENGERSIDE; - }); - }, - hasRepairReplaceConflict() { - return ( - this.isWindshieldDamageLocation && - this.selectedDamageLocations.length > 1 && - this.isWindshieldRepair - ); - }, - hasSplitSingleConflict() { - if ( - !this.selectedDamageLocations?.includes("Windshield") || - this.selectedWindshieldOptions.selectedWindshieldDamageType === - damageLocationsSelected.REPAIR || - !this.selectedWindshieldOptions.selectedWindshieldReplaceOptions - ) - return false; - - return ( - this.selectedWindshieldOptions.selectedWindshieldReplaceOptions?.some( - (selectedSingleWindshield) => { - return ( - selectedSingleWindshield.toUpperCase() === - damageLocationsSelected.SINGLE.toUpperCase() - ); - } - ) && - (this.selectedWindshieldOptions.selectedWindshieldReplaceOptions?.some( - (selectedDriverWindshield) => { - return ( - selectedDriverWindshield.toUpperCase() === - damageLocationsSelected.DRIVER.toUpperCase() - ); - } - ) || - this.selectedWindshieldOptions.selectedWindshieldReplaceOptions?.some( - (selectedPassengerWindshield) => { - return ( - selectedPassengerWindshield.toUpperCase() === - damageLocationsSelected.PASSENGER.toUpperCase() - ); - } - )) - ); - }, - shouldDisplayVehicleChangeAlert() { - return this.$route.params[this.routerParams.DISPLAY_VEHICLE_CHANGE_ALERT]; } }, - components: { - siteHeader, - siteFooter, - vehicleBanner, - siteSubHeader, - sideDoorOptions, - damageLocationQuestion, - windshieldOptions, - replaceOptionsQuestion, - Form, - alert, + selectedGlassToReplace() { + const selectedGlassToReplace = []; + if (this.isWindshieldDamageLocation && !this.isWindshieldRepair) { + this.selectedWindshieldOptions.selectedWindshieldReplaceOptions.forEach( + (wsItem) => { + selectedGlassToReplace.push({ + glassLocation: damageLocationsSelected.WINDSHIELD, + glassName: wsItem, + }); + } + ); + } + + if (this.isDriverSideReplace) { + this.sideDoorOptionsData.selectedDriverSideReplaceOptions.forEach((driverItem) => { + selectedGlassToReplace.push({ + glassLocation: damageLocationsSelected.DRIVER, + glassName: driverItem, + }); + }); + } + + if (this.isPassengerSideReplace) { + this.sideDoorOptionsData.selectedPassengerSideReplaceOptions.forEach( + (passengerItem) => { + selectedGlassToReplace.push({ + glassLocation: damageLocationsSelected.PASSENGER, + glassName: passengerItem, + }); + } + ); + } + + if (this.isRearWindowDamageLocation) { + selectedGlassToReplace.push({ + glassLocation: damageLocationsSelected.REAR, + glassName: this.selectedRearReplaceOptions, + }); + } + + return selectedGlassToReplace; }, - }; - + }, + computed: { + isWindshieldDamageLocation() { + return this.selectedDamageLocations.some((selectedDamages) => { + return selectedDamages.toUpperCase() === damageLocationsCms.WINDSHIELD; + }); + }, + isSideDoorDamageLocation() { + return this.selectedDamageLocations.some((selectedDamages) => { + return selectedDamages.toUpperCase() === damageLocationsCms.SIDEDOOR; + }); + }, + isRearWindowDamageLocation() { + return this.selectedDamageLocations.some((selectedDamages) => { + return selectedDamages.toUpperCase() === damageLocationsCms.REARWINDOW; + }); + }, + isWindshieldRepair() { + return ( + this.isWindshieldDamageLocation && + this.selectedWindshieldOptions.selectedWindshieldDamageType === + damageLocationsSelected.REPAIR + ); + }, + isDriverSideReplace() { + if (!this.isSideDoorDamageLocation) return false; + + return this.sideDoorOptionsData.selectedDoorSides.some((selectedDriverSide) => { + return selectedDriverSide.toUpperCase() === damageLocationsCms.DRIVERSIDE; + }); + }, + isPassengerSideReplace() { + if (!this.isSideDoorDamageLocation) return false; + + return this.sideDoorOptionsData.selectedDoorSides.some((selectedPassengerSide) => { + return selectedPassengerSide.toUpperCase() === damageLocationsCms.PASSENGERSIDE; + }); + }, + hasRepairReplaceConflict() { + return ( + this.isWindshieldDamageLocation && + this.selectedDamageLocations.length > 1 && + this.isWindshieldRepair + ); + }, + hasSplitSingleConflict() { + if ( + !this.selectedDamageLocations?.includes("Windshield") || + this.selectedWindshieldOptions.selectedWindshieldDamageType === + damageLocationsSelected.REPAIR || + !this.selectedWindshieldOptions.selectedWindshieldReplaceOptions + ) + return false; + + return ( + this.selectedWindshieldOptions.selectedWindshieldReplaceOptions?.some( + (selectedSingleWindshield) => { + return ( + selectedSingleWindshield.toUpperCase() === + damageLocationsSelected.SINGLE.toUpperCase() + ); + } + ) && + (this.selectedWindshieldOptions.selectedWindshieldReplaceOptions?.some( + (selectedDriverWindshield) => { + return ( + selectedDriverWindshield.toUpperCase() === + damageLocationsSelected.DRIVER.toUpperCase() + ); + } + ) || + this.selectedWindshieldOptions.selectedWindshieldReplaceOptions?.some( + (selectedPassengerWindshield) => { + return ( + selectedPassengerWindshield.toUpperCase() === + damageLocationsSelected.PASSENGER.toUpperCase() + ); + } + )) + ); + }, + shouldDisplayVehicleChangeAlert() { + return this.$route.params[this.routerParams.DISPLAY_VEHICLE_CHANGE_ALERT]; + } + }, + + components: { + siteHeader, + siteFooter, + vehicleBanner, + siteSubHeader, + sideDoorOptions, + damageLocationQuestion, + windshieldOptions, + replaceOptionsQuestion, + Form, + alert, + }, +}; + diff --git a/src/store/index.js b/src/store/index.js index 439544c4..012803e4 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -6,6 +6,7 @@ import { experimentTriggers } from '@/constants/experiments'; import { applicationConfig } from '@/constants/application-config'; import { issPageValues } from '@/router/router-constants/issPage-values'; import { damageLocationsSelected } from '@/constants/damage-locations-selected'; +import { coverageStatuses } from '@/constants/coverage-statuses'; const storeId = 'main'; @@ -48,7 +49,12 @@ const getDefaultState = () => { damageCause: null, damageState: null, damageCity: null, - isDamageGlassOnly: null + isDamageGlassOnly: null, + // TODO set these in code + deductable: { + repair: null, // numerical value; how much customer owes on deductable in repair case + replace: null // numerical value; how much customer owes on deductible in replace case + } }, customer: { address: { @@ -79,7 +85,8 @@ const getDefaultState = () => { payment: { isInsurance: true, insuranceCoverage: { - isVerified: false + isVerified: false, + coverageStatus: coverageStatuses.PENDING } }, referralNumber: null, @@ -125,7 +132,9 @@ export const useMainStore = defineStore({ vehicle: (state) => state.order.vehicle, damage: (state) => state.order.damage, lineItems: (state) => state.order.lineItems, + payment: (state) => state.order.payment, hasAnyNonWindshieldGlassParts: (state) => !state.order.policy.isDamageGlassOnly, + isClaimRegistrationRequired: (state) => state.issConfig.isClaimRegistrationRequired, eventBusItem: (state) => ( eventCategory, eventSubCategory) => { const matchedEvent = state.applicationUser.eventBus.find( @@ -327,7 +336,7 @@ export const useMainStore = defineStore({ } }, getCoveragePolicyInfo({accountNumber, policyNumber, dateOfLoss, zipCode}){ - //todo: replace place holder correlationId with the real thing + //TODO: replace place holder correlationId with the real thing const placeHolderCorrelationId = "00000000-0000-0000-0000-000000000000"; try{ const response = globalMethods.callHttpClient({ @@ -350,17 +359,58 @@ export const useMainStore = defineStore({ }; } }, - // TODO determine what inputs are required to get a response registerClaim() { try { + // TODO: replace place holder correlationId with the real thing + const placeHolderCorrelationId = "00000000-0000-0000-0000-000000000000"; const response = globalMethods.callHttpClient({ method: endpoints.RegisterClaim.method, endpoint: endpoints.RegisterClaim.url, - payload: { - // accountNumber: accountNumber, - // policyNumber: policyNumber, - // dateOfLoss: dateOfLoss, - // zipCode: zipCode + payload: + { + correlationId: placeHolderCorrelationId, + accountNumber: this.issConfig.accountNumber.toString(), + insured: { + firstName: this.order.customer.firstName, + lastName: this.order.customer.lastName, + address: { + addressLine1: this.order.customer.address.streetAddress, + addressLine2: this.order.customer.address.streetAddress2, + city: this.order.customer.address.city, + state: this.order.customer.address.state, + zipCode: this.order.customer.address.zipCode, + country: "US" // TODO set from store + }, + homePhone: { + number: this.order.customer.phoneNumber + } + }, + caller: { + homePhone: {} + }, + policyInfo: { + policyNumber: this.order.policy.policyNumber, + safelitePolicy: { + policies: [] + } + }, + lossInfo: { + dateOfLoss: this.order.policy.dateOfLoss, + // TODO set from store or assume based on user info? + location: { + city: "Somersworth", + state: "NH", + country: "US" + }, + vehicle: { + year: this.order.vehicle.year.toString(), + make: this.order.vehicle.make, + model: this.order.vehicle.model, + vin: this.order.vehicle.vin + }, + }, + // TODO is damage cause sufficient? + damageDescription: this.order.policy.damageCause } }); return response; From 577cc056953a6d210f4ddb140b4ac23c5e63a0e4 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Wed, 21 Jun 2023 16:14:49 -0400 Subject: [PATCH 04/15] Adding deductible setting logic --- src/constants/endorsement-options.js | 9 +++ src/helpers/coverage-statement-helper.js | 37 ++++++++++++ .../coverage-statement/coverage-statement.vue | 57 +++---------------- .../policy-vehicles/policy-vehicles.vue | 33 +++++++++-- src/store/index.js | 34 +++++++---- 5 files changed, 104 insertions(+), 66 deletions(-) create mode 100644 src/constants/endorsement-options.js create mode 100644 src/helpers/coverage-statement-helper.js diff --git a/src/constants/endorsement-options.js b/src/constants/endorsement-options.js new file mode 100644 index 00000000..c343da16 --- /dev/null +++ b/src/constants/endorsement-options.js @@ -0,0 +1,9 @@ +const endorsementOptions = { + EDUCATOR: "Educator", + OEM_APPROVED: "OEM Approved", + FULL_GLASS: "Full Glass Coverage", + PARKING_GUARD: "Parking Guard", + REPAIR_WAIVED: "Repair Waived" +}; + +export { endorsementOptions }; \ No newline at end of file diff --git a/src/helpers/coverage-statement-helper.js b/src/helpers/coverage-statement-helper.js new file mode 100644 index 00000000..187f1ea7 --- /dev/null +++ b/src/helpers/coverage-statement-helper.js @@ -0,0 +1,37 @@ +import { useMainStore } from '@/store'; +import { coverageStatuses } from '@/constants/coverage-statuses'; + +// TODO description +export async function getRegisterClaimResponse() { + try { + const registerClaimResponse = await useMainStore().registerClaim(); + const promiseResultMap = [ + { + resultKey: 'registerClaimResponse', + promise: registerClaimResponse + }, + ]; + + const resultMap = await settleAllPromises(promiseResultMap); + return resultMap.registerClaimResponse; + } + catch(responseError) { + return { + error: { + status: responseError.status + } + } + } +} + +// Deductible/ITAC, No Comp, and Not Verified +// Still need No Comp, ITAC, and Deductible +export function setInsuranceCoverageValues(registerClaimResponse) { + const registerClaimFailed = registerClaimResponse.error; + if (useMainStore().isClaimRegistrationRequired) { + useMainStore().payment.insuranceCoverage.isVerified = !registerClaimFailed; + useMainStore().payment.insuranceCoverage.coverageStatus = registerClaimFailed + ? coverageStatuses.PENDING + : coverageStatuses.VERIFIED; + } +} diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index af77b84d..c785b039 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -58,7 +58,7 @@ import { settleAllPromises } from '@/helpers/layout-helper'; import { getDamageString } from '@/helpers/damage-helper.js'; import { useMainStore } from "@/store"; import vehicleQuestionsMixin from "@/mixins/vehicle-questions-mixin"; -import { coverageStatuses } from '../../constants/coverage-statuses'; +import { getRegisterClaimResponse, setInsuranceCoverageValues } from '@/helpers/coverage-statement-helper'; export default { name: 'coverage-statement', @@ -127,13 +127,12 @@ export default { next((vm) => { vm.setCmsContent(resultMap.cmsContent); }); - }, - async mounted() { - let registerClaimResponse = null; - if (useMainStore().isClaimRegistrationRequired){ - registerClaimResponse = await this.getRegisterClaimResponse(); - } - this.setInsuranceCoverageValues(registerClaimResponse); + + let registerClaimResponse = null; + if (useMainStore().isClaimRegistrationRequired){ + registerClaimResponse = await getRegisterClaimResponse(); + } + setInsuranceCoverageValues(registerClaimResponse); }, methods: { arePagePrerequisitesValid() { @@ -142,48 +141,6 @@ export default { } return false; }, - - async getRegisterClaimResponse() { - try { - registerClaimResponse = await useMainStore().registerClaim(); - const promiseResultMap = [ - { - resultKey: 'registerClaimResponse', - promise: registerClaimResponse - }, - ]; - - const resultMap = await settleAllPromises(promiseResultMap); - return resultMap.registerClaimResponse; - } - catch(responseError) { - return { - error: { - status: responseError.status - } - } - } - }, - - // TODO wait for confirmation from Jeremy - setInsuranceCoverageValues(registerClaimResponse) { - // null => claim reg not required - // success => verified - // failed => not verified - - const registerClaimFailed = registerClaimResponse.error; - if (useMainStore().isClaimRegistrationRequired) { - useMainStore().payment.insuranceCoverage.isVerified = !registerClaimFailed; - useMainStore().payment.insuranceCoverage.coverageStatus = registerClaimFailed - ? coverageStatuses.PENDING - : coverageStatuses.VERIFIED; // TODO include no comp case as well - } - else { // TODO confirm - useMainStore().payment.insuranceCoverage.isVerified = true; - // What about no comp??? - useMainStore().payment.insuranceCoverage.coverageStatus = coverageStatuses.VERIFIED; - } - }, async forwardButtonAction() { return this.navigateForward(); diff --git a/src/layouts/policy-vehicles/policy-vehicles.vue b/src/layouts/policy-vehicles/policy-vehicles.vue index a85cc583..48d585ea 100644 --- a/src/layouts/policy-vehicles/policy-vehicles.vue +++ b/src/layouts/policy-vehicles/policy-vehicles.vue @@ -41,7 +41,8 @@ import BaseFormMixin from '@/mixins/base-form-mixin.js'; import { issPageValues } from "@/router/router-constants/issPage-values"; import { useMainStore } from '@/store'; import { errorMessages } from "@/constants/error-messages"; -import {vehicleSelectionOptions} from "@/constants/vehicle-selection-options"; +import { vehicleSelectionOptions } from "@/constants/vehicle-selection-options"; +import { endorsementOptions } from '../../constants/endorsement-options'; // DEFINE VALIDATION RULES defineRule("option-required", required(errorMessages.OPTION_REQUIRED)); @@ -83,7 +84,17 @@ export default { this.bailout = true; return this.navigateForward(); } - this.vehicleFromLookup = Object.assign(vehicleLookupResponse.data, { vin: this.selectedVehicleVin }); + + this.vehicleFromLookup = Object.assign(vehicleLookupResponse.data, { + vin: this.selectedVehicleVin, + noCoverage: this.noCoverageForSelectedVehicle, + deductible: this.deductibleForSelectedVehicle, + repairWaived: this.repairWaivedForSelectedVehicle + }); + // Update that verified + // If they go backwards select vehicle => forward => one deductible => back to vehicle selection => forward again => right info + // backwards => vehicle unverified => clear coverage info + // keep this in mind this.mainStore.updateVehicle(this.vehicleFromLookup); } return this.navigateForward(); @@ -145,8 +156,22 @@ export default { }, VehiclesFromApi() { return useMainStore().pageData(issPageValues.POLICY_VEHICLES); - }, - }, + }, + noCoverageForSelectedVehicle() { + const vehicle = this.VehiclesFromApi.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); + return vehicle.coverages.length == 0; + }, + deductibleForSelectedVehicle() { + const vehicle = this.VehiclesFromApi.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); + return vehicle?.coverages?.length == 0 ?? true + ? 0 + : vehicle.coverages[0].deductible; + }, + repairWaivedForSelectedVehicle() { + const vehicle = this.VehiclesFromApi.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); + return vehicle.endorsements?.includes(endorsementOptions.REPAIR_WAIVED) ?? false; + } + }, components: { siteHeader, siteFooter, diff --git a/src/store/index.js b/src/store/index.js index 012803e4..e0e18fdd 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -50,11 +50,13 @@ const getDefaultState = () => { damageState: null, damageCity: null, isDamageGlassOnly: null, - // TODO set these in code - deductable: { - repair: null, // numerical value; how much customer owes on deductable in repair case - replace: null // numerical value; how much customer owes on deductible in replace case - } + noCoverage: null, + deductible: { + // if repair waived, then 0, otherwise same as other + repair: null, // numerical value; how much customer owes on deductible in repair case + replace: null // numerical value; how much customer owes on deductible in replace case, + }, + endorsement: [] // List of endorsement_options }, customer: { address: { @@ -396,11 +398,10 @@ export const useMainStore = defineStore({ }, lossInfo: { dateOfLoss: this.order.policy.dateOfLoss, - // TODO set from store or assume based on user info? location: { - city: "Somersworth", - state: "NH", - country: "US" + city: this.order.policy.damageCity, + state: this.order.policy.damageState, + country: "US" // TODO set from store }, vehicle: { year: this.order.vehicle.year.toString(), @@ -409,7 +410,6 @@ export const useMainStore = defineStore({ vin: this.order.vehicle.vin }, }, - // TODO is damage cause sufficient? damageDescription: this.order.policy.damageCause } }); @@ -665,7 +665,7 @@ export const useMainStore = defineStore({ } }); }, - + // TODO when is this called? setVehicle() { return globalMethods .callHttpClient({ @@ -750,6 +750,7 @@ export const useMainStore = defineStore({ this.order.lineItems.vaps = partsData; }, + // TODO Where all will this be called and could it be an issue? updateVehicle(vehicle) { // Assuming that the method caller pass all the properties. // otherwise need to check for undefined for every property. @@ -765,6 +766,12 @@ export const useMainStore = defineStore({ this.order.vehicle.imageVifNumber = vehicle.imageVifNumber; this.order.vehicle.imageColor = vehicle.imageVifColor; + this.order.policy.noCoverage = vehicle.noCoverage; + this.order.policy.deductible.replace = vehicle.deductible; + this.order.policy.deductible.repair = vehicle?.repairWaived ?? false + ? 0 + : vehicle.deductible; + this.resetSupportingItemsState(); this.resetVapsState(); }, @@ -913,7 +920,7 @@ export const useMainStore = defineStore({ this.applicationUser.pageData[pageData.page] = pageData.data; }, updatePolicyData(welcomePageModel) - { + { // TODO add to this? this.order.policy.policyNumber = welcomePageModel?.policyNumber; this.order.policy.policyZipCode = welcomePageModel?.policyZipCode; this.order.policy.dateOfLoss = welcomePageModel?.dateOfLoss; @@ -923,6 +930,9 @@ export const useMainStore = defineStore({ this.order.policy.isDamageGlassOnly = welcomePageModel?.isDamageGlassOnly; this.order.customer.phoneNumber = welcomePageModel?.phoneNumber; this.order.customer.emailAddress = welcomePageModel?.email; + if (!this.issConfig.isClaimRegistrationRequired){ + this.order.insuranceCoverage.isVerified = true; + } }, updatePolicyHolderDetails(customerQuestions) { From 0b4d626d90814af3b262b9d0da9c99ab73819d94 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Wed, 21 Jun 2023 17:14:33 -0400 Subject: [PATCH 05/15] Minor adjustments --- .../policy-vehicles/policy-vehicles.vue | 35 ++++++++++--------- src/store/index.js | 8 ++--- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/layouts/policy-vehicles/policy-vehicles.vue b/src/layouts/policy-vehicles/policy-vehicles.vue index 48d585ea..c0aa9e33 100644 --- a/src/layouts/policy-vehicles/policy-vehicles.vue +++ b/src/layouts/policy-vehicles/policy-vehicles.vue @@ -50,9 +50,11 @@ export default { name: "policy-vehicles", mixins: [BaseFormMixin], data() { - return { - selectedVehicleVin: "", - bailout: false + const policyVehicles = useMainStore().pageData(issPageValues.POLICY_VEHICLES); + return { + policyVehicles: policyVehicles, + selectedVehicleVin: policyVehicles.length == 0 ? "" : policyVehicles[0].vin, + bailout: false } }, async beforeRouteEnter(to, from, next) @@ -64,13 +66,14 @@ export default { { resultKey: "cmsContent", promise: cmsContentPromise, - },]; - //use resultMap to populate layout content. - let resultMap = await settleAllPromises(promiseResultMap); - next((vm) => { - vm.setCmsContent(resultMap.cmsContent); - }); - }, + }, + ]; + //use resultMap to populate layout content. + let resultMap = await settleAllPromises(promiseResultMap); + next((vm) => { + vm.setCmsContent(resultMap.cmsContent); + }); + }, methods: { backButtonAction() { @@ -95,6 +98,7 @@ export default { // If they go backwards select vehicle => forward => one deductible => back to vehicle selection => forward again => right info // backwards => vehicle unverified => clear coverage info // keep this in mind + console.log("Going to update vehicle"); this.mainStore.updateVehicle(this.vehicleFromLookup); } return this.navigateForward(); @@ -139,7 +143,7 @@ export default { computed:{ VehiclesForQuestions() { // Map API result data, to address-vehicles data structure - const vehicles = this.VehiclesFromApi; + const vehicles = this.policyVehicles; const mappedData = vehicles.map((v) => { const maskSymbol = "X"; const vinStart = maskSymbol.repeat(v.vin.length - 6); @@ -154,21 +158,18 @@ export default { }); return mappedData; }, - VehiclesFromApi() { - return useMainStore().pageData(issPageValues.POLICY_VEHICLES); - }, noCoverageForSelectedVehicle() { - const vehicle = this.VehiclesFromApi.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); + const vehicle = this.policyVehicles.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); return vehicle.coverages.length == 0; }, deductibleForSelectedVehicle() { - const vehicle = this.VehiclesFromApi.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); + const vehicle = this.policyVehicles.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); return vehicle?.coverages?.length == 0 ?? true ? 0 : vehicle.coverages[0].deductible; }, repairWaivedForSelectedVehicle() { - const vehicle = this.VehiclesFromApi.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); + const vehicle = this.policyVehicles.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); return vehicle.endorsements?.includes(endorsementOptions.REPAIR_WAIVED) ?? false; } }, diff --git a/src/store/index.js b/src/store/index.js index e0e18fdd..9beed8c2 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -52,7 +52,6 @@ const getDefaultState = () => { isDamageGlassOnly: null, noCoverage: null, deductible: { - // if repair waived, then 0, otherwise same as other repair: null, // numerical value; how much customer owes on deductible in repair case replace: null // numerical value; how much customer owes on deductible in replace case, }, @@ -750,11 +749,9 @@ export const useMainStore = defineStore({ this.order.lineItems.vaps = partsData; }, - // TODO Where all will this be called and could it be an issue? updateVehicle(vehicle) { // Assuming that the method caller pass all the properties. // otherwise need to check for undefined for every property. - this.order.vehicle.carId = vehicle.carId; this.order.vehicle.category = vehicle.category; this.order.vehicle.year = vehicle.year; @@ -766,11 +763,10 @@ export const useMainStore = defineStore({ this.order.vehicle.imageVifNumber = vehicle.imageVifNumber; this.order.vehicle.imageColor = vehicle.imageVifColor; + // These could be undefined this.order.policy.noCoverage = vehicle.noCoverage; this.order.policy.deductible.replace = vehicle.deductible; - this.order.policy.deductible.repair = vehicle?.repairWaived ?? false - ? 0 - : vehicle.deductible; + this.order.policy.deductible.repair = vehicle?.repairWaived ?? false ? 0 : vehicle.deductible; this.resetSupportingItemsState(); this.resetVapsState(); From 662b25e8c43abbca5dc3cbe583b014d6d60a2afa Mon Sep 17 00:00:00 2001 From: brydon1 Date: Mon, 26 Jun 2023 13:55:06 -0400 Subject: [PATCH 06/15] Updating store tests --- src/helpers/coverage-statement-helper.js | 36 +- src/helpers/data-generation.js | 28 ++ .../policy-vehicles/policy-vehicles.vue | 18 +- src/store/index.js | 33 +- src/store/store.spec.js | 380 +++++++++++++----- 5 files changed, 348 insertions(+), 147 deletions(-) create mode 100644 src/helpers/data-generation.js diff --git a/src/helpers/coverage-statement-helper.js b/src/helpers/coverage-statement-helper.js index 187f1ea7..772f3149 100644 --- a/src/helpers/coverage-statement-helper.js +++ b/src/helpers/coverage-statement-helper.js @@ -1,37 +1,27 @@ import { useMainStore } from '@/store'; import { coverageStatuses } from '@/constants/coverage-statuses'; -// TODO description export async function getRegisterClaimResponse() { - try { - const registerClaimResponse = await useMainStore().registerClaim(); - const promiseResultMap = [ - { - resultKey: 'registerClaimResponse', - promise: registerClaimResponse - }, - ]; + const registerClaimResponse = await useMainStore().registerClaim(); + const promiseResultMap = [ + { + resultKey: 'registerClaimResponse', + promise: registerClaimResponse + }, + ]; - const resultMap = await settleAllPromises(promiseResultMap); - return resultMap.registerClaimResponse; - } - catch(responseError) { - return { - error: { - status: responseError.status - } - } - } + const resultMap = await settleAllPromises(promiseResultMap); + return resultMap.registerClaimResponse; } -// Deductible/ITAC, No Comp, and Not Verified -// Still need No Comp, ITAC, and Deductible export function setInsuranceCoverageValues(registerClaimResponse) { - const registerClaimFailed = registerClaimResponse.error; + const registerClaimFailed = registerClaimResponse.isError; if (useMainStore().isClaimRegistrationRequired) { useMainStore().payment.insuranceCoverage.isVerified = !registerClaimFailed; useMainStore().payment.insuranceCoverage.coverageStatus = registerClaimFailed ? coverageStatuses.PENDING - : coverageStatuses.VERIFIED; + : useMainStore().policy.noCoverage + ? coverageStatuses.NO_COMP + : coverageStatuses.VERIFIED; } } diff --git a/src/helpers/data-generation.js b/src/helpers/data-generation.js new file mode 100644 index 00000000..b1371713 --- /dev/null +++ b/src/helpers/data-generation.js @@ -0,0 +1,28 @@ +import { randomUUID } from "node:crypto"; + +export function getRandomString(minLength = 1, maxLength = 100) { + const length = getRandomInt(minLength, maxLength); + let result = ''; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} + +export function getRandomInt(min = 0, max = 1000) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min) + min); // The maximum is exclusive and the minimum is inclusive +} + +export function getRandomGuid() { + return randomUUID(); +} + +export function getRandomBoolean() { + const bools = [true, false]; + const index = getRandomInt(0,2); + return bools[index]; +} \ No newline at end of file diff --git a/src/layouts/policy-vehicles/policy-vehicles.vue b/src/layouts/policy-vehicles/policy-vehicles.vue index c0aa9e33..1e5c766e 100644 --- a/src/layouts/policy-vehicles/policy-vehicles.vue +++ b/src/layouts/policy-vehicles/policy-vehicles.vue @@ -98,7 +98,6 @@ export default { // If they go backwards select vehicle => forward => one deductible => back to vehicle selection => forward again => right info // backwards => vehicle unverified => clear coverage info // keep this in mind - console.log("Going to update vehicle"); this.mainStore.updateVehicle(this.vehicleFromLookup); } return this.navigateForward(); @@ -160,13 +159,20 @@ export default { }, noCoverageForSelectedVehicle() { const vehicle = this.policyVehicles.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); - return vehicle.coverages.length == 0; + return vehicle.coverages?.length == 0 ?? true; }, deductibleForSelectedVehicle() { - const vehicle = this.policyVehicles.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); - return vehicle?.coverages?.length == 0 ?? true - ? 0 - : vehicle.coverages[0].deductible; + const vehicle = this.policyVehicles.find((vehicle) => { return vehicle?.vin == this.selectedVehicleVin; }); + if (!vehicle){ + return undefined; + } + // return 0 in (vehicle.coverages ?? []) + // ? vehicle?.coverages[0].deductible + // : 0; + + return vehicle.coverages?.length ?? false + ? vehicle?.coverages[0].deductible + : 0; }, repairWaivedForSelectedVehicle() { const vehicle = this.policyVehicles.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); diff --git a/src/store/index.js b/src/store/index.js index 9beed8c2..4b2a0f69 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -134,6 +134,7 @@ export const useMainStore = defineStore({ damage: (state) => state.order.damage, lineItems: (state) => state.order.lineItems, payment: (state) => state.order.payment, + policy: (state) => state.order.policy, hasAnyNonWindshieldGlassParts: (state) => !state.order.policy.isDamageGlassOnly, isClaimRegistrationRequired: (state) => state.issConfig.isClaimRegistrationRequired, eventBusItem: (state) => ( eventCategory, eventSubCategory) => { @@ -414,11 +415,9 @@ export const useMainStore = defineStore({ }); return response; } catch (responseError) { - return { - error: { - status: responseError.status - } - }; + return Promise.resolve({ + isError: true + }) } }, async lookupVinByPlate(licensePlate, licenseState) { @@ -554,7 +553,7 @@ export const useMainStore = defineStore({ console.error(error); return []; }); - }, + }, async getRainDefense() { return globalMethods @@ -664,18 +663,18 @@ export const useMainStore = defineStore({ } }); }, - // TODO when is this called? + setVehicle() { return globalMethods - .callHttpClient({ - methods: endpoints.GetVehicle.method, - endpoint: `${endpoints.GetVehicle.url}/${this.order.vehicle.year}/${this.order.vehicle.make}/${this.order.vehicle.model}/${this.order.vehicle.style}`, - payload: {} - }) - .then((response) => { - this.updateVehicle(response.data); - return response; - }); + .callHttpClient({ + methods: endpoints.GetVehicle.method, + endpoint: `${endpoints.GetVehicle.url}/${this.order.vehicle.year}/${this.order.vehicle.make}/${this.order.vehicle.model}/${this.order.vehicle.style}`, + payload: {} + }) + .then((response) => { + this.updateVehicle(response.data); + return response; + }); }, saveVehicleDamage(isWindshieldRepair, selectedGlassToReplace, selectedWindshieldChipCount) { @@ -752,7 +751,7 @@ export const useMainStore = defineStore({ updateVehicle(vehicle) { // Assuming that the method caller pass all the properties. // otherwise need to check for undefined for every property. - this.order.vehicle.carId = vehicle.carId; + this.vehicle.carId = vehicle.carId; this.order.vehicle.category = vehicle.category; this.order.vehicle.year = vehicle.year; this.order.vehicle.make = vehicle.make; diff --git a/src/store/store.spec.js b/src/store/store.spec.js index e282f849..e8d9a3b2 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -1,8 +1,9 @@ import { useMainStore } from '@/store'; import { createApp } from 'vue'; -import { createPinia } from "pinia"; +import { setActivePinia, createPinia } from "pinia"; import globalMethods from "@/global-methods"; import App from '@/App.vue'; +import { getRandomString, getRandomGuid, getRandomInt, getRandomBoolean } from '../helpers/data-generation'; describe("Store", () => { @@ -14,6 +15,7 @@ describe("Store", () => { vueApp.use(pinia); beforeEach(() => { + setActivePinia(createPinia()); store = useMainStore(); store.applicationUser.eventBus = []; jest.resetAllMocks(); @@ -27,31 +29,47 @@ describe("Store", () => { }); it("Should add events to the bus", () => { + // Arrange + const category = getRandomString(1, 25); + const subCategory = getRandomString(5, 20); + const isDismissible = getRandomBoolean(); + const copy = getRandomString(5, 25); + const headline = getRandomString(5, 25); + const type = getRandomString(5, 15); let event = { - category: "TestCategory", - subCategory: "TestSubCategory", + category: category, + subCategory: subCategory, eventValue: { - isDismissible: true, - messageCopy: "You can get a quote by starting on this page.", - messageHeadline: "We're sorry, something went wrong.", - type: "testType", + isDismissible: isDismissible, + messageCopy: copy, + messageHeadline: headline, + type: type, }, }; + // Act store.addEventToBus(event); + // Assert expect(store.applicationUser.eventBus[0]).toEqual(event); }); it("Should remove events from the bus", () => { + // Arrange + const category = getRandomString(1, 25); + const subCategory = getRandomString(5, 20); + const isDismissible = getRandomBoolean(); + const copy = getRandomString(5, 25); + const headline = getRandomString(5, 25); + const type = getRandomString(5, 15); let event = { - category: "TestCategory", - subCategory: "TestSubCategory", + category: category, + subCategory: subCategory, eventValue: { - isDismissible: true, - messageCopy: "You can get a quote by starting on this page.", - messageHeadline: "We're sorry, something went wrong.", - type: "testType", + isDismissible: isDismissible, + messageCopy: copy, + messageHeadline: headline, + type: type, }, }; @@ -59,164 +77,324 @@ describe("Store", () => { expect(store.applicationUser.eventBus.length).toBe(1); + // Act store.removeEventFromBus({ category: event.category, subCategory: event.subCategory }) + // Assert expect(store.applicationUser.eventBus.length).toBe(0); }); it("Should return correct event using the getter function eventBusItem", () => { + // Arrange + const category = getRandomString(1, 25); + const subCategory = getRandomString(5, 20); + const isDismissible = getRandomBoolean(); + const copy = getRandomString(5, 25); + const headline = getRandomString(5, 25); + const type = getRandomString(5, 15); let event = { - category: "TestCategory", - subCategory: "TestSubCategory", + category: category, + subCategory: subCategory, eventValue: { - isDismissible: true, - messageCopy: "You can get a quote by starting on this page.", - messageHeadline: "We're sorry, something went wrong.", - type: "testType", + isDismissible: isDismissible, + messageCopy: copy, + messageHeadline: headline, + type: type, }, }; store.addEventToBus(event); + // Act const actual = store.eventBusItem(event.category, event.subCategory) + // Assert expect(actual).toEqual(event.eventValue); }); it("UpdateVehicle should merge vehicle with response object", () => { - store.order.vehicle = { - year: 2020, - make: "Honda", - model: "Civic", - style: "4 door sedan", - carId: null, - category: null, - vin: null, - imageUrl: null, - imageVifNumber: null, - imageColor: null, + // Arrange + const carId = getRandomString(10,14); + const category = getRandomString(3,7); + const year = getRandomInt(1960, 2023); + const make = getRandomString(4,10); + const model = getRandomString(4,10); + const style = getRandomString(4,15); + const imageUrl = getRandomString(50,100); + const imageVifNumber = getRandomInt(10000,99999).toString(); + const imageColor = getRandomString(4,10); + const providedVehicle = { + carId: carId, + category: category, + year: year, + make: make, + model: model, + style: style, + imageUrl: imageUrl, + imageVifNumber: imageVifNumber, + imageVifColor: imageColor }; - const response = {data: { - "carId": "CR00069299", - "category": "CAR", - "year": 2020, - "make": "Honda", - "model": "Civic", - "style": "4 door sedan", - "imageUrl": "https://dbhdyzvm8lm25.cloudfront.net/color_0320_032/MY2020/13996/13996_cc0320_032_WX.jpg", - "imageVifNumber": "13996", - "imageVifColor": "white" + const expectedVehicle = { + carId: carId, + category: category, + year: year, + make: make, + model: model, + style: style, + imageUrl: imageUrl, + imageVifNumber: imageVifNumber, + imageColor: imageColor + } + + // Act + store.updateVehicle(providedVehicle); + + // Assert + expect(store.order.vehicle).toMatchObject(expectedVehicle); + }); + + it("UpdateVehicle should set policy values appropriately with repair waived", () => { + // Arrange + const noCoverage = getRandomBoolean(); + const deductible = getRandomInt(1,500); + const vehicle = { + noCoverage: noCoverage, + deductible: deductible, + repairWaived: true + }; + + const expectedPolicy = { + noCoverage: noCoverage, + deductible: { + replace: deductible, + repair: 0 } }; - store.updateVehicle(response.data); + // Act + store.updateVehicle(vehicle); - expect(store.order.vehicle.imageUrl).toEqual(response.data.imageUrl); - expect(store.order.vehicle.imageVifNumber).toEqual(response.data.imageVifNumber); - expect(store.order.vehicle.style).toEqual(response.data.style); + // Assert + expect(store.order.policy).toMatchObject(expectedPolicy); }); - it("setVehicle should call globalMethods.callHttpClient", () => { - store.order.vehicle = jest.fn(); + it("UpdateVehicle should set policy values appropriately with repair not waived", () => { + // Arrange + const noCoverage = getRandomBoolean(); + const deductible = getRandomInt(1,500); + const vehicle = { + noCoverage: noCoverage, + deductible: deductible, + repairWaived: false + }; - const response = {data: { - "carId": "CR00069299", - "category": "CAR", - "year": 2020, - "make": "Honda", - "model": "Civic", - "style": "4 door sedan", - "imageUrl": "https://dbhdyzvm8lm25.cloudfront.net/color_0320_032/MY2020/13996/13996_cc0320_032_WX.jpg", - "imageVifNumber": "13996", - "imageVifColor": "white" + const expectedPolicy = { + noCoverage: noCoverage, + deductible: { + replace: deductible, + repair: deductible + } + }; + + // Act + store.updateVehicle(vehicle); + + // Assert + expect(store.order.policy).toMatchObject(expectedPolicy); + }); + + // TODO update test to work also checking store values + it("setVehicle should call globalMethods.callHttpClient", () => { + // Arrange + const carId = getRandomString(10,14); + const category = getRandomString(3,7); + const year = getRandomInt(1960, 2023); + const make = getRandomString(4,10); + const model = getRandomString(4,10); + const style = getRandomString(4,15); + const imageUrl = getRandomString(50,100); + const imageVifNumber = getRandomInt(10000,99999).toString(); + const imageColor = getRandomString(4,10); + const response = { + data: { + carId: carId, + category: category, + year: year, + make: make, + model: model, + style: style, + imageUrl: imageUrl, + imageVifNumber: imageVifNumber, + imageVifColor: imageColor } }; globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(response)); - - store.setVehicle(); - - expect(globalMethods.callHttpClient).toHaveBeenCalled(); - }); - - it("saveVehicleDamage, should update damage", () => { - // Arrange - store.order.damage = { - glassToReplace: [{ glassName: "Single", glassLocation: "Windshield" }], - }; // Act - store.saveVehicleDamage( false, - [{ glassName: "Rear", glassLocation: "quarter" }], - 0); + const returned = store.setVehicle(); // Assert - expect(store.order.damage.glassToReplace).toEqual([{ glassName: "Rear", glassLocation: "quarter" }]); - expect(store.order.damage.isRepair).toEqual(false); - expect(store.order.damage.numberOfChips).toEqual(null); + expect(globalMethods.callHttpClient).toHaveBeenCalled(); + expect(returned).resolves.toMatchObject(response); + }); + + it("saveVehicleDamage with windshield repair should update damage with number of chips not null", () => { + // Arrange + const glassName = getRandomString(4,10); + const glassLocation = getRandomString(5,15); + const isWindshieldRepair = true; + const selectedGlassToReplace = [{ + glassName: glassName, + glassLocation: glassLocation + }]; + const chipCount = getRandomInt(0,3).toString(); + + // Act + store.saveVehicleDamage(isWindshieldRepair, selectedGlassToReplace, chipCount); + + // Assert + expect(store.order.damage.glassToReplace).toEqual(selectedGlassToReplace); + expect(store.order.damage.isRepair).toEqual(isWindshieldRepair); + expect(store.order.damage.numberOfChips).toEqual(chipCount); + }); + + it("saveVehicleDamage without windshield repair should update damage with number of chips null", () => { + // Arrange + const glassName = getRandomString(4,10); + const glassLocation = getRandomString(5,15); + const isWindshieldRepair = false; + const selectedGlassToReplace = [{ + glassName: glassName, + glassLocation: glassLocation + }]; + const chipCount = getRandomInt(0,3); + + const expectedChipCount = null; + + // Act + store.saveVehicleDamage(isWindshieldRepair, selectedGlassToReplace, chipCount); + + // Assert + expect(store.order.damage.glassToReplace).toEqual(selectedGlassToReplace); + expect(store.order.damage.isRepair).toEqual(isWindshieldRepair); + expect(store.order.damage.numberOfChips).toEqual(expectedChipCount); }); it("should return registration data if available", () => { //Arrange + const streetAddress = getRandomString(5,15); + const city = getRandomString(5,15); + const state = getRandomString(5,10); + const zipCode = getRandomInt(10000,99999).toString(); + const firstName = getRandomString(5,20); + const lastName = getRandomString(5,20); const expected = { addressQuestions: { - streetAddress: "test", - city: "city", - state: "state", - zipCode: "zip", + streetAddress: streetAddress, + city: city, + state: state, + zipCode: zipCode, }, - firstName: "1stName", - lastName: "Surname", + firstName: firstName, + lastName: lastName, } store.order.vehicle.registration = { licensePlate: null, - address: "test", - city: "city", - state: "state", - zipCode: "zip", - firstName: "1stName", - lastName: "Surname", + address: streetAddress, + city: city, + state: state, + zipCode: zipCode, + firstName: firstName, + lastName: lastName, }; //Act const actual = store.customerData; - //Assert + //Assert expect(actual).toEqual(expected); }); it("should return customer data if registration data unavailable", () => { //Arrange + const address = getRandomString(1,25); + const city = getRandomString(5,20); + const state = getRandomString(4,20); + const zipCode = getRandomInt(10000, 99999).toString(); + const firstName = getRandomString(5,25); + const lastName = getRandomString(5,25); const expected = { addressQuestions: { - streetAddress: "test", - city: "city", - state: "state", - zipCode: "zip", + streetAddress: address, + city: city, + state: state, + zipCode: zipCode, }, - firstName: "1stName", - lastName: "Surname", + firstName: firstName, + lastName: lastName, } store.order.vehicle.registration.address = null; store.order.customer = { - licensePlate: null, - address: "test", - city: "city", - state: "state", - zipCode: "zip", - firstName: "1stName", - lastName: "Surname", + address: { + streetAddress: address, + city: city, + state: state, + zipCode: zipCode + }, + firstName: firstName, + lastName: lastName }; //Act const actual = store.customerData; - //Assert - expect(actual).toEqual(expected); + //Assert + expect(actual).toMatchObject(expected); }); + describe("registerClaim method", () => { + it("successful response results in expected data returned", () => { + // Arrange + const response = { + data: { + claimantId: null, + claimNumber: getRandomString(9, 9), + correlationId: getRandomGuid(), + isSuccess: true, + isError: false, + successMessage: getRandomString(9, 9), + deductible: 0 + } + }; + + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(response)); + + // Act + const registerClaimPromise = store.registerClaim(); + + // Asserts + expect(globalMethods.callHttpClient).toHaveBeenCalled(); + expect(registerClaimPromise).resolves.toMatchObject(response); + expect(registerClaimPromise).resolves.not.toHaveProperty('error'); + }); + + it("Call to client returns exception, resulting in object with error property being returned", () => { + // Arrange + globalMethods.callHttpClient = jest.fn().mockImplementation(() => { + throw new Error('Register claim call failed'); + }); + + // Act + const registerClaimPromise = store.registerClaim(); + + // Asserts + expect(globalMethods.callHttpClient).toHaveBeenCalled(); + expect(registerClaimPromise).resolves.toHaveProperty('error'); + }); + }) }); \ No newline at end of file From 270d26dc5187c839b26b5c25cb6fb1cf73c51223 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Mon, 26 Jun 2023 15:07:05 -0400 Subject: [PATCH 07/15] Moving setInsuranceCoverageValues to store --- src/store/index.js | 12 +++++++ src/store/store.spec.js | 76 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index 4b2a0f69..bf5b1d0b 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -677,6 +677,18 @@ export const useMainStore = defineStore({ }); }, + setInsuranceCoverageValues(registerClaimResponse) { + const registerClaimFailed = registerClaimResponse.isError; + if (this.issConfig.isClaimRegistrationRequired) { + this.order.payment.insuranceCoverage.isVerified = !registerClaimFailed; + this.order.payment.insuranceCoverage.coverageStatus = registerClaimFailed + ? coverageStatuses.PENDING + : useMainStore().policy.noCoverage + ? coverageStatuses.NO_COMP + : coverageStatuses.VERIFIED; + } + }, + saveVehicleDamage(isWindshieldRepair, selectedGlassToReplace, selectedWindshieldChipCount) { const selectedGlassPassedInSorted = selectedGlassToReplace.slice().sort(); const isGlassToReplaceTheSame = diff --git a/src/store/store.spec.js b/src/store/store.spec.js index e8d9a3b2..311b235d 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -4,7 +4,7 @@ import { setActivePinia, createPinia } from "pinia"; import globalMethods from "@/global-methods"; import App from '@/App.vue'; import { getRandomString, getRandomGuid, getRandomInt, getRandomBoolean } from '../helpers/data-generation'; - +import { coverageStatuses } from "@/constants/coverage-statuses.js"; describe("Store", () => { @@ -240,6 +240,74 @@ describe("Store", () => { expect(returned).resolves.toMatchObject(response); }); + describe("setInsuranceCoverageValues method", () => { + it("claim registration not required => nothing is updated", () => { + // Arrange + store.issConfig.isClaimRegistrationRequired = false; + const registerClaimResponse = { + isError: false + }; + const oldIsVerified = null; + store.payment.insuranceCoverage.isVerified = oldIsVerified; + const oldCoverageStatus = coverageStatuses.NO_COMP; + store.payment.insuranceCoverage.coverageStatus = oldCoverageStatus; + + // Act + store.setInsuranceCoverageValues(registerClaimResponse); + + // Assert + expect(store.payment.insuranceCoverage.isVerified).toBe(oldIsVerified); + expect(store.payment.insuranceCoverage.coverageStatus).toBe(oldCoverageStatus); + }) + + it("Register Claim fails => isVerified false and coverage status pending", () =>{ + // Arrange + store.issConfig.isClaimRegistrationRequired = true; + const registerClaimResponse = { + isError: true + }; + + // Act + store.setInsuranceCoverageValues(registerClaimResponse); + + // Assert + expect(store.payment.insuranceCoverage.isVerified).toBe(false); + expect(store.payment.insuranceCoverage.coverageStatus).toBe(coverageStatuses.PENDING); + }) + + it("Register Claim success and no coverage => isVerified true and coverage status no comp", () => { + // Arrange + store.issConfig.isClaimRegistrationRequired = true; + const registerClaimResponse = { + isError: false + }; + store.policy.noCoverage = true; + + // Act + store.setInsuranceCoverageValues(registerClaimResponse); + + // Assert + expect(store.payment.insuranceCoverage.isVerified).toBe(true); + expect(store.payment.insuranceCoverage.coverageStatus).toBe(coverageStatuses.NO_COMP); + }) + + it("Register Claim success and coverage => isVerified true and coverage status verified", () => { + // Arrange + store.issConfig.isClaimRegistrationRequired = true; + const registerClaimResponse = { + isError: false + }; + store.policy.noCoverage = false; + + // Act + store.setInsuranceCoverageValues(registerClaimResponse); + + // Assert + expect(store.payment.insuranceCoverage.isVerified).toBe(true); + expect(store.payment.insuranceCoverage.coverageStatus).toBe(coverageStatuses.VERIFIED); + }) + }) + it("saveVehicleDamage with windshield repair should update damage with number of chips not null", () => { // Arrange const glassName = getRandomString(4,10); @@ -249,7 +317,7 @@ describe("Store", () => { glassName: glassName, glassLocation: glassLocation }]; - const chipCount = getRandomInt(0,3).toString(); + const chipCount = getRandomInt(0,3); // Act store.saveVehicleDamage(isWindshieldRepair, selectedGlassToReplace, chipCount); @@ -380,7 +448,7 @@ describe("Store", () => { // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalled(); expect(registerClaimPromise).resolves.toMatchObject(response); - expect(registerClaimPromise).resolves.not.toHaveProperty('error'); + expect(registerClaimPromise).resolves.not.toHaveProperty('isError'); }); it("Call to client returns exception, resulting in object with error property being returned", () => { @@ -394,7 +462,7 @@ describe("Store", () => { // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalled(); - expect(registerClaimPromise).resolves.toHaveProperty('error'); + expect(registerClaimPromise).resolves.toHaveProperty('isError'); }); }) }); \ No newline at end of file From 044a2c279823cb73110c39c3439f605908abf8b8 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Wed, 28 Jun 2023 11:58:51 -0400 Subject: [PATCH 08/15] Finishing unit tests --- src/helpers/coverage-statement-helper.js | 27 -- src/helpers/data-generation.js | 2 +- .../coverage-statement.spec.js | 94 ++-- .../coverage-statement/coverage-statement.vue | 17 +- .../policy-vehicles/policy-vehicles.spec.js | 452 +++++++++++++----- .../policy-vehicles/policy-vehicles.vue | 56 +-- src/store/index.js | 128 +++-- src/store/store.spec.js | 126 ++--- 8 files changed, 542 insertions(+), 360 deletions(-) delete mode 100644 src/helpers/coverage-statement-helper.js diff --git a/src/helpers/coverage-statement-helper.js b/src/helpers/coverage-statement-helper.js deleted file mode 100644 index 772f3149..00000000 --- a/src/helpers/coverage-statement-helper.js +++ /dev/null @@ -1,27 +0,0 @@ -import { useMainStore } from '@/store'; -import { coverageStatuses } from '@/constants/coverage-statuses'; - -export async function getRegisterClaimResponse() { - const registerClaimResponse = await useMainStore().registerClaim(); - const promiseResultMap = [ - { - resultKey: 'registerClaimResponse', - promise: registerClaimResponse - }, - ]; - - const resultMap = await settleAllPromises(promiseResultMap); - return resultMap.registerClaimResponse; -} - -export function setInsuranceCoverageValues(registerClaimResponse) { - const registerClaimFailed = registerClaimResponse.isError; - if (useMainStore().isClaimRegistrationRequired) { - useMainStore().payment.insuranceCoverage.isVerified = !registerClaimFailed; - useMainStore().payment.insuranceCoverage.coverageStatus = registerClaimFailed - ? coverageStatuses.PENDING - : useMainStore().policy.noCoverage - ? coverageStatuses.NO_COMP - : coverageStatuses.VERIFIED; - } -} diff --git a/src/helpers/data-generation.js b/src/helpers/data-generation.js index b1371713..9bd607f5 100644 --- a/src/helpers/data-generation.js +++ b/src/helpers/data-generation.js @@ -1,7 +1,7 @@ import { randomUUID } from "node:crypto"; export function getRandomString(minLength = 1, maxLength = 100) { - const length = getRandomInt(minLength, maxLength); + const length = getRandomInt(minLength, maxLength + 1); let result = ''; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; const charactersLength = characters.length; diff --git a/src/layouts/coverage-statement/coverage-statement.spec.js b/src/layouts/coverage-statement/coverage-statement.spec.js index 92cc7215..7ca5a0da 100644 --- a/src/layouts/coverage-statement/coverage-statement.spec.js +++ b/src/layouts/coverage-statement/coverage-statement.spec.js @@ -10,6 +10,8 @@ import vehicleQuestionsMixin from "@/mixins/vehicle-questions-mixin"; import { applicationConfig } from "@/constants/application-config"; import { fetchCmsContentForPage, setupModalLinks } from "@/helpers/cms-content-helper"; import { settleAllPromises } from "@/helpers/layout-helper.js"; +import { createTestingPinia } from '@pinia/testing'; +import { getRandomString } from '@/helpers/data-generation.js'; jest.mock("@/helpers/damage-helper", () => ({ getDamageString: jest.fn(), @@ -31,7 +33,8 @@ describe("coverage-statement.vue...", () => { test("Should return true for valid page requisites if vin exists", () => { // Arrange const { wrapper } = setupMocks({}); - + useMainStore().order.vehicle.vin = getRandomString(5,20); + // Act let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); @@ -76,7 +79,7 @@ describe("coverage-statement.vue...", () => { useMainStore().order.damage.isRepair = true; // Assert - expect(wrapper.vm.unverifiedNonADASRepairBodyText).toEqual("NonADASRepairTestReturn"); + expect(wrapper.vm.bodyText).toEqual("NonADASRepairTestReturn"); }) test("If damage is NonADAS Replace, display NonADASReplace coverage statement", async () => { @@ -85,8 +88,16 @@ describe("coverage-statement.vue...", () => { mixins: [mockMixin], }); + useMainStore().lineItems.glassParts = + [ + { + requiresRecalibration: false, + } + ]; + useMainStore().order.damage.isRepair = false; + // Assert - expect(wrapper.vm.unverifiedNonADASNextStepsBodyText).toEqual("NonADASReplaceTestReturn"); + expect(wrapper.vm.bodyText).toEqual("NonADASReplaceTestReturn"); }) test("If damage is ADAS Replace, display ADASReplace coverage statement", async () => { @@ -94,12 +105,55 @@ describe("coverage-statement.vue...", () => { const wrapper = shallowMount(coverageStatement, { mixins: [mockMixin], }); - - useMainStore().order.lineItems.requiresRecalibration = true; + useMainStore().lineItems.glassParts = [ + { + requiresRecalibration: true, + } + ]; + useMainStore().order.damage.isRepair = false; // Assert - expect(wrapper.vm.unverifiedADASNextStepsBodyText).toEqual("ADASReplaceTestReturn"); + expect(wrapper.vm.bodyText).toEqual("ADASReplaceTestReturn"); }) + }); + describe("claim registration api call", () => { + it("claim registration not required => method not called", async () => { + // Arrange + const wrapper = setupMocks({}); + + const store = useMainStore(); + store.isClaimRegistrationRequired = false; + + const to = { + query: { issPage: getRandomString(4,10) } + }; + const next = jest.fn(); + + // SUT + coverageStatement.beforeRouteEnter.call(wrapper.vm, to, undefined, next) + + // Assert + expect(store.registerClaim).not.toHaveBeenCalled(); + }); + + it("claim registration required => register claim method called", async () => { + // Arrange + const wrapper = setupMocks({}); + + const store = useMainStore(); + store.isClaimRegistrationRequired = true; + + const to = { + query: { issPage: getRandomString(4,10) } + }; + const next = jest.fn(); + + // SUT + coverageStatement.beforeRouteEnter.call(wrapper.vm, to, undefined, next) + + // Assert + expect(store.registerClaim).toHaveBeenCalled(); + }); }) }); @@ -142,30 +196,6 @@ mountOptionsMockData = {}, }, }; - useMainStore().order = { - vehicle: { - vin: "TESTVIN", - }, - lineItems: { - glassParts: [ - { - canSafeliteRecalibrate: false, - childParts: null, - color: "Green Tint", - description: "solar, driver side, encap", - partNumber: "DQ12204GTYNOEM", - partType: "DRIVER REAR QUARTER GLASS", - recalibrationType: null, - requiresCapabilityQuestions: false, - requiresRecalibration: false, - } - ] - }, - damage: { - isRepair: false, - } - }; - const apiPromise = Promise.resolve(apiResponses); settleAllPromises.mockImplementation(() => apiPromise); @@ -174,12 +204,14 @@ mountOptionsMockData = {}, const mountOptions = getMountOptions({}); mountOptions.mixins = [baseMixin, vehicleQuestionsMixin]; + mountOptions.global = { + plugins: [createTestingPinia()] + } const wrapper = shallowMount(coverageStatement, mountOptions); wrapper.vm.setCmsContent = baseMixin.methods.setCmsContent; return { wrapper }; - } diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index c785b039..f50a0b84 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -58,7 +58,6 @@ import { settleAllPromises } from '@/helpers/layout-helper'; import { getDamageString } from '@/helpers/damage-helper.js'; import { useMainStore } from "@/store"; import vehicleQuestionsMixin from "@/mixins/vehicle-questions-mixin"; -import { getRegisterClaimResponse, setInsuranceCoverageValues } from '@/helpers/coverage-statement-helper'; export default { name: 'coverage-statement', @@ -84,7 +83,7 @@ export default { let parts = useMainStore().lineItems.glassParts; // if ADAS, display ADASNextSteps - if (parts.filter(part => part.requiresRecalibration).length > 0) { + if (parts != null && parts.filter(part => part.requiresRecalibration).length > 0) { return this.unverifiedADASNextStepsBodyText; } // if non-ADAS, display NonADASNextSteps @@ -122,17 +121,19 @@ export default { }, ]; + if (useMainStore().isClaimRegistrationRequired){ + const registerClaimResponse = await useMainStore().registerClaim(); + promiseResultMap.push({ + resultKey: 'registerClaim', + promise: registerClaimResponse, + }); + } + const resultMap = await settleAllPromises(promiseResultMap); next((vm) => { vm.setCmsContent(resultMap.cmsContent); }); - - let registerClaimResponse = null; - if (useMainStore().isClaimRegistrationRequired){ - registerClaimResponse = await getRegisterClaimResponse(); - } - setInsuranceCoverageValues(registerClaimResponse); }, methods: { arePagePrerequisitesValid() { diff --git a/src/layouts/policy-vehicles/policy-vehicles.spec.js b/src/layouts/policy-vehicles/policy-vehicles.spec.js index 1d2f6875..89712a3e 100644 --- a/src/layouts/policy-vehicles/policy-vehicles.spec.js +++ b/src/layouts/policy-vehicles/policy-vehicles.spec.js @@ -6,6 +6,10 @@ import { useMainStore } from "@/store"; import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import {vehicleSelectionOptions} from "@/constants/vehicle-selection-options"; import { navigationScenarios } from "@/router/router-constants/navigation-scenarios"; +import baseMixin from "@/mixins/base-mixin"; +import { getRandomString, getRandomInt } from '@/helpers/data-generation.js'; +import { endorsementOptions } from '@/constants/endorsement-options.js'; +import { createTestingPinia } from '@pinia/testing'; // Mock fetchCmsContentForPage jest.mock("@/helpers/cms-content-helper", () => ({ @@ -44,116 +48,357 @@ describe("policy-vehicles.vue", () => { expect(wrapper.vm.$router.navigate).toBeCalled(); }); - test("Selected vehicle VIN do match vehicles listed in our system (CarIDs) found then navigate forward to vehicle-damage page.", async () => { - //Arrange - const { wrapper } = setupMocks({}); - - // Act - await wrapper.setData({ - selectedVehicleVin: "5NMS3CADXLH233004" - }); - await wrapper.vm.forwardButtonAction(); + describe("forwardButtonAction", () => { - // Assert - expect(wrapper.vm.$router.navigate).toHaveBeenCalledWith( - navigationScenarios.CLICKED_FORWARD_LISTED_VEHICLE, - undefined, - {}, - {} - ); - }); - test("Selected vehicle VIN do not match vehicles listed in our system (CarIDs) found then navigate forward to bailout page.", async () => { - //Arrange - const { wrapper } = setupMocks({}); + test("Selected VIN matches vehicle listed in system => update vehicle and navigate forward with CLICKED_FORWARD_LISTED_VEHICLE scenario.", async () => { + //Arrange + const { wrapper } = setupMocks({}); - // Act - await wrapper.setData({ - selectedVehicleVin: "5NMS3CADXLH233004", - bailout: true + const vin = getRandomString(17,17); + await wrapper.setData({ + selectedVehicleVin: vin, + policyVehicles: [ + { vin: vin }, + ], + bailout: false + }); + + const year = getRandomInt(1998, 2023); + const lookupVehicleResponse = { + data: { + year: year, + } + }; + const store = useMainStore(); + store.lookupVehicleByVin.mockReturnValue(Promise.resolve(lookupVehicleResponse)); + + const expectedInput = { + year: year, + vin: vin, + noCompensation: true, + deductible: 0, + repairWaived: false + } + + // Act + await wrapper.vm.forwardButtonAction(); + + // Assert + expect(wrapper.vm.bailout).toBeFalsy(); + expect(store.updateVehicle).toHaveBeenCalledWith(expectedInput); + expect(wrapper.vm.$router.navigate).toHaveBeenCalledWith( + navigationScenarios.CLICKED_FORWARD_LISTED_VEHICLE, + undefined, + {}, + {} + ); }); - await wrapper.vm.forwardButtonAction(); - // Assert - expect(wrapper.vm.$router.navigate).toHaveBeenCalledWith( - navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT, - undefined, - {}, - {} - ); - }); - test("if user select vehicle not listed option then navigate forward to vehicle-selection page.", async () => { - //Arrange - const { wrapper } = setupMocks({}); + test("Error in lookupVehicleByVin call => bailout true and navigate forward with CLICKED_FORWARD_WITH_BAILOUT scenario.", async () => { + //Arrange + const { wrapper } = setupMocks({}); - // Act - await wrapper.setData({ - selectedVehicleVin: vehicleSelectionOptions.VEHICLE_NOT_LISTED, - }); - await wrapper.vm.forwardButtonAction(); + const vin = getRandomString(17,17); + await wrapper.setData({ + selectedVehicleVin: vin, + bailout: false + }); - // Assert - expect(wrapper.vm.$router.navigate).toHaveBeenCalledWith( - navigationScenarios.CLICKED_FORWARD_NON_LISTED_VEHICLE, - undefined, - {}, - {} - ); - }); -}); + const store = useMainStore(); + store.lookupVehicleByVin.mockReturnValue(Promise.reject()); -function setupMocks({ - route = null, - lookupVehicleByVinResponse -}) -{ - useMainStore().applicationUser = { - pageData: { - "policy-vehicles": - [ - { - vehicleMake: "Hyundai", - vehicleModel: "Santa Fe", - vehicleStyle: "4 door utility", - vehicleYear: 2020, - vin: "5NMS3CADXLH233004", + // Act + await wrapper.vm.forwardButtonAction(); + + // Assert + expect(wrapper.vm.bailout).toBeTruthy(); + expect(wrapper.vm.$router.navigate).toHaveBeenCalledWith( + navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT, + undefined, + {}, + {} + ); + }); + + test("vehicle not listed => navigate forward with CLICKED_FORWARD_NON_LISTED_VEHICLE scenario.", async () => { + // Arrange + const { wrapper } = setupMocks({}); + + await wrapper.setData({ + selectedVehicleVin: vehicleSelectionOptions.VEHICLE_NOT_LISTED, + }); + + // Act + await wrapper.vm.forwardButtonAction(); + + // Assert + expect(wrapper.vm.$router.navigate).toHaveBeenCalledWith( + navigationScenarios.CLICKED_FORWARD_NON_LISTED_VEHICLE, + undefined, + {}, + {} + ); + }); + }) + + describe("noCompensationForSelectedVehicle computed property", () => { + it("No vehicle match => returns true", async () => { + // Arrange + const selectedVin = getRandomString(17,17); + const otherVin = getRandomString(17,17); + const testValues = { + selectedVehicleVin: selectedVin, + policyVehicles: [ + { + vin: otherVin, }, ], - } - }; - useMainStore().lookupVehicleByVin = jest.fn().mockImplementation(() => { - return Promise.resolve({ - data: lookupVehicleByVinResponse - ? lookupVehicleByVinResponse : { - vehicle: { - carId: "CARID" - }, - }, - }) - }); + } + + // Act + const result = policyVehicles.computed.noCompensationForSelectedVehicle.call(testValues); + + // Assert + expect(result).toBeTruthy(); + }); + + it("Coverages list empty => true", () => { + // Arrange + const vin = getRandomString(17,17); + const testValues = { + selectedVehicleVin: vin, + policyVehicles: [ + { + vin: vin, + coverages: [] + }, + ], + } + + // Act + const result = policyVehicles.computed.noCompensationForSelectedVehicle.call(testValues); + + // Assert + expect(result).toBeTruthy(); + }); + + it("Coverages list non-empty => false", () => { + // Arrange + const vin = getRandomString(17,17); + const testValues = { + selectedVehicleVin: vin, + policyVehicles: [ + { + vin: vin, + coverages: [ + { + deductible: 0 + } + ] + }, + ], + } + + // Act + const result = policyVehicles.computed.noCompensationForSelectedVehicle.call(testValues); + + // Assert + expect(result).toBeFalsy(); + }); + }) + + describe("deductibleForSelectedVehicle computed property", () => { + + it("No vehicle match => undefined returned", () => { + // Arrange + const selectedVin = getRandomString(17,17); + const otherVin = getRandomString(17,17); + const testValues = { + selectedVehicleVin: selectedVin, + policyVehicles: [ + { + vin: otherVin, + }, + ], + } + + // Act + const result = policyVehicles.computed.deductibleForSelectedVehicle.call(testValues); + + // Assert + expect(result).toBe(undefined); + }); + + it("Vehicle match with empty coverages list => 0 returned", () => { + // Arrange + const vin = getRandomString(17,17); + const testValues = { + selectedVehicleVin: vin, + policyVehicles: [ + { + vin: vin, + coverages: [] + }, + ], + } + + // Act + const result = policyVehicles.computed.deductibleForSelectedVehicle.call(testValues); + + // Assert + expect(result).toBe(0); + }); + + it("Coverages list non empty => deductible from first coverage returned", () => { + // Arrange + const vin = getRandomString(17,17); + const firstDeductible = getRandomInt(1,1000); + const secondDeductible = getRandomInt(1,1000); + const testValues = { + selectedVehicleVin: vin, + policyVehicles: [ + { + vin: vin, + coverages: [ + { + deductible: firstDeductible + }, + { + deductible: secondDeductible + } + ] + }, + ], + } + + // Act + const result = policyVehicles.computed.deductibleForSelectedVehicle.call(testValues); + + // Assert + expect(result).toBe(firstDeductible); + }); + }) + + describe("repairWaivedForSelectedVehicle computed property", () => { + + it("No vehicle match => false returned", () => { + // Arrange + const selectedVin = getRandomString(17,17); + const otherVin = getRandomString(17,17); + const testValues = { + selectedVehicleVin: selectedVin, + policyVehicles: [ + { + vin: otherVin, + }, + ], + } + + // Act + const result = policyVehicles.computed.repairWaivedForSelectedVehicle.call(testValues); + + // Assert + expect(result).toBe(false); + }); + + it("Endorsements list empty => false returned", () => { + // Arrange + const vin = getRandomString(17,17); + const testValues = { + selectedVehicleVin: vin, + policyVehicles: [ + { + vin: vin, + endorsements: [] + }, + ], + } + + // Act + const result = policyVehicles.computed.repairWaivedForSelectedVehicle.call(testValues); + + // Assert + expect(result).toBe(false); + }); + + it("Endorsements list non-empty, not containing repair waived => false returned", () => { + // Arrange + const vin = getRandomString(17,17); + const testValues = { + selectedVehicleVin: vin, + policyVehicles: [ + { + vin: vin, + endorsements: [ endorsementOptions.EDUCATOR, endorsementOptions.PARKING_GUARD ] + }, + ], + } + + // Act + const result = policyVehicles.computed.repairWaivedForSelectedVehicle.call(testValues); + + // Assert + expect(result).toBe(false); + }); + + it("Endorsements list contains repair waived => true returned", () => { + // Arrange + const vin = getRandomString(17,17); + const testValues = { + selectedVehicleVin: vin, + policyVehicles: [ + { + vin: vin, + endorsements: [ + endorsementOptions.EDUCATOR, + endorsementOptions.REPAIR_WAIVED, + endorsementOptions.PARKING_GUARD + ] + }, + ], + } + + // Act + const result = policyVehicles.computed.repairWaivedForSelectedVehicle.call(testValues); + + // Assert + expect(result).toBe(true); + }); + }) +}); + +const mockMixin = { + methods: { + getCmsContent: jest.fn(), + }, + computed: { + dynamicStrings() { + return { ROUTER_LINK: "routerLink:" }; + }, + }, +}; + +function setupMocks() +{ const mountOptions = getMountOptions({ - route: route ? route : undefined, router: { navigate: jest.fn(), }, - mainStore: { - order: { - vehicle: { - carId: "CR00069309", - category: "SUV", - imageUrl: - "https://dbhdyzvm8lm25.cloudfront.net/color_0320_032/MY2020/13769/13769_cc0320_032_WW8.jpg", - imageVifColor: "white", - imageVifNumber: "13769", - make: "Hyundai", - model: "Santa Fe", - style: "4 door utility", - year: 2020, + mixins: [mockMixin], + global: { + mocks: { + $route: { + params: { + id: 1 + } }, - vin: "5NMS3CADXLH233004", + $router: { + navigate: jest.fn() + } }, - }, - }, - ); + plugins: [createTestingPinia()] + } + }); const apiResponses = { cmsContent: {}, @@ -161,24 +406,11 @@ function setupMocks({ settleAllPromises.mockImplementation(() => apiResponses); fetchCmsContentForPage.mockImplementation(() => Promise.resolve()); - - //Mock props - const mockMixin = { - methods: { - getCmsContent: jest.fn(), - }, - computed: { - dynamicStrings() { - return { ROUTER_LINK: "routerLink:" }; - }, - }, - }; - - mountOptions.mixins = [mockMixin]; - const wrapper = shallowMount(policyVehicles,mountOptions); + const wrapper = shallowMount(policyVehicles, mountOptions); wrapper.vm.getCmsContent = jest.fn().mockImplementation(() => ""); wrapper.vm.setCmsContent = jest.fn(); + wrapper.vm.setCmsContent = baseMixin.methods.setCmsContent; wrapper.vm.$refs.siteFooter.updateButtonText = jest.fn(); wrapper.vm.$refs.siteFooter.removeLoader = jest.fn(); return { wrapper }; diff --git a/src/layouts/policy-vehicles/policy-vehicles.vue b/src/layouts/policy-vehicles/policy-vehicles.vue index 1e5c766e..6f98ddd2 100644 --- a/src/layouts/policy-vehicles/policy-vehicles.vue +++ b/src/layouts/policy-vehicles/policy-vehicles.vue @@ -53,7 +53,9 @@ export default { const policyVehicles = useMainStore().pageData(issPageValues.POLICY_VEHICLES); return { policyVehicles: policyVehicles, - selectedVehicleVin: policyVehicles.length == 0 ? "" : policyVehicles[0].vin, + selectedVehicleVin: (policyVehicles?.length ?? 0) == 0 + ? "" + : policyVehicles[0].vin, bailout: false } }, @@ -77,28 +79,25 @@ export default { methods: { backButtonAction() { - this.mainStore.issConfig.disabledFields.policyNumber = true; + useMainStore().issConfig.disabledFields.policyNumber = true; this.$router.navigate(this.navigationScenarios.CLICKED_BACK, this.$route); }, - async forwardButtonAction() { - if(this.selectedVehicleVin != vehicleSelectionOptions.VEHICLE_NOT_LISTED){ + async forwardButtonAction() { + if (this.selectedVehicleVin != vehicleSelectionOptions.VEHICLE_NOT_LISTED){ const vehicleLookupResponse = await this.lookupVehicleByVin(this.selectedVehicleVin); if (vehicleLookupResponse.error) { - this.bailout = true; + this.bailout = true; return this.navigateForward(); } this.vehicleFromLookup = Object.assign(vehicleLookupResponse.data, { vin: this.selectedVehicleVin, - noCoverage: this.noCoverageForSelectedVehicle, + noCompensation: this.noCompensationForSelectedVehicle, deductible: this.deductibleForSelectedVehicle, repairWaived: this.repairWaivedForSelectedVehicle - }); - // Update that verified - // If they go backwards select vehicle => forward => one deductible => back to vehicle selection => forward again => right info - // backwards => vehicle unverified => clear coverage info - // keep this in mind - this.mainStore.updateVehicle(this.vehicleFromLookup); + }); + + useMainStore().updateVehicle(this.vehicleFromLookup); } return this.navigateForward(); }, @@ -126,16 +125,14 @@ export default { ); }, async lookupVehicleByVin(vin) { - try { - return await this.mainStore.lookupVehicleByVin(vin); - } - catch (responseError) { - return { - error: { - status: responseError.status, - }, - }; - } + try { + return await useMainStore().lookupVehicleByVin(vin); + } + catch (responseError) { + return { + error: true, + }; + } }, }, @@ -143,7 +140,7 @@ export default { VehiclesForQuestions() { // Map API result data, to address-vehicles data structure const vehicles = this.policyVehicles; - const mappedData = vehicles.map((v) => { + const mappedData = vehicles?.map((v) => { const maskSymbol = "X"; const vinStart = maskSymbol.repeat(v.vin.length - 6); const vinEnd = v.vin.substring(v.vin.length - 6); @@ -154,29 +151,26 @@ export default { Name: v.vin, SubText: "VIN " + vinStart + vinEnd, }; - }); + }) ?? []; return mappedData; }, - noCoverageForSelectedVehicle() { + noCompensationForSelectedVehicle() { const vehicle = this.policyVehicles.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); - return vehicle.coverages?.length == 0 ?? true; + return (vehicle?.coverages?.length ?? 0) == 0; }, deductibleForSelectedVehicle() { const vehicle = this.policyVehicles.find((vehicle) => { return vehicle?.vin == this.selectedVehicleVin; }); if (!vehicle){ return undefined; } - // return 0 in (vehicle.coverages ?? []) - // ? vehicle?.coverages[0].deductible - // : 0; - + return vehicle.coverages?.length ?? false ? vehicle?.coverages[0].deductible : 0; }, repairWaivedForSelectedVehicle() { const vehicle = this.policyVehicles.find((vehicle) => { return vehicle.vin == this.selectedVehicleVin; }); - return vehicle.endorsements?.includes(endorsementOptions.REPAIR_WAIVED) ?? false; + return vehicle?.endorsements?.includes(endorsementOptions.REPAIR_WAIVED) ?? false; } }, components: { diff --git a/src/store/index.js b/src/store/index.js index bf5b1d0b..af663733 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -50,7 +50,7 @@ const getDefaultState = () => { damageState: null, damageCity: null, isDamageGlassOnly: null, - noCoverage: null, + noCompensation: null, deductible: { repair: null, // numerical value; how much customer owes on deductible in repair case replace: null // numerical value; how much customer owes on deductible in replace case, @@ -362,63 +362,67 @@ export const useMainStore = defineStore({ } }, registerClaim() { - try { - // TODO: replace place holder correlationId with the real thing - const placeHolderCorrelationId = "00000000-0000-0000-0000-000000000000"; - const response = globalMethods.callHttpClient({ - method: endpoints.RegisterClaim.method, - endpoint: endpoints.RegisterClaim.url, - payload: - { - correlationId: placeHolderCorrelationId, - accountNumber: this.issConfig.accountNumber.toString(), - insured: { - firstName: this.order.customer.firstName, - lastName: this.order.customer.lastName, - address: { - addressLine1: this.order.customer.address.streetAddress, - addressLine2: this.order.customer.address.streetAddress2, - city: this.order.customer.address.city, - state: this.order.customer.address.state, - zipCode: this.order.customer.address.zipCode, - country: "US" // TODO set from store - }, - homePhone: { - number: this.order.customer.phoneNumber - } + // TODO: replace place holder correlationId with the real thing + const placeHolderCorrelationId = "00000000-0000-0000-0000-000000000000"; + globalMethods.callHttpClient({ + method: endpoints.RegisterClaim.method, + endpoint: endpoints.RegisterClaim.url, + payload: + { + correlationId: placeHolderCorrelationId, + accountNumber: this.issConfig.accountNumber?.toString() ?? "", + insured: { + firstName: this.order.customer.firstName, + lastName: this.order.customer.lastName, + address: { + addressLine1: this.order.customer.address.streetAddress, + addressLine2: this.order.customer.address.streetAddress2, + city: this.order.customer.address.city, + state: this.order.customer.address.state, + zipCode: this.order.customer.address.zipCode, + country: "US" // TODO set from store }, - caller: { - homePhone: {} + homePhone: { + number: this.order.customer.phoneNumber + } + }, + caller: { + homePhone: {} + }, + policyInfo: { + policyNumber: this.order.policy.policyNumber, + safelitePolicy: { + policies: [] + } + }, + lossInfo: { + dateOfLoss: this.order.policy.dateOfLoss, + location: { + city: this.order.policy.damageCity, + state: this.order.policy.damageState, + country: "US" // TODO set from store }, - policyInfo: { - policyNumber: this.order.policy.policyNumber, - safelitePolicy: { - policies: [] - } + vehicle: { + year: this.order.vehicle.year?.toString() ?? "", + make: this.order.vehicle.make, + model: this.order.vehicle.model, + vin: this.order.vehicle.vin }, - lossInfo: { - dateOfLoss: this.order.policy.dateOfLoss, - location: { - city: this.order.policy.damageCity, - state: this.order.policy.damageState, - country: "US" // TODO set from store - }, - vehicle: { - year: this.order.vehicle.year.toString(), - make: this.order.vehicle.make, - model: this.order.vehicle.model, - vin: this.order.vehicle.vin - }, - }, - damageDescription: this.order.policy.damageCause - } - }); - return response; - } catch (responseError) { - return Promise.resolve({ - isError: true - }) - } + }, + damageDescription: this.order.policy.damageCause + } + }).then((response) => { + const registerClaimFailed = response.data.isError; + this.order.payment.insuranceCoverage.isVerified = !registerClaimFailed; + this.order.payment.insuranceCoverage.coverageStatus = registerClaimFailed + ? coverageStatuses.PENDING + : this.policy.noCompensation + ? coverageStatuses.NO_COMP + : coverageStatuses.VERIFIED; + },(error) => { + this.order.payment.insuranceCoverage.isVerified = false; + this.order.payment.insuranceCoverage.coverageStatus = coverageStatuses.PENDING; + }); }, async lookupVinByPlate(licensePlate, licenseState) { try { @@ -677,18 +681,6 @@ export const useMainStore = defineStore({ }); }, - setInsuranceCoverageValues(registerClaimResponse) { - const registerClaimFailed = registerClaimResponse.isError; - if (this.issConfig.isClaimRegistrationRequired) { - this.order.payment.insuranceCoverage.isVerified = !registerClaimFailed; - this.order.payment.insuranceCoverage.coverageStatus = registerClaimFailed - ? coverageStatuses.PENDING - : useMainStore().policy.noCoverage - ? coverageStatuses.NO_COMP - : coverageStatuses.VERIFIED; - } - }, - saveVehicleDamage(isWindshieldRepair, selectedGlassToReplace, selectedWindshieldChipCount) { const selectedGlassPassedInSorted = selectedGlassToReplace.slice().sort(); const isGlassToReplaceTheSame = @@ -775,7 +767,7 @@ export const useMainStore = defineStore({ this.order.vehicle.imageColor = vehicle.imageVifColor; // These could be undefined - this.order.policy.noCoverage = vehicle.noCoverage; + this.order.policy.noCompensation = vehicle.noCoverage; this.order.policy.deductible.replace = vehicle.deductible; this.order.policy.deductible.repair = vehicle?.repairWaived ?? false ? 0 : vehicle.deductible; diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 311b235d..88330c6a 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -156,16 +156,16 @@ describe("Store", () => { it("UpdateVehicle should set policy values appropriately with repair waived", () => { // Arrange - const noCoverage = getRandomBoolean(); + const noCompensation = getRandomBoolean(); const deductible = getRandomInt(1,500); const vehicle = { - noCoverage: noCoverage, + noCompensation: noCompensation, deductible: deductible, repairWaived: true }; const expectedPolicy = { - noCoverage: noCoverage, + noCompensation: noCompensation, deductible: { replace: deductible, repair: 0 @@ -181,16 +181,16 @@ describe("Store", () => { it("UpdateVehicle should set policy values appropriately with repair not waived", () => { // Arrange - const noCoverage = getRandomBoolean(); + const noCompensation = getRandomBoolean(); const deductible = getRandomInt(1,500); const vehicle = { - noCoverage: noCoverage, + noCompensation: noCompensation, deductible: deductible, repairWaived: false }; const expectedPolicy = { - noCoverage: noCoverage, + noCompensation: noCompensation, deductible: { replace: deductible, repair: deductible @@ -240,74 +240,6 @@ describe("Store", () => { expect(returned).resolves.toMatchObject(response); }); - describe("setInsuranceCoverageValues method", () => { - it("claim registration not required => nothing is updated", () => { - // Arrange - store.issConfig.isClaimRegistrationRequired = false; - const registerClaimResponse = { - isError: false - }; - const oldIsVerified = null; - store.payment.insuranceCoverage.isVerified = oldIsVerified; - const oldCoverageStatus = coverageStatuses.NO_COMP; - store.payment.insuranceCoverage.coverageStatus = oldCoverageStatus; - - // Act - store.setInsuranceCoverageValues(registerClaimResponse); - - // Assert - expect(store.payment.insuranceCoverage.isVerified).toBe(oldIsVerified); - expect(store.payment.insuranceCoverage.coverageStatus).toBe(oldCoverageStatus); - }) - - it("Register Claim fails => isVerified false and coverage status pending", () =>{ - // Arrange - store.issConfig.isClaimRegistrationRequired = true; - const registerClaimResponse = { - isError: true - }; - - // Act - store.setInsuranceCoverageValues(registerClaimResponse); - - // Assert - expect(store.payment.insuranceCoverage.isVerified).toBe(false); - expect(store.payment.insuranceCoverage.coverageStatus).toBe(coverageStatuses.PENDING); - }) - - it("Register Claim success and no coverage => isVerified true and coverage status no comp", () => { - // Arrange - store.issConfig.isClaimRegistrationRequired = true; - const registerClaimResponse = { - isError: false - }; - store.policy.noCoverage = true; - - // Act - store.setInsuranceCoverageValues(registerClaimResponse); - - // Assert - expect(store.payment.insuranceCoverage.isVerified).toBe(true); - expect(store.payment.insuranceCoverage.coverageStatus).toBe(coverageStatuses.NO_COMP); - }) - - it("Register Claim success and coverage => isVerified true and coverage status verified", () => { - // Arrange - store.issConfig.isClaimRegistrationRequired = true; - const registerClaimResponse = { - isError: false - }; - store.policy.noCoverage = false; - - // Act - store.setInsuranceCoverageValues(registerClaimResponse); - - // Assert - expect(store.payment.insuranceCoverage.isVerified).toBe(true); - expect(store.payment.insuranceCoverage.coverageStatus).toBe(coverageStatuses.VERIFIED); - }) - }) - it("saveVehicleDamage with windshield repair should update damage with number of chips not null", () => { // Arrange const glassName = getRandomString(4,10); @@ -426,7 +358,7 @@ describe("Store", () => { }); describe("registerClaim method", () => { - it("successful response results in expected data returned", () => { + it("successful response with no coverage => isVerified true and coverage status no comp", async () => { // Arrange const response = { data: { @@ -439,30 +371,56 @@ describe("Store", () => { deductible: 0 } }; + store.policy.noCompensation = true; globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(response)); // Act - const registerClaimPromise = store.registerClaim(); + await store.registerClaim(); // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalled(); - expect(registerClaimPromise).resolves.toMatchObject(response); - expect(registerClaimPromise).resolves.not.toHaveProperty('isError'); + expect(store.payment.insuranceCoverage.isVerified).toBe(true); + expect(store.payment.insuranceCoverage.coverageStatus).toBe(coverageStatuses.NO_COMP); }); - it("Call to client returns exception, resulting in object with error property being returned", () => { + it("successful response with coverage => isVerified true and coverage status verified", async () => { // Arrange - globalMethods.callHttpClient = jest.fn().mockImplementation(() => { - throw new Error('Register claim call failed'); - }); + const response = { + data: { + claimantId: null, + claimNumber: getRandomString(9, 9), + correlationId: getRandomGuid(), + isSuccess: true, + isError: false, + successMessage: getRandomString(9, 9), + deductible: 0 + } + }; + store.policy.noCompensation = false; + + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(response)); // Act - const registerClaimPromise = store.registerClaim(); + await store.registerClaim(); // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalled(); - expect(registerClaimPromise).resolves.toHaveProperty('isError'); + expect(store.payment.insuranceCoverage.isVerified).toBe(true); + expect(store.payment.insuranceCoverage.coverageStatus).toBe(coverageStatuses.VERIFIED); + }) + + it("Call to client returns exception, resulting in object with error property being returned", async () => { + // Arrange + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.reject()); + + // Act + await store.registerClaim(); + + // Asserts + expect(globalMethods.callHttpClient).toHaveBeenCalled(); + expect(store.payment.insuranceCoverage.isVerified).toBe(false); + expect(store.payment.insuranceCoverage.coverageStatus).toBe(coverageStatuses.PENDING); }); }) }); \ No newline at end of file From 9eb2892e022dcda97c6a9c94352e55ac20cc7b81 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Wed, 28 Jun 2023 12:02:43 -0400 Subject: [PATCH 09/15] Tidying --- src/store/index.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index af663733..6bfdb0d4 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -919,7 +919,7 @@ export const useMainStore = defineStore({ this.applicationUser.pageData[pageData.page] = pageData.data; }, updatePolicyData(welcomePageModel) - { // TODO add to this? + { this.order.policy.policyNumber = welcomePageModel?.policyNumber; this.order.policy.policyZipCode = welcomePageModel?.policyZipCode; this.order.policy.dateOfLoss = welcomePageModel?.dateOfLoss; @@ -929,9 +929,6 @@ export const useMainStore = defineStore({ this.order.policy.isDamageGlassOnly = welcomePageModel?.isDamageGlassOnly; this.order.customer.phoneNumber = welcomePageModel?.phoneNumber; this.order.customer.emailAddress = welcomePageModel?.email; - if (!this.issConfig.isClaimRegistrationRequired){ - this.order.insuranceCoverage.isVerified = true; - } }, updatePolicyHolderDetails(customerQuestions) { From 8c2bea9939154aaafc150505d4834aa7b6fc7e33 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Wed, 28 Jun 2023 12:06:32 -0400 Subject: [PATCH 10/15] Fixing unit tests after rename --- src/store/store.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 88330c6a..1ac4e2d1 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -159,7 +159,7 @@ describe("Store", () => { const noCompensation = getRandomBoolean(); const deductible = getRandomInt(1,500); const vehicle = { - noCompensation: noCompensation, + noCoverage: noCompensation, deductible: deductible, repairWaived: true }; @@ -184,7 +184,7 @@ describe("Store", () => { const noCompensation = getRandomBoolean(); const deductible = getRandomInt(1,500); const vehicle = { - noCompensation: noCompensation, + noCoverage: noCompensation, deductible: deductible, repairWaived: false }; From 2f959648179edd70cb6f46f4ea407ff0a85e3a62 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Wed, 28 Jun 2023 14:59:56 -0400 Subject: [PATCH 11/15] Removing comments --- .../policy-vehicles/policy-vehicles.vue | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/layouts/policy-vehicles/policy-vehicles.vue b/src/layouts/policy-vehicles/policy-vehicles.vue index 731e6b52..a7b24bd1 100644 --- a/src/layouts/policy-vehicles/policy-vehicles.vue +++ b/src/layouts/policy-vehicles/policy-vehicles.vue @@ -60,9 +60,6 @@ export default { bailout: false } }, - // mounted() { - // this.autoSelectIfOneVehicle(); - // }, async beforeRouteEnter(to, from, next) { // Call APIs @@ -137,13 +134,7 @@ export default { error: true, }; } - }, - - // autoSelectIfOneVehicle() { - // if (this.policyVehicles.length == 1) { - // this.selectedVehicleVin = this.policyVehicles[0].vin; - // } - // } + }, }, computed:{ VehiclesForQuestions() { @@ -221,14 +212,6 @@ export default { // if there is more than 1 style for the selected vehicle, display generic/blurred image this.displayGeneric = styleOptions?.data?.length > 1; - - // if (styleOptions?.data?.length > 1) { - // = true; - // } - // else { - // // display clear image of vehicle - // this.displayGeneric = false; - // } } } }, From aff8c4480dd2bfcc7324dd4f00381a400fc5e65a Mon Sep 17 00:00:00 2001 From: brydon1 Date: Wed, 28 Jun 2023 15:44:30 -0400 Subject: [PATCH 12/15] Adding package for crypto --- package-lock.json | 7 ++++--- package.json | 1 + src/store/index.js | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1fa847c..b369e9f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "@testing-library/jest-dom": "5.16.5", "@testing-library/user-event": "14.4.3", "@testing-library/vue": "6.6.1", + "@types/node": "^20.3.2", "@vue/cli-plugin-babel": "^5.0.8", "@vue/cli-plugin-router": "~5.0.0", "@vue/cli-plugin-unit-jest": "~5.0.0", @@ -3250,9 +3251,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.15.tgz", - "integrity": "sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==", + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.2.tgz", + "integrity": "sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw==", "dev": true }, "node_modules/@types/normalize-package-data": { diff --git a/package.json b/package.json index 66144ba2..28bf1cc0 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@testing-library/jest-dom": "5.16.5", "@testing-library/user-event": "14.4.3", "@testing-library/vue": "6.6.1", + "@types/node": "^20.3.2", "@vue/cli-plugin-babel": "^5.0.8", "@vue/cli-plugin-router": "~5.0.0", "@vue/cli-plugin-unit-jest": "~5.0.0", diff --git a/src/store/index.js b/src/store/index.js index c0c7af4e..7a58d4f3 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -54,8 +54,7 @@ const getDefaultState = () => { deductible: { repair: null, // numerical value; how much customer owes on deductible in repair case replace: null // numerical value; how much customer owes on deductible in replace case, - }, - endorsement: [] // List of endorsement_options + } }, customer: { address: { From e1a4e4c47140500dd296f0b444b60b7050d519e3 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Wed, 28 Jun 2023 16:39:44 -0400 Subject: [PATCH 13/15] Use @ instead of relative reference --- src/store/store.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/store.spec.js b/src/store/store.spec.js index a22c21e1..03b06257 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -3,7 +3,7 @@ import { createApp } from 'vue'; import { setActivePinia, createPinia } from "pinia"; import globalMethods from "@/global-methods"; import App from '@/App.vue'; -import { getRandomString, getRandomGuid, getRandomInt, getRandomBoolean } from '../helpers/data-generation'; +import { getRandomString, getRandomGuid, getRandomInt, getRandomBoolean } from '@/helpers/data-generation'; import { coverageStatuses } from "@/constants/coverage-statuses.js"; describe("Store", () => { From ce87854ad9e2e7791c73d1aa719afc6d60721a59 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Wed, 28 Jun 2023 16:43:16 -0400 Subject: [PATCH 14/15] Removed relative package references and needless type reference --- package-lock.json | 1 - package.json | 1 - src/helpers/data-generation.js | 3 ++- src/layouts/policy-vehicles/policy-vehicles.vue | 2 +- src/layouts/vehicle-lookup/vehicle-lookup.spec.js | 3 +-- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b369e9f9..08d9d17a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,6 @@ "@testing-library/jest-dom": "5.16.5", "@testing-library/user-event": "14.4.3", "@testing-library/vue": "6.6.1", - "@types/node": "^20.3.2", "@vue/cli-plugin-babel": "^5.0.8", "@vue/cli-plugin-router": "~5.0.0", "@vue/cli-plugin-unit-jest": "~5.0.0", diff --git a/package.json b/package.json index 28bf1cc0..66144ba2 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "@testing-library/jest-dom": "5.16.5", "@testing-library/user-event": "14.4.3", "@testing-library/vue": "6.6.1", - "@types/node": "^20.3.2", "@vue/cli-plugin-babel": "^5.0.8", "@vue/cli-plugin-router": "~5.0.0", "@vue/cli-plugin-unit-jest": "~5.0.0", diff --git a/src/helpers/data-generation.js b/src/helpers/data-generation.js index 9bd607f5..f7019506 100644 --- a/src/helpers/data-generation.js +++ b/src/helpers/data-generation.js @@ -1,4 +1,5 @@ -import { randomUUID } from "node:crypto"; +//import { randomUUID } from "node:crypto"; +import { randomUUID } from "crypto"; export function getRandomString(minLength = 1, maxLength = 100) { const length = getRandomInt(minLength, maxLength + 1); diff --git a/src/layouts/policy-vehicles/policy-vehicles.vue b/src/layouts/policy-vehicles/policy-vehicles.vue index a7b24bd1..4a92c1c2 100644 --- a/src/layouts/policy-vehicles/policy-vehicles.vue +++ b/src/layouts/policy-vehicles/policy-vehicles.vue @@ -42,7 +42,7 @@ import { issPageValues } from "@/router/router-constants/issPage-values"; import { useMainStore } from '@/store'; import { errorMessages } from "@/constants/error-messages"; import { vehicleSelectionOptions } from "@/constants/vehicle-selection-options"; -import { endorsementOptions } from '../../constants/endorsement-options'; +import { endorsementOptions } from "@/constants/endorsement-options"; // DEFINE VALIDATION RULES defineRule("option-required", required(errorMessages.OPTION_REQUIRED)); diff --git a/src/layouts/vehicle-lookup/vehicle-lookup.spec.js b/src/layouts/vehicle-lookup/vehicle-lookup.spec.js index 085136f3..398ce254 100644 --- a/src/layouts/vehicle-lookup/vehicle-lookup.spec.js +++ b/src/layouts/vehicle-lookup/vehicle-lookup.spec.js @@ -1,12 +1,11 @@ /* eslint-env jest */ import { mount } from '@vue/test-utils'; import { navigationScenarios } from '@/router/router-constants/navigation-scenarios'; -import { issPageValues } from '@/router/router-constants/issPage-values'; import { queryStrings } from '@/constants/query-strings'; import { GaActions } from "@/constants/analytics"; import VehicleLookup from './vehicle-lookup.vue'; import {vinLookupMethodSelections} from '@/constants/vin-lookup-methods'; -import { useMainStore } from '../../store'; +import { useMainStore } from '@/store'; import { createTestingPinia } from '@pinia/testing'; import { mapStores } from "pinia"; From a3e72acdd59546ab4ead4ff7d6c53608890c8a4d Mon Sep 17 00:00:00 2001 From: brydon1 Date: Thu, 29 Jun 2023 09:16:01 -0400 Subject: [PATCH 15/15] Remove commented line --- src/helpers/data-generation.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/helpers/data-generation.js b/src/helpers/data-generation.js index f7019506..635ab9b4 100644 --- a/src/helpers/data-generation.js +++ b/src/helpers/data-generation.js @@ -1,4 +1,3 @@ -//import { randomUUID } from "node:crypto"; import { randomUUID } from "crypto"; export function getRandomString(minLength = 1, maxLength = 100) {