diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 3e60db8f..fbbf0400 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -67,10 +67,6 @@ const endpoints = Object.freeze({ url: '/location/api/v1/location/providers', method: 'GET' }, - // GetTpaProviders: { - // url: '/location/api/v1/location/providers', - // method: 'GET' - // }, GetCapabilityQuestions: { url: '/parts/api/v1/parts/capability-questions', method: 'GET' diff --git a/src/layouts/tpa-search/tpa-search.vue b/src/layouts/tpa-search/tpa-search.vue index 29fce69c..c08087ee 100644 --- a/src/layouts/tpa-search/tpa-search.vue +++ b/src/layouts/tpa-search/tpa-search.vue @@ -37,66 +37,86 @@ - -
-
-
- + +
+ + +
+
+ -
- - -
-
- + +
+
+ + +
+
+ +
+
+
- -
- + +
@@ -112,6 +132,7 @@ import alert from '@/ux-components/alert/alert.vue'; import siteFooter from '@/iss-components/site-footer/site-footer.vue'; import googleMap from '@/iss-components/google-map/google-map.vue'; import shopListButton from '@/iss-components/shop-list-button/shop-list-button.vue'; +import loader from '@/ux-components/loader/loader.vue'; // Supporting files import { fetchCmsContentForPage } from '@/helpers/cms-content-helper'; @@ -130,6 +151,7 @@ export default { buttonQuestion, textLink, alert, + loader, googleMap, siteFooter, // eslint-disable-next-line vue/no-reserved-component-names @@ -159,6 +181,8 @@ export default { filter: '', providers: [], selectedProviderNumber: '', + initialLoading: true, + reloadProviders: false, additionalButtonData: { displayAvailabilityIndicators: false }, @@ -237,8 +261,12 @@ export default { watch: { async filter() { // TODO right now this results in getProviders being called once more than it needs to be - this.providers = await this.getProviderButtonData(); - this.mapZipCode = this.zipCode; + if (!this.initialLoading) { + this.reloadProviders = true; + this.providers = await this.getProviderButtonData(); + this.mapZipCode = this.zipCode; + this.reloadProviders = false; + } }, providers(newProviders) { this.selectedProviderNumber = newProviders?.length === 1 ?? false @@ -279,22 +307,29 @@ export default { const radiusOptions = [25, 50, 100]; const { zipCode } = useMainStore().order.customer.address; - const tpaProvidersRadius25 = await useMainStore().getTpaProviders(zipCode, radiusOptions[0]); - const tpaProvidersRadius50 = await useMainStore().getTpaProviders(zipCode, radiusOptions[1]); - const tpaProvidersRadius100 = await useMainStore().getTpaProviders(zipCode, radiusOptions[2]); - let radius = '25 miles'; + console.log('getTpaProviders calls'); + const tpaProvidersRadius25 = useMainStore().getTpaProviders(zipCode, radiusOptions[0]); + const tpaProvidersRadius50 = useMainStore().getTpaProviders(zipCode, radiusOptions[1]); + const tpaProvidersRadius100 = useMainStore().getTpaProviders(zipCode, radiusOptions[2]); + console.log('after not awaited getTpaProviders calls'); - let providers = tpaProvidersRadius25; - if ((tpaProvidersRadius25?.data?.shopProviders ?? []).length === 0) { + let radius = '25 miles'; + let providers = await tpaProvidersRadius25; + console.log('after 25 awaited'); + if ((providers?.data?.shopProviders ?? []).length === 0) { radius = '50 miles'; - providers = tpaProvidersRadius50; - if ((tpaProvidersRadius50?.data?.shopProviders ?? []).length === 0) { + providers = await tpaProvidersRadius50; + console.log('after 50 awaited'); + if ((providers?.data?.shopProviders ?? []).length === 0) { radius = '100 miles'; - providers = tpaProvidersRadius100; + providers = await tpaProvidersRadius100; + console.log('after 100 awaited'); } } + console.log('after if'); this.filter = radius; this.providers = providers?.data?.shopProviders ?? []; + this.initialLoading = false; }, async getProviderButtonData() { const getTpaProvidersResult = await useMainStore().getTpaProviders(this.zipCode, this.radiusInMiles); @@ -307,8 +342,10 @@ export default { ); }, async searchClick() { + this.reloadProviders = true; this.providers = await this.getProviderButtonData(); this.mapZipCode = this.zipCode; + this.reloadProviders = false; }, backButtonAction() { this.$router.navigate(this.navigationScenarios.CLICKED_BACK, this.$route); @@ -334,7 +371,7 @@ export default { : null; return { - buttonLabel: provider?.name ?? '', + buttonLabel: provider?.companyName ?? '', buttonLabelSubCopy: distance === null ? '' : `${distance} mi`, diff --git a/src/store/index.js b/src/store/index.js index ded1f2c6..c15e0bb9 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -859,85 +859,14 @@ export const useMainStore = defineStore({ getTpaProviders(zipCode, radius) { const damageType = this.damage.isRepair ? 'Repair' : 'Replace'; - const { accountNumber } = this.issConfig; + const { parentAccountNumber } = this.issConfig; const safeliteOnly = false; return new Promise((resolve, reject) => { globalMethods.callHttpClient({ method: endpoints.GetProviders.method, - endpoint: `${endpoints.GetProviders.url}/${zipCode}/${damageType}/${radius}/${accountNumber}/${safeliteOnly}` + endpoint: `${endpoints.GetProviders.url}/${zipCode}/${damageType}/${radius}/${parentAccountNumber}/${safeliteOnly}` }).then((response) => resolve(response), (error) => reject(error)); }); - // return new Promise((resolve, reject) => { - // if (radius === 25) { - // resolve({ - // data: { - // mobileProviderNumber: null, - // shopProviders: null - // } - // }); - // } else if (radius === 50) { - // resolve({ - // data: { - // mobileProviderNumber: null, - // shopProviders: [ - // { - // name: 'USA Auto Glass', - // address: { - // city: 'WESTERVILLE', - // country: 'US', - // state: 'OH', - // streetAddress: '4403 EXECUTIVE PKWY', - // streetAddress2: '', - // zipCode: '43081', - // zipCodeCtu: '01820' - // }, - // distanceInMiles: 8.393453111956896, - // providerNumber: '003335', - // phoneNumber: '614-123-5555' - // } - // ] - // } - // }); - // } else { - // resolve({ - // data: { - // mobileProviderNumber: null, - // shopProviders: [ - // { - // name: 'USA Auto Glass', - // address: { - // city: 'WESTERVILLE', - // country: 'US', - // state: 'OH', - // streetAddress: '4403 EXECUTIVE PKWY', - // streetAddress2: '', - // zipCode: '43081', - // zipCodeCtu: '01820' - // }, - // distanceInMiles: 8.393453111956896, - // providerNumber: '003335', - // phoneNumber: '614-123-5555' - // }, - // { - // name: 'Safelite AutoGlass', - // address: { - // city: 'WORTHINGTON', - // country: 'US', - // state: 'OH', - // streetAddress: '760 DEARBORN PARK LN', - // streetAddress2: '', - // zipCode: '43085', - // zipCodeCtu: '01820' - // }, - // distanceInMiles: 8.704336770196678, - // providerNumber: '001820', - // phoneNumber: '740-555-1234' - // } - // ] - // } - // }); - // } - // }); }, async getSupportingItems() { diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 3304f721..f1384826 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -1961,4 +1961,145 @@ describe('Store', () => { expect(store.order.currentDeductible).toEqual(finalDeductible); }); }); + + describe('getTpaProviders method', () => { + describe('successful method call', () => { + it('calls getProviders api endpoint', async () => { + // Arrange + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); + + // Act + await store.getCoveragePolicyInfo(); + + // Asserts + expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ + method: endpoints.CoveragePolicyInfo.method, + endpoint: endpoints.CoveragePolicyInfo.url + })); + }); + it('Returns expected response object', async () => { + // Arrange + const response = { ReferralNumber: getRandomString(6, 6) }; + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(response)); + + // Act + const result = store.getCoveragePolicyInfo(); + + // Asserts + await expect(result).resolves.toBe(response); + }); + it('calls api with expected data', async () => { + // Arrange + const accountNumber = getRandomString(6, 6); + const policyNumber = getRandomString(6, 6); + const dateOfLoss = getRandomString(6, 6); + const zipCode = getRandomString(6, 6); + const referralCorrelationId = getRandomString(6, 6); + store.order.accountNumber = accountNumber; + store.order.policy.policyNumber = policyNumber; + store.order.policy.dateOfLoss = dateOfLoss; + store.order.policy.policyZipCode = zipCode; + store.order.referralCorrelationId = referralCorrelationId; + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); + + // Act + await store.getCoveragePolicyInfo(); + + // Asserts + expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ + payload: expect.objectContaining({ + accountNumber, + policyNumber, + dateOfLoss, + zipCode, + referralCorrelationId + }) + })); + }); + it('null response by api => no exceptions thrown', async () => { + // Arrange + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(null)); + + // Act + await store.getCoveragePolicyInfo(); + + // Asserts + expect(store.order.policy.policyLookupSuccessful).toBe(false); + }); + it('no providers returned by api => promise resolves to empty list', async () => { + // Arrange + const responseNoPolicies = { + data: { + policies: [] + } + }; + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(responseNoPolicies)); + + // Act + await store.getCoveragePolicyInfo(); + + // Asserts + expect(store.order.policy.policyLookupSuccessful).toBe(false); + }); + it('multiple providers returned by api => promise resolves to expected', async () => { + // Arrange + const insured = { + address: getRandomString(6, 6), + firstName: getRandomString(6, 6), + lastName: getRandomString(6, 6), + city: getRandomString(6, 6), + state: getRandomString(6, 6), + zipCode: getRandomString(6, 6) + }; + const vehicles = [ + { name: getRandomString(6, 6) }, + { name: getRandomString(6, 6) } + ]; + const policy1 = { + insureds: [insured], + vehicles + }; + const responseNoPolicies = { + data: { + policies: [policy1, {}] + } + }; + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(responseNoPolicies)); + + // Act + await store.getCoveragePolicyInfo(); + + // Asserts + expect(store.order.policy.policyLookupSuccessful).toBe(true); + + expect(store.order.customer.address.streetAddress).toBe(insured.address); + expect(store.order.customer.address.city).toBe(insured.city); + expect(store.order.customer.address.state).toBe(insured.state); + expect(store.order.customer.address.zipCode).toBe(insured.zipCode); + expect(store.order.customer.firstName).toBe(insured.firstName); + expect(store.order.customer.lastName).toBe(insured.lastName); + + expect(store.order.serviceLocation.zipCode).toBe(insured.zipCode); + expect(store.order.policy.vehicles).toEqual(vehicles); + }); + }); + it('api call throws exception => policyLookupSuccessful false', async () => { + expect.assertions(3); + const error = 'get coverage policy info error'; + globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.reject(error)); + + // Act + await store.getCoveragePolicyInfo().catch((e) => { + expect(e).toEqual(error); + }); + + // Asserts + expect(globalMethods.callHttpClient) + .toHaveBeenCalledWith(expect.objectContaining({ + method: endpoints.CoveragePolicyInfo.method, + endpoint: endpoints.CoveragePolicyInfo.url + })); + expect(store.order.policy.policyLookupSuccessful).toBe(false); + }); + }); }); diff --git a/src/ux-components/loader/loader.vue b/src/ux-components/loader/loader.vue index f11f7b80..1783c626 100644 --- a/src/ux-components/loader/loader.vue +++ b/src/ux-components/loader/loader.vue @@ -1,9 +1,10 @@