Skip to content

Commit b49db84

Browse files
Extended Component Library Teamcopybara-github
authored andcommitted
Internal
PiperOrigin-RevId: 748444272
1 parent d1f4050 commit b49db84

3 files changed

Lines changed: 62 additions & 45 deletions

File tree

src/address_validation/suggest_validation_action.ts

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import {Address, AddressValidationResponse, Granularity, ValidationResult} from '../utils/googlemaps_types.js';
7+
import {Address, AddressValidation, Granularity} from '../utils/googlemaps_types.js';
88

99

1010
/** Suggested action to take for this validation result. */
@@ -32,8 +32,8 @@ function isUSA(address: Address): boolean {
3232
return address.postalAddress?.regionCode === 'US';
3333
}
3434

35-
function isMissingNonSubpremiseComponent(result: ValidationResult): boolean {
36-
const missingComponents = result.address.missingComponentTypes || [];
35+
function isMissingNonSubpremiseComponent(result: AddressValidation): boolean {
36+
const missingComponents = result.address?.missingComponentTypes || [];
3737
return (missingComponents.length > 1) ||
3838
((missingComponents.length === 1) &&
3939
(missingComponents[0] !== SUBPREMISE));
@@ -44,47 +44,54 @@ function isMissingNonSubpremiseComponent(result: ValidationResult): boolean {
4444
* `ROUTE` level. `PREMISE`, `SUBPREMISE`, and `PREMISE_PROXIMITY` are all
4545
* considered as good as `ROUTE` or better.
4646
*/
47-
function hasValidationGranularityOther(result: ValidationResult): boolean {
47+
function hasValidationGranularityOther(result: AddressValidation): boolean {
4848
return !result.verdict?.validationGranularity ||
4949
result.verdict.validationGranularity === Granularity.OTHER;
5050
}
5151

52-
function hasSuspiciousComponent(result: ValidationResult): boolean {
53-
return result.address.addressComponents.some(
54-
c => c.confirmationLevel === 'UNCONFIRMED_AND_SUSPICIOUS');
52+
function hasSuspiciousComponent(result: AddressValidation): boolean {
53+
return !!result.address &&
54+
result.address.components.some(
55+
c => c.confirmationLevel === 'UNCONFIRMED_AND_SUSPICIOUS');
5556
}
5657

57-
function hasUnresolvedToken(result: ValidationResult): boolean {
58-
return (result.address.unresolvedTokens || []).length > 0;
58+
function hasUnresolvedToken(result: AddressValidation): boolean {
59+
return !!result.address &&
60+
(result.address.unresolvedTokens || []).length > 0;
5961
}
6062

6163
/**
6264
* Returns true if the result has an inference for a component other than the
6365
* postal code, administrative area (1, 2, or 3), or country.
6466
*/
65-
function hasMajorInference(result: ValidationResult): boolean {
67+
function hasMajorInference(result: AddressValidation): boolean {
6668
const minorComponents = new Set([
6769
POSTAL_CODE, POSTAL_CODE_SUFFIX, ADMINISTRATIVE_AREA_LEVEL_1,
6870
ADMINISTRATIVE_AREA_LEVEL_2, ADMINISTRATIVE_AREA_LEVEL_3, COUNTRY
6971
]);
70-
return result.address.addressComponents.some(
71-
c => c.isInferred && !minorComponents.has(c.componentType));
72+
return !!result.address &&
73+
result.address.components.some(
74+
c => c.isInferred && !minorComponents.has(c.componentType))
7275
}
7376

74-
function hasReplacement(result: ValidationResult): boolean {
77+
function hasReplacement(result: AddressValidation): boolean {
7578
return !!result.verdict?.hasReplacedComponents;
7679
}
7780

7881
/**
7982
* Returns true if this is a US address that is missing a subpremise component
8083
* (and nothing else).
8184
*/
82-
function isMissingExactlyUSASubpremise(result: ValidationResult): boolean {
83-
return isUSA(result.address) &&
85+
function isMissingExactlyUSASubpremise(result: AddressValidation): boolean {
86+
return !!result.address && isUSA(result.address) &&
8487
(result.address.missingComponentTypes?.length === 1) &&
8588
(result.address.missingComponentTypes[0] === SUBPREMISE);
8689
}
8790

91+
function isIncompleteResult(result: AddressValidation): boolean {
92+
return !result.verdict || !result.address;
93+
}
94+
8895
/**
8996
* This is a JavaScript function that analyzes an Address Validation API
9097
* response and outputs a single recommended follow-up action you should take
@@ -137,16 +144,16 @@ function isMissingExactlyUSASubpremise(result: ValidationResult): boolean {
137144
* @param response - A response object from the Address Validation API in the
138145
* Maps JS SDK.
139146
*/
140-
export function suggestValidationAction(response: AddressValidationResponse):
147+
export function suggestValidationAction(response: AddressValidation):
141148
ValidationSuggestion {
142-
const result = response.result;
143-
if (isMissingNonSubpremiseComponent(result) ||
144-
hasValidationGranularityOther(result) || hasSuspiciousComponent(result) ||
145-
hasUnresolvedToken(result)) {
149+
if (isIncompleteResult(response) ||
150+
isMissingNonSubpremiseComponent(response) ||
151+
hasValidationGranularityOther(response) ||
152+
hasSuspiciousComponent(response) || hasUnresolvedToken(response)) {
146153
return {suggestedAction: SuggestedAction.FIX};
147-
} else if (hasMajorInference(result) || hasReplacement(result)) {
154+
} else if (hasMajorInference(response) || hasReplacement(response)) {
148155
return {suggestedAction: SuggestedAction.CONFIRM};
149-
} else if (isMissingExactlyUSASubpremise(result)) {
156+
} else if (isMissingExactlyUSASubpremise(response)) {
150157
return {suggestedAction: SuggestedAction.ADD_SUBPREMISES};
151158
} else {
152159
return {suggestedAction: SuggestedAction.ACCEPT};

src/address_validation/suggest_validation_action_test.ts

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
// import 'jasmine'; (google3-only)
88

9-
import {Address, AddressComponent, AddressValidationResponse, ConfirmationLevel, Granularity, Verdict} from '../utils/googlemaps_types.js';
9+
import {Address, AddressComponent, AddressValidation, ConfirmationLevel, Granularity, Verdict} from '../utils/googlemaps_types.js';
1010

1111
import {SuggestedAction, suggestValidationAction} from './suggest_validation_action.js';
1212

@@ -31,22 +31,33 @@ const LOCALITY_COMPONENT: AddressComponent = {
3131
};
3232

3333
function makeFakeValidationResponse(
34-
address: Partial<Address>, verdict: Verdict): AddressValidationResponse {
34+
address: Partial<Address>, verdict: Verdict|null): AddressValidation {
3535
return {
36-
result: {
37-
verdict,
38-
address: {
39-
formattedAddress: null,
40-
postalAddress: null,
41-
addressComponents: [],
42-
...address
43-
},
36+
verdict,
37+
address: {
38+
formattedAddress: null,
39+
postalAddress: null,
40+
components: [],
41+
...address
4442
},
45-
responseId: ''
43+
44+
responseId: '',
4645
};
4746
}
4847

4948
describe('SuggestValidationAction', () => {
49+
it('returns FIX when an address is missing', () => {
50+
const suggestion = suggestValidationAction(
51+
{address: null, responseId: '', verdict: GOOD_VERDICT});
52+
expect(suggestion.suggestedAction).toBe(SuggestedAction.FIX);
53+
});
54+
55+
it('returns FIX when verdict is missing', () => {
56+
const suggestion =
57+
suggestValidationAction(makeFakeValidationResponse({}, null));
58+
expect(suggestion.suggestedAction).toBe(SuggestedAction.FIX);
59+
});
60+
5061
it('returns FIX when an address is missing a non-subpremise component',
5162
() => {
5263
const suggestion = suggestValidationAction(makeFakeValidationResponse(
@@ -63,7 +74,7 @@ describe('SuggestValidationAction', () => {
6374
it('returns FIX when there is a suspicious component', () => {
6475
const suggestion = suggestValidationAction(makeFakeValidationResponse(
6576
{
66-
addressComponents: [{
77+
components: [{
6778
...LOCALITY_COMPONENT,
6879
confirmationLevel: ConfirmationLevel.UNCONFIRMED_AND_SUSPICIOUS
6980
}]
@@ -81,7 +92,7 @@ describe('SuggestValidationAction', () => {
8192
it('returns CONFIRM when there is a non-minor inferred component', () => {
8293
const suggestion = suggestValidationAction(makeFakeValidationResponse(
8394
{
84-
addressComponents: [{
95+
components: [{
8596
...LOCALITY_COMPONENT,
8697
isInferred: true,
8798
}]

src/utils/googlemaps_types.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export declare interface PostalAddress {
9696
export declare interface Address {
9797
formattedAddress: string|null;
9898
postalAddress: PostalAddress|null;
99-
addressComponents: AddressComponent[];
99+
components: AddressComponent[];
100100
missingComponentTypes?: string[];
101101
unconfirmedComponentTypes?: string[];
102102
unresolvedTokens?: string[];
@@ -124,18 +124,17 @@ export declare interface Verdict {
124124
hasReplacedComponents: boolean;
125125
}
126126

127-
/** google.maps.addressValidation.ValidationResult */
128-
export declare interface ValidationResult {
127+
/** google.maps.addressValidation.AddressValidation */
128+
export declare interface AddressValidation {
129+
responseId: string|null;
129130
verdict: Verdict|null;
130-
address: Address;
131+
address: Address|null;
132+
133+
// These properties exist but are not needed for the ECL.
131134
// geocode: Geocode;
132135
// metadata: AddressMetadata;
133136
// uspsData: UspsData;
134-
// englishLatinAddress: Address;
135-
}
136137

137-
/** google.maps.addressValidation.AddressValidationResponse */
138-
export declare interface AddressValidationResponse {
139-
result: ValidationResult;
140-
responseId: string;
138+
// This property is not yet published.
139+
// englishLatinAddress: Address;
141140
}

0 commit comments

Comments
 (0)