Skip to content

Commit 07ff780

Browse files
Extended Component Library Teamcopybara-github
authored andcommitted
fix: update suggestValidationAction with updated AddressValidation syntax
PiperOrigin-RevId: 758453487
1 parent 772cbaf commit 07ff780

4 files changed

Lines changed: 68 additions & 51 deletions

File tree

src/address_validation/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ for guidance.
6767

6868
**Parameters:**
6969

70-
| Name | Optional? | Type | Description |
71-
| ---------- | --------- | --------------------------- | --------------------------------------------------------------------- |
72-
| `response` | | `AddressValidationResponse` | A response object from the Address Validation API in the Maps JS SDK. |
70+
| Name | Optional? | Type | Description |
71+
| ---------- | --------- | ------------------- | --------------------------------------------------------------------- |
72+
| `response` | | `AddressValidation` | A response object from the Address Validation API in the Maps JS SDK. |
7373

7474
#### Importing
7575

src/address_validation/suggest_validation_action.ts

Lines changed: 32 additions & 25 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,53 @@ 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?.components.some(
54+
c => c.confirmationLevel === 'UNCONFIRMED_AND_SUSPICIOUS'));
5555
}
5656

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

6162
/**
6263
* Returns true if the result has an inference for a component other than the
6364
* postal code, administrative area (1, 2, or 3), or country.
6465
*/
65-
function hasMajorInference(result: ValidationResult): boolean {
66+
function hasMajorInference(result: AddressValidation): boolean {
6667
const minorComponents = new Set([
6768
POSTAL_CODE, POSTAL_CODE_SUFFIX, ADMINISTRATIVE_AREA_LEVEL_1,
6869
ADMINISTRATIVE_AREA_LEVEL_2, ADMINISTRATIVE_AREA_LEVEL_3, COUNTRY
6970
]);
70-
return result.address.addressComponents.some(
71-
c => c.isInferred && !minorComponents.has(c.componentType));
71+
return !!result.address &&
72+
result.address.components.some(
73+
c => c.isInferred && !minorComponents.has(c.componentType))
7274
}
7375

74-
function hasReplacement(result: ValidationResult): boolean {
76+
function hasReplacement(result: AddressValidation): boolean {
7577
return !!result.verdict?.hasReplacedComponents;
7678
}
7779

7880
/**
7981
* Returns true if this is a US address that is missing a subpremise component
8082
* (and nothing else).
8183
*/
82-
function isMissingExactlyUSASubpremise(result: ValidationResult): boolean {
83-
return isUSA(result.address) &&
84+
function isMissingExactlyUSASubpremise(result: AddressValidation): boolean {
85+
return !!result.address && isUSA(result.address) &&
8486
(result.address.missingComponentTypes?.length === 1) &&
8587
(result.address.missingComponentTypes[0] === SUBPREMISE);
8688
}
8789

90+
function isIncompleteResult({verdict, address}: AddressValidation): boolean {
91+
return !verdict || !address;
92+
}
93+
8894
/**
8995
* This is a JavaScript function that analyzes an Address Validation API
9096
* response and outputs a single recommended follow-up action you should take
@@ -137,18 +143,19 @@ function isMissingExactlyUSASubpremise(result: ValidationResult): boolean {
137143
* @param response - A response object from the Address Validation API in the
138144
* Maps JS SDK.
139145
*/
140-
export function suggestValidationAction(response: AddressValidationResponse):
146+
export function suggestValidationAction(response: AddressValidation):
141147
ValidationSuggestion {
142-
const result = response.result;
143-
if (isMissingNonSubpremiseComponent(result) ||
144-
hasValidationGranularityOther(result) || hasSuspiciousComponent(result) ||
145-
hasUnresolvedToken(result)) {
148+
if (isIncompleteResult(response) ||
149+
isMissingNonSubpremiseComponent(response) ||
150+
hasValidationGranularityOther(response) ||
151+
hasSuspiciousComponent(response) || hasUnresolvedToken(response)) {
146152
return {suggestedAction: SuggestedAction.FIX};
147-
} else if (hasMajorInference(result) || hasReplacement(result)) {
153+
}
154+
if (hasMajorInference(response) || hasReplacement(response)) {
148155
return {suggestedAction: SuggestedAction.CONFIRM};
149-
} else if (isMissingExactlyUSASubpremise(result)) {
150-
return {suggestedAction: SuggestedAction.ADD_SUBPREMISES};
151-
} else {
152-
return {suggestedAction: SuggestedAction.ACCEPT};
153156
}
157+
if (isMissingExactlyUSASubpremise(response)) {
158+
return {suggestedAction: SuggestedAction.ADD_SUBPREMISES};
159+
}
160+
return {suggestedAction: SuggestedAction.ACCEPT};
154161
}

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)