diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 36d21a69..27cc4df1 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -98,6 +98,10 @@ const endpoints = { url: "/clientauth/api/v1/clientauth/validateClientTag", method: "GET", }, + IsVinbyAddressPermissible:{ + url:"/vehicle/api/v1/vehicle/is-vin-by-address-permissible", + method:"Get", + } }; export { endpoints }; diff --git a/src/constants/vin-lookup-methods.js b/src/constants/vin-lookup-methods.js index a12f29eb..ce2f2859 100644 --- a/src/constants/vin-lookup-methods.js +++ b/src/constants/vin-lookup-methods.js @@ -1,7 +1,7 @@ -const VIN_LOOKUP_METHODS = Object.freeze({ - manualVin: 'ManualVin', - licensePlate: 'LicensePlate', - homeAddress: 'HomeAddress', +const vinLookupMethodSelections = Object.freeze({ + MANUALVIN: 'ManualVin', + LICENSEPLATE: 'LicensePlate', + HOMEADDRESS: 'HomeAddress', }); -export default VIN_LOOKUP_METHODS; +export {vinLookupMethodSelections}; diff --git a/src/layouts/vehicle-lookup/vehicle-lookup.spec.js b/src/layouts/vehicle-lookup/vehicle-lookup.spec.js index 12a84a88..491adc70 100644 --- a/src/layouts/vehicle-lookup/vehicle-lookup.spec.js +++ b/src/layouts/vehicle-lookup/vehicle-lookup.spec.js @@ -5,6 +5,7 @@ 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'; const vinLookupMethodsMockData = { QuestionText: 'To find the right part, let’s get your VIN. Or we can look it up for you!', @@ -47,6 +48,10 @@ function setupMocks() { const mockRouter = { navigate: jest.fn(), }; + + const mockIsVinbyAddressPermissibleToBeFalse={ + IsVinbyAddressPermissible:false, + }; const wrapper = mount(VehicleLookup, { data() { @@ -95,7 +100,7 @@ function setupMocks() { ], mocks: { $route: mockRoute, - $router: mockRouter, + $router: mockRouter, }, stubs: { SiteHeader: true, @@ -105,10 +110,29 @@ function setupMocks() { }, }); - return { mockRoute, mockRouter, wrapper }; + return { mockRoute, mockRouter, wrapper,mockIsVinbyAddressPermissibleToBeFalse }; } describe('vehicle-lookup.vue', () => { + test('IsVinbyAddressPermissible to be false', () => { + const { wrapper,mockIsVinbyAddressPermissibleToBeFalse } = setupMocks(); + + const vinLookupMethodsWrapper = wrapper.findComponent({ name: 'vin-lookup-methods' }); + // Not using initializeComponent() because it doesn't trigger reactivity in test. + const Answers = JSON.parse(JSON.stringify(vinLookupMethodsMockData.Answers)); + if(!mockIsVinbyAddressPermissibleToBeFalse.IsVinbyAddressPermissible){ + Answers.splice(Answers.indexOf(vinLookupMethodSelections.HOMEADDRESS),1); + } + vinLookupMethodsWrapper.setData({ + questionTextFromCms: vinLookupMethodsMockData.QuestionText, + answersFromCms: Answers, + }); + + const lookupByAddressOptionLabel = wrapper.find('[data-test-id="vin-lookup-methods-button-question"] label[for="VinLookupMethods-HomeAddress"]'); + expect(lookupByAddressOptionLabel.exists()).toBe(false); + + }); + test('"Continue" button is disabled when no VIN Lookup method is selected.', () => { const { wrapper } = setupMocks(); diff --git a/src/layouts/vehicle-lookup/vehicle-lookup.vue b/src/layouts/vehicle-lookup/vehicle-lookup.vue index 34124672..4f16ccd5 100644 --- a/src/layouts/vehicle-lookup/vehicle-lookup.vue +++ b/src/layouts/vehicle-lookup/vehicle-lookup.vue @@ -38,7 +38,7 @@ import { fetchCmsContentForPage } from '@/helpers/cms-content-helper'; import { settleAllPromises } from '@/helpers/layout-helper'; import { Form } from 'vee-validate'; import BaseFormMixin from '@/mixins/base-form-mixin'; -import VIN_LOOKUP_METHODS from '@/constants/vin-lookup-methods'; +import {vinLookupMethodSelections} from '@/constants/vin-lookup-methods'; // Import Component import SiteFooter from '@/iss-components/site-footer/site-footer.vue'; @@ -98,13 +98,13 @@ export default { }, forwardButtonAction() { switch (this.selectedVinLookupMethod) { - case VIN_LOOKUP_METHODS.manualVin: + case vinLookupMethodSelections.MANUALVIN: this.$router.navigate(this.navigationScenarios.SELECTED_MANUAL_VIN, this.$route); break; - case VIN_LOOKUP_METHODS.licensePlate: + case vinLookupMethodSelections.LICENSEPLATE: this.$router.navigate(this.navigationScenarios.SELECTED_LICENSE_PLATE, this.$route); break; - case VIN_LOOKUP_METHODS.homeAddress: + case vinLookupMethodSelections.HOMEADDRESS: this.$router.navigate(this.navigationScenarios.SELECTED_HOME_ADDRESS, this.$route); break; default: diff --git a/src/layouts/vehicle-lookup/vin-lookup-methods/vin-lookup-methods.vue b/src/layouts/vehicle-lookup/vin-lookup-methods/vin-lookup-methods.vue index e5b8bee2..392dbdfa 100644 --- a/src/layouts/vehicle-lookup/vin-lookup-methods/vin-lookup-methods.vue +++ b/src/layouts/vehicle-lookup/vin-lookup-methods/vin-lookup-methods.vue @@ -16,6 +16,9 @@ import { defineRule } from 'vee-validate'; import { required } from '@/helpers/validation-rules'; import { errorMessages } from '@/constants/error-messages'; +import { useMainStore } from "@/store"; +import {vinLookupMethodSelections} from '@/constants/vin-lookup-methods'; +import { settleAllPromises } from "@/helpers/layout-helper"; // Import Component import ButtonQuestion from '@/digital-components/button-question/button-question.vue'; @@ -38,6 +41,7 @@ export default { required, }, }, + emits: ['update:modelValue'], components: { ButtonQuestion, @@ -53,14 +57,31 @@ export default { }, }, methods: { - initializeComponent() { + async initializeComponent() { + const isVinbyAddressPermissible = await this.getIsVinbyAddressPermissible(); this.questionTextFromCms = this.getCmsContent(this.cmsWidgetName, 'QuestionText'); const answers = this.getCmsContent(this.cmsWidgetName, 'Answers'); if (Array.isArray(answers)) { + if(!isVinbyAddressPermissible){ + answers.splice(answers.indexOf(vinLookupMethodSelections.HOMEADDRESS),1); + } this.answersFromCms = answers; } }, + async getIsVinbyAddressPermissible(){ + const isVinbyAddressPermissibleResponse = useMainStore().getIsVinbyAddressPermissible(); + // Settle promises and get results + const promiseResultMap = [ + { + resultKey: "isVinbyAddressPermissible", + promise: isVinbyAddressPermissibleResponse, + } + ]; + + const resultMap = await settleAllPromises(promiseResultMap); + return resultMap.isVinbyAddressPermissible; + } }, }; diff --git a/src/store/index.js b/src/store/index.js index a0483873..ca14bff7 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -298,7 +298,22 @@ export const useMainStore = defineStore({ payload: {}, }); }, - + getIsVinbyAddressPermissible(){ + try{ + const response = globalMethods.callHttpClient({ + method:endpoints.IsVinbyAddressPermissible.method, + endpoint:`${endpoints.IsVinbyAddressPermissible.url}?state=${this.order.customer.address.state}`, + payload: {}, + }); + return response; + } catch (responseError) { + return { + error: { + status: responseError.status, + }, + }; + } + }, async lookupVinByPlate(licensePlate, licenseState) { try { const response = await globalMethods.callHttpClient({ @@ -1028,7 +1043,7 @@ export const useMainStore = defineStore({ resetPartsAndDependencies() { this.resetGlassPartsState(); this.updateSupportingItems(null); - }, + }, }, persist: true });