From 40ed45d0ee662cea840027948e3ca228a83d1bbe Mon Sep 17 00:00:00 2001 From: Aldo Canepa Date: Tue, 19 Oct 2021 10:51:12 -0700 Subject: [PATCH 01/10] Use sublocality when locality is missing --- src/components/AddressSearch.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/AddressSearch.js b/src/components/AddressSearch.js index 4f4dc581a886..1170263219bb 100644 --- a/src/components/AddressSearch.js +++ b/src/components/AddressSearch.js @@ -55,6 +55,11 @@ const AddressSearch = (props) => { // Missing Street number return false; } + if (!_.some(addressComponents, component => _.includes(component.types, 'locality')) + && !_.some(addressComponents, component => _.includes(component.types, 'sublocality'))) { + // Missing city + return false; + } if (_.some(addressComponents, component => _.includes(component.types, 'post_box'))) { // Reject PO box return false; @@ -67,7 +72,11 @@ const AddressSearch = (props) => { // Gather the values from the Google details const streetNumber = getAddressComponent(details, 'street_number', 'long_name'); const streetName = getAddressComponent(details, 'route', 'long_name'); - const city = getAddressComponent(details, 'locality', 'long_name'); + let city = getAddressComponent(details, 'locality', 'long_name'); + if (!city) { + city = getAddressComponent(details, 'sublocality', 'long_name'); + console.debug('Replacing missing locality with sublocality: ', {address: details.formatted_address, sublocality: city}); + } const state = getAddressComponent(details, 'administrative_area_level_1', 'short_name'); const zipCode = getAddressComponent(details, 'postal_code', 'long_name'); From b07aa798a729df3277f9a5b45324dfc5b5fe9fa1 Mon Sep 17 00:00:00 2001 From: Aldo Canepa Date: Tue, 19 Oct 2021 10:57:44 -0700 Subject: [PATCH 02/10] Add check on missing zip code and state --- src/components/AddressSearch.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/AddressSearch.js b/src/components/AddressSearch.js index 1170263219bb..d5c099def0ea 100644 --- a/src/components/AddressSearch.js +++ b/src/components/AddressSearch.js @@ -55,6 +55,14 @@ const AddressSearch = (props) => { // Missing Street number return false; } + if (!_.some(addressComponents, component => _.includes(component.types, 'postal_code'))) { + // Missing zip code + return false; + } + if (!_.some(addressComponents, component => _.includes(component.types, 'administrative_area_level_1'))) { + // Missing state + return false; + } if (!_.some(addressComponents, component => _.includes(component.types, 'locality')) && !_.some(addressComponents, component => _.includes(component.types, 'sublocality'))) { // Missing city From 81317d4c0692c90458cf2628d01b574900988f7f Mon Sep 17 00:00:00 2001 From: Aldo Canepa Date: Tue, 19 Oct 2021 11:06:38 -0700 Subject: [PATCH 03/10] Add console.debug when address result is invalid --- src/components/AddressSearch.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/AddressSearch.js b/src/components/AddressSearch.js index d5c099def0ea..24c527e58f47 100644 --- a/src/components/AddressSearch.js +++ b/src/components/AddressSearch.js @@ -95,6 +95,7 @@ const AddressSearch = (props) => { props.onChangeText('addressZipCode', zipCode); } else { // Clear the values associated to the address, so our validations catch the problem + console.debug('Address search result failed validation: ', {address: details.formatted_address, address_components: details.address_components}); props.onChangeText('addressStreet', null); props.onChangeText('addressCity', null); props.onChangeText('addressState', null); From ef09215bcbfa47b21bfde10fad092badd79d8dc4 Mon Sep 17 00:00:00 2001 From: Aldo Canepa Date: Tue, 19 Oct 2021 15:21:02 -0700 Subject: [PATCH 04/10] Log bad addresses to server --- src/components/AddressSearch.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/AddressSearch.js b/src/components/AddressSearch.js index 24c527e58f47..85ed41c24fac 100644 --- a/src/components/AddressSearch.js +++ b/src/components/AddressSearch.js @@ -7,6 +7,7 @@ import CONFIG from '../CONFIG'; import withLocalize, {withLocalizePropTypes} from './withLocalize'; import styles from '../styles/styles'; import ExpensiTextInput from './ExpensiTextInput'; +import Log from '../libs/Log'; // The error that's being thrown below will be ignored until we fork the // react-native-google-places-autocomplete repo and replace the @@ -83,7 +84,7 @@ const AddressSearch = (props) => { let city = getAddressComponent(details, 'locality', 'long_name'); if (!city) { city = getAddressComponent(details, 'sublocality', 'long_name'); - console.debug('Replacing missing locality with sublocality: ', {address: details.formatted_address, sublocality: city}); + Log.hmmm('Replacing missing locality with sublocality: ', {address: details.formatted_address, sublocality: city}); } const state = getAddressComponent(details, 'administrative_area_level_1', 'short_name'); const zipCode = getAddressComponent(details, 'postal_code', 'long_name'); @@ -95,7 +96,11 @@ const AddressSearch = (props) => { props.onChangeText('addressZipCode', zipCode); } else { // Clear the values associated to the address, so our validations catch the problem - console.debug('Address search result failed validation: ', {address: details.formatted_address, address_components: details.address_components}); + Log.hmmm('[AddressSearch] Search result failed validation: ', { + address: details.formatted_address, + address_components: details.address_components, + place_id: details.place_id, + }); props.onChangeText('addressStreet', null); props.onChangeText('addressCity', null); props.onChangeText('addressState', null); From ae984be479a1808b49b83c2dd7011b9059246984 Mon Sep 17 00:00:00 2001 From: Aldo Canepa Date: Wed, 20 Oct 2021 17:31:58 -0700 Subject: [PATCH 05/10] Refactor AddressSearch functions and add tests --- src/components/AddressSearch.js | 63 +++--------- src/libs/GooglePlacesUtils.js | 36 +++++++ tests/unit/GooglePlacesUtilsTest.js | 142 ++++++++++++++++++++++++++++ 3 files changed, 192 insertions(+), 49 deletions(-) create mode 100644 src/libs/GooglePlacesUtils.js create mode 100644 tests/unit/GooglePlacesUtilsTest.js diff --git a/src/components/AddressSearch.js b/src/components/AddressSearch.js index 85ed41c24fac..c91e0c9da9ee 100644 --- a/src/components/AddressSearch.js +++ b/src/components/AddressSearch.js @@ -1,4 +1,3 @@ -import _ from 'underscore'; import React, {useEffect, useRef} from 'react'; import PropTypes from 'prop-types'; import {LogBox} from 'react-native'; @@ -8,6 +7,7 @@ import withLocalize, {withLocalizePropTypes} from './withLocalize'; import styles from '../styles/styles'; import ExpensiTextInput from './ExpensiTextInput'; import Log from '../libs/Log'; +import {getAddressComponent, validateAddressComponents} from '../libs/GooglePlacesUtils'; // The error that's being thrown below will be ignored until we fork the // react-native-google-places-autocomplete repo and replace the @@ -34,60 +34,25 @@ const defaultProps = { containerStyles: null, }; -const AddressSearch = (props) => { +export const AddressSearchComponent = (props) => { const googlePlacesRef = useRef(); useEffect(() => { googlePlacesRef.current?.setAddressText(props.value); }, []); - // eslint-disable-next-line - const getAddressComponent = (object, field, nameType) => { - return _.chain(object.address_components) - .find(component => _.contains(component.types, field)) - .get(nameType) - .value(); - }; - - const validateAddressComponents = (addressComponents) => { - if (!addressComponents) { - return false; - } - if (!_.some(addressComponents, component => _.includes(component.types, 'street_number'))) { - // Missing Street number - return false; - } - if (!_.some(addressComponents, component => _.includes(component.types, 'postal_code'))) { - // Missing zip code - return false; - } - if (!_.some(addressComponents, component => _.includes(component.types, 'administrative_area_level_1'))) { - // Missing state - return false; - } - if (!_.some(addressComponents, component => _.includes(component.types, 'locality')) - && !_.some(addressComponents, component => _.includes(component.types, 'sublocality'))) { - // Missing city - return false; - } - if (_.some(addressComponents, component => _.includes(component.types, 'post_box'))) { - // Reject PO box - return false; - } - return true; - }; - const saveLocationDetails = (details) => { - if (validateAddressComponents(details.address_components)) { + const addressComponents = details.address_components; + if (validateAddressComponents(addressComponents)) { // Gather the values from the Google details - const streetNumber = getAddressComponent(details, 'street_number', 'long_name'); - const streetName = getAddressComponent(details, 'route', 'long_name'); - let city = getAddressComponent(details, 'locality', 'long_name'); + const streetNumber = getAddressComponent(addressComponents, 'street_number', 'long_name'); + const streetName = getAddressComponent(addressComponents, 'route', 'long_name'); + let city = getAddressComponent(addressComponents, 'locality', 'long_name'); if (!city) { - city = getAddressComponent(details, 'sublocality', 'long_name'); + city = getAddressComponent(addressComponents, 'sublocality', 'long_name'); Log.hmmm('Replacing missing locality with sublocality: ', {address: details.formatted_address, sublocality: city}); } - const state = getAddressComponent(details, 'administrative_area_level_1', 'short_name'); - const zipCode = getAddressComponent(details, 'postal_code', 'long_name'); + const state = getAddressComponent(addressComponents, 'administrative_area_level_1', 'short_name'); + const zipCode = getAddressComponent(addressComponents, 'postal_code', 'long_name'); // Trigger text change events for each of the individual fields being saved on the server props.onChangeText('addressStreet', `${streetNumber} ${streetName}`); @@ -98,7 +63,7 @@ const AddressSearch = (props) => { // Clear the values associated to the address, so our validations catch the problem Log.hmmm('[AddressSearch] Search result failed validation: ', { address: details.formatted_address, - address_components: details.address_components, + address_components: addressComponents, place_id: details.place_id, }); props.onChangeText('addressStreet', null); @@ -153,7 +118,7 @@ const AddressSearch = (props) => { ); }; -AddressSearch.propTypes = propTypes; -AddressSearch.defaultProps = defaultProps; +AddressSearchComponent.propTypes = propTypes; +AddressSearchComponent.defaultProps = defaultProps; -export default withLocalize(AddressSearch); +export default withLocalize(AddressSearchComponent); diff --git a/src/libs/GooglePlacesUtils.js b/src/libs/GooglePlacesUtils.js new file mode 100644 index 000000000000..bd2aa77232e1 --- /dev/null +++ b/src/libs/GooglePlacesUtils.js @@ -0,0 +1,36 @@ +import _ from 'underscore'; + +export const getAddressComponent = (addressComponents, type, field) => ( + _.chain(addressComponents) + .find(component => _.contains(component.types, type)) + .get(field) + .value() +); + +export const validateAddressComponents = (addressComponents) => { + if (!addressComponents) { + return false; + } + if (!_.some(addressComponents, component => _.includes(component.types, 'street_number'))) { + // Missing Street number + return false; + } + if (!_.some(addressComponents, component => _.includes(component.types, 'postal_code'))) { + // Missing zip code + return false; + } + if (!_.some(addressComponents, component => _.includes(component.types, 'administrative_area_level_1'))) { + // Missing state + return false; + } + if (!_.some(addressComponents, component => _.includes(component.types, 'locality')) + && !_.some(addressComponents, component => _.includes(component.types, 'sublocality'))) { + // Missing city + return false; + } + if (_.some(addressComponents, component => _.includes(component.types, 'post_box'))) { + // Reject PO box + return false; + } + return true; +}; diff --git a/tests/unit/GooglePlacesUtilsTest.js b/tests/unit/GooglePlacesUtilsTest.js new file mode 100644 index 000000000000..4318bf255e5b --- /dev/null +++ b/tests/unit/GooglePlacesUtilsTest.js @@ -0,0 +1,142 @@ +import {getAddressComponent, validateAddressComponents} from '../../src/libs/GooglePlacesUtils'; + +describe('GooglePlacesUtilsTest', () => { + describe('validateAddressComponents', () => { + it('should reject Google Places result with missing street number', () => { + // This result appears when searching for "25220 Quail Ridge Road, Escondido, CA, 97027" + const googlePlacesRouteResult = { + address_components: [ + { + long_name: 'Quail Ridge Road', + short_name: 'Quail Ridge Rd', + types: ['route'], + }, + { + long_name: 'Escondido', + short_name: 'Escondido', + types: ['locality', 'political'], + }, + { + long_name: 'San Diego County', + short_name: 'San Diego County', + types: ['administrative_area_level_2', 'political'], + }, + { + long_name: 'California', + short_name: 'CA', + types: ['administrative_area_level_1', 'political'], + }, + { + long_name: 'United States', + short_name: 'US', + types: ['country', 'political'], + }, + { + long_name: '92027', + short_name: '92027', + types: ['postal_code'], + }, + ], + formatted_address: 'Quail Ridge Rd, Escondido, CA 92027, USA', + place_id: 'EihRdWFpbCBSaWRnZSBSZCwgRXNjb25kaWRvLCBDQSA5MjAyNywgVVNBIi4qLAoUChIJIQBiT7Pz24ARmaXMgCMhqAUSFAoSCXtDwoFe89uAEd_FlncPyNEB', + types: ['route'], + }; + const isValid = validateAddressComponents(googlePlacesRouteResult.address_components); + expect(isValid).toStrictEqual(false); + }); + + it('should accept Google Places result with missing locality if sublocality is available', () => { + // This result appears when searching for "64 Noll Street, Brooklyn, NY, USA" + const brooklynAddressResult = { + address_components: [ + { + long_name: '64', + short_name: '64', + types: ['street_number'], + }, + { + long_name: 'Noll Street', + short_name: 'Noll St', + types: ['route'], + }, + { + long_name: 'Bushwick', + short_name: 'Bushwick', + types: ['neighborhood', 'political'], + }, + { + long_name: 'Brooklyn', + short_name: 'Brooklyn', + types: ['sublocality_level_1', 'sublocality', 'political'], + }, + { + long_name: 'Kings County', + short_name: 'Kings County', + types: ['administrative_area_level_2', 'political'], + }, + { + long_name: 'New York', + short_name: 'NY', + types: ['administrative_area_level_1', 'political'], + }, + { + long_name: 'United States', + short_name: 'US', + types: ['country', 'political'], + }, + { + long_name: '11206', + short_name: '11206', + types: ['postal_code'], + }, + { + long_name: '4604', + short_name: '4604', + types: ['postal_code_suffix'], + }, + ], + formatted_address: '64 Noll St, Brooklyn, NY 11206, USA', + // eslint-disable-next-line max-len + place_id: 'EiM2NCBOb2xsIFN0LCBCcm9va2x5biwgTlkgMTEyMDYsIFVTQSJQEk4KNAoyCReOha8HXMKJETjOQzBxX7M3Gh4LEO7B7qEBGhQKEgmJzguI-VvCiRFYR8sAAcN5KAwQQCoUChIJH0FG4AZcwokRvrvwkhWA_6A', + types: ['street_address'], + }; + const isValid = validateAddressComponents(brooklynAddressResult.address_components); + expect(isValid).toStrictEqual(true); + }); + }); + describe('getAddressComponent', () => { + it('should find address components by type', () => { + const addressComponents = [ + { + long_name: 'Bushwick', + short_name: 'Bushwick', + types: ['neighborhood', 'political'], + }, + { + long_name: 'Brooklyn', + short_name: 'Brooklyn', + types: ['sublocality_level_1', 'sublocality', 'political'], + }, + { + long_name: 'New York', + short_name: 'NY', + types: ['administrative_area_level_1', 'political'], + }, + { + long_name: 'United States', + short_name: 'US', + types: ['country', 'political'], + }, + { + long_name: '11206', + short_name: '11206', + types: ['postal_code'], + }, + ]; + expect(getAddressComponent(addressComponents, 'sublocality', 'long_name')).toStrictEqual('Brooklyn'); + expect(getAddressComponent(addressComponents, 'administrative_area_level_1', 'short_name')).toStrictEqual('NY'); + expect(getAddressComponent(addressComponents, 'postal_code', 'long_name')).toStrictEqual('11206'); + expect(getAddressComponent(addressComponents, 'doesn-exist', 'long_name')).toStrictEqual(undefined); + }); + }); +}); From d49068fa45bca2625631e88b959856fb2b5f56e3 Mon Sep 17 00:00:00 2001 From: Aldo Canepa Date: Fri, 22 Oct 2021 16:18:31 -0700 Subject: [PATCH 06/10] Reorganize exports --- src/components/AddressSearch.js | 8 ++++---- src/libs/GooglePlacesUtils.js | 15 ++++++++++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/components/AddressSearch.js b/src/components/AddressSearch.js index c91e0c9da9ee..2832a83e3cea 100644 --- a/src/components/AddressSearch.js +++ b/src/components/AddressSearch.js @@ -34,7 +34,7 @@ const defaultProps = { containerStyles: null, }; -export const AddressSearchComponent = (props) => { +const AddressSearch = (props) => { const googlePlacesRef = useRef(); useEffect(() => { googlePlacesRef.current?.setAddressText(props.value); @@ -118,7 +118,7 @@ export const AddressSearchComponent = (props) => { ); }; -AddressSearchComponent.propTypes = propTypes; -AddressSearchComponent.defaultProps = defaultProps; +AddressSearch.propTypes = propTypes; +AddressSearch.defaultProps = defaultProps; -export default withLocalize(AddressSearchComponent); +export default withLocalize(AddressSearch); diff --git a/src/libs/GooglePlacesUtils.js b/src/libs/GooglePlacesUtils.js index bd2aa77232e1..d1efd826cbc6 100644 --- a/src/libs/GooglePlacesUtils.js +++ b/src/libs/GooglePlacesUtils.js @@ -1,13 +1,13 @@ import _ from 'underscore'; -export const getAddressComponent = (addressComponents, type, field) => ( - _.chain(addressComponents) +function getAddressComponent(addressComponents, type, field) { + return _.chain(addressComponents) .find(component => _.contains(component.types, type)) .get(field) - .value() -); + .value(); +} -export const validateAddressComponents = (addressComponents) => { +function validateAddressComponents(addressComponents) { if (!addressComponents) { return false; } @@ -33,4 +33,9 @@ export const validateAddressComponents = (addressComponents) => { return false; } return true; +} + +export { + getAddressComponent, + validateAddressComponents, }; From 13d91cc66f1474129b443006908a69b980bf8ee5 Mon Sep 17 00:00:00 2001 From: Aldo Canepa Date: Fri, 22 Oct 2021 16:20:33 -0700 Subject: [PATCH 07/10] Add [AddressSearch] to Log.hmmm --- src/components/AddressSearch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/AddressSearch.js b/src/components/AddressSearch.js index 2832a83e3cea..c96228e4f30b 100644 --- a/src/components/AddressSearch.js +++ b/src/components/AddressSearch.js @@ -49,7 +49,7 @@ const AddressSearch = (props) => { let city = getAddressComponent(addressComponents, 'locality', 'long_name'); if (!city) { city = getAddressComponent(addressComponents, 'sublocality', 'long_name'); - Log.hmmm('Replacing missing locality with sublocality: ', {address: details.formatted_address, sublocality: city}); + Log.hmmm('[AddressSearch] Replacing missing locality with sublocality: ', {address: details.formatted_address, sublocality: city}); } const state = getAddressComponent(addressComponents, 'administrative_area_level_1', 'short_name'); const zipCode = getAddressComponent(addressComponents, 'postal_code', 'long_name'); From 23ad37fe0c28ecbb4ed1a3b2cb2bf41f952a2f58 Mon Sep 17 00:00:00 2001 From: Aldo Canepa Date: Fri, 22 Oct 2021 16:30:09 -0700 Subject: [PATCH 08/10] Add documentation to GooglePlacesUtils.js --- src/libs/GooglePlacesUtils.js | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/libs/GooglePlacesUtils.js b/src/libs/GooglePlacesUtils.js index d1efd826cbc6..e47c90a96e8c 100644 --- a/src/libs/GooglePlacesUtils.js +++ b/src/libs/GooglePlacesUtils.js @@ -1,12 +1,32 @@ import _ from 'underscore'; -function getAddressComponent(addressComponents, type, field) { +/** + * Finds an address component by type, and returns the value associated to key. Each address component object + * inside the addressComponents array has the following structure: + * { + * long_name: "New York", + * short_name: "New York", + * types: [ "locality", "political" ] + * } + * + * @param {Array} addressComponents + * @param {String} type + * @param {String} key + * @returns {String|undefined} + */ +function getAddressComponent(addressComponents, type, key) { return _.chain(addressComponents) .find(component => _.contains(component.types, type)) - .get(field) + .get(key) .value(); } +/** + * Validates this contains the minimum address components + * + * @param {Array} addressComponents + * @returns {Boolean} + */ function validateAddressComponents(addressComponents) { if (!addressComponents) { return false; From 0c844d99de19e95ef4c10a33f998c37c711be6b4 Mon Sep 17 00:00:00 2001 From: Aldo Canepa Date: Fri, 22 Oct 2021 16:36:37 -0700 Subject: [PATCH 09/10] Rename address component validation function --- src/components/AddressSearch.js | 4 ++-- src/libs/GooglePlacesUtils.js | 4 ++-- tests/unit/GooglePlacesUtilsTest.js | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/AddressSearch.js b/src/components/AddressSearch.js index c96228e4f30b..2eff8833149d 100644 --- a/src/components/AddressSearch.js +++ b/src/components/AddressSearch.js @@ -7,7 +7,7 @@ import withLocalize, {withLocalizePropTypes} from './withLocalize'; import styles from '../styles/styles'; import ExpensiTextInput from './ExpensiTextInput'; import Log from '../libs/Log'; -import {getAddressComponent, validateAddressComponents} from '../libs/GooglePlacesUtils'; +import {getAddressComponent, isAddressValidForVBA} from '../libs/GooglePlacesUtils'; // The error that's being thrown below will be ignored until we fork the // react-native-google-places-autocomplete repo and replace the @@ -42,7 +42,7 @@ const AddressSearch = (props) => { const saveLocationDetails = (details) => { const addressComponents = details.address_components; - if (validateAddressComponents(addressComponents)) { + if (isAddressValidForVBA(addressComponents)) { // Gather the values from the Google details const streetNumber = getAddressComponent(addressComponents, 'street_number', 'long_name'); const streetName = getAddressComponent(addressComponents, 'route', 'long_name'); diff --git a/src/libs/GooglePlacesUtils.js b/src/libs/GooglePlacesUtils.js index e47c90a96e8c..71c738062d11 100644 --- a/src/libs/GooglePlacesUtils.js +++ b/src/libs/GooglePlacesUtils.js @@ -27,7 +27,7 @@ function getAddressComponent(addressComponents, type, key) { * @param {Array} addressComponents * @returns {Boolean} */ -function validateAddressComponents(addressComponents) { +function isAddressValidForVBA(addressComponents) { if (!addressComponents) { return false; } @@ -57,5 +57,5 @@ function validateAddressComponents(addressComponents) { export { getAddressComponent, - validateAddressComponents, + isAddressValidForVBA, }; diff --git a/tests/unit/GooglePlacesUtilsTest.js b/tests/unit/GooglePlacesUtilsTest.js index 4318bf255e5b..2ec7445623d1 100644 --- a/tests/unit/GooglePlacesUtilsTest.js +++ b/tests/unit/GooglePlacesUtilsTest.js @@ -1,7 +1,7 @@ -import {getAddressComponent, validateAddressComponents} from '../../src/libs/GooglePlacesUtils'; +import {getAddressComponent, isAddressValidForVBA} from '../../src/libs/GooglePlacesUtils'; describe('GooglePlacesUtilsTest', () => { - describe('validateAddressComponents', () => { + describe('isAddressValidForVBA', () => { it('should reject Google Places result with missing street number', () => { // This result appears when searching for "25220 Quail Ridge Road, Escondido, CA, 97027" const googlePlacesRouteResult = { @@ -41,7 +41,7 @@ describe('GooglePlacesUtilsTest', () => { place_id: 'EihRdWFpbCBSaWRnZSBSZCwgRXNjb25kaWRvLCBDQSA5MjAyNywgVVNBIi4qLAoUChIJIQBiT7Pz24ARmaXMgCMhqAUSFAoSCXtDwoFe89uAEd_FlncPyNEB', types: ['route'], }; - const isValid = validateAddressComponents(googlePlacesRouteResult.address_components); + const isValid = isAddressValidForVBA(googlePlacesRouteResult.address_components); expect(isValid).toStrictEqual(false); }); @@ -100,7 +100,7 @@ describe('GooglePlacesUtilsTest', () => { place_id: 'EiM2NCBOb2xsIFN0LCBCcm9va2x5biwgTlkgMTEyMDYsIFVTQSJQEk4KNAoyCReOha8HXMKJETjOQzBxX7M3Gh4LEO7B7qEBGhQKEgmJzguI-VvCiRFYR8sAAcN5KAwQQCoUChIJH0FG4AZcwokRvrvwkhWA_6A', types: ['street_address'], }; - const isValid = validateAddressComponents(brooklynAddressResult.address_components); + const isValid = isAddressValidForVBA(brooklynAddressResult.address_components); expect(isValid).toStrictEqual(true); }); }); From 62d60556b4dea555c4fbd5bb41003dbeb59c7bb1 Mon Sep 17 00:00:00 2001 From: Aldo Canepa Date: Fri, 22 Oct 2021 16:39:36 -0700 Subject: [PATCH 10/10] Add missing import --- src/components/AddressSearch.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/AddressSearch.js b/src/components/AddressSearch.js index 62c097fca80c..a83534eb05c2 100644 --- a/src/components/AddressSearch.js +++ b/src/components/AddressSearch.js @@ -1,3 +1,4 @@ +import _ from 'underscore'; import React, {useEffect, useRef} from 'react'; import PropTypes from 'prop-types'; import {LogBox} from 'react-native';