@elliemae/loan-field-renderers 26.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/ARCHITECTURE.md +434 -0
- package/dist/cjs/OVERVIEW.md +229 -0
- package/dist/cjs/bll/constants.js +86 -0
- package/dist/cjs/bll/formatters/booleanFormatter.js +51 -0
- package/dist/cjs/bll/formatters/dateFormatter.js +78 -0
- package/dist/cjs/bll/formatters/dropdownFormatter.js +34 -0
- package/dist/cjs/bll/formatters/factory/index.js +115 -0
- package/dist/cjs/bll/formatters/index.js +24 -0
- package/dist/cjs/bll/formatters/numberFormatter.js +70 -0
- package/dist/cjs/bll/formatters/phoneFormatter.js +57 -0
- package/dist/cjs/bll/formatters/regexFormatter.js +52 -0
- package/dist/cjs/bll/formatters/ssnFormatter.js +50 -0
- package/dist/cjs/bll/formatters/textFormatter.js +43 -0
- package/dist/cjs/bll/formatters/zipFormatter.js +48 -0
- package/dist/cjs/bll/index.js +62 -0
- package/dist/cjs/bll/ssf/index.js +48 -0
- package/dist/cjs/bll/ssf/loan.js +81 -0
- package/dist/cjs/bll/ssf/loconnect.js +70 -0
- package/dist/cjs/bll/ssf/ssfBase.js +97 -0
- package/dist/cjs/bll/ssf/types.js +16 -0
- package/dist/cjs/bll/types.js +16 -0
- package/dist/cjs/bll/validators/dateValidator.js +60 -0
- package/dist/cjs/bll/validators/emailValidator.js +47 -0
- package/dist/cjs/bll/validators/factory/index.js +81 -0
- package/dist/cjs/bll/validators/index.js +24 -0
- package/dist/cjs/bll/validators/maxCharValidator.js +49 -0
- package/dist/cjs/bll/validators/requiredValidator.js +44 -0
- package/dist/cjs/bll/validators/zipValidator.js +53 -0
- package/dist/cjs/core/index.js +52 -0
- package/dist/cjs/demo/config.js +391 -0
- package/dist/cjs/demo/index.js +31 -0
- package/dist/cjs/package.json +7 -0
- package/dist/cjs/renderer/FieldRenderer.js +45 -0
- package/dist/cjs/renderer/base/hooks/fieldDescription.js +39 -0
- package/dist/cjs/renderer/base/hooks/fieldDisabled.js +53 -0
- package/dist/cjs/renderer/base/hooks/fieldGoTo.js +50 -0
- package/dist/cjs/renderer/base/hooks/fieldLocked.js +42 -0
- package/dist/cjs/renderer/base/hooks/fieldMeta.js +150 -0
- package/dist/cjs/renderer/base/hooks/fieldSubscribers.js +66 -0
- package/dist/cjs/renderer/base/hooks/fieldValidation.js +45 -0
- package/dist/cjs/renderer/base/hooks/fieldValue.js +215 -0
- package/dist/cjs/renderer/base/hooks/hookBase.js +29 -0
- package/dist/cjs/renderer/base/hooks/index.js +139 -0
- package/dist/cjs/renderer/base/renderer.js +198 -0
- package/dist/cjs/renderer/base/rendererValidator.js +97 -0
- package/dist/cjs/renderer/factory/index.js +58 -0
- package/dist/cjs/renderer/field-renderers/AddonRenderer.js +75 -0
- package/dist/cjs/renderer/field-renderers/CheckboxRenderer.js +123 -0
- package/dist/cjs/renderer/field-renderers/DateRenderer.js +206 -0
- package/dist/cjs/renderer/field-renderers/DropdownRenderer/hook.js +99 -0
- package/dist/cjs/renderer/field-renderers/DropdownRenderer/index.js +216 -0
- package/dist/cjs/renderer/field-renderers/LargeTextRenderer.js +209 -0
- package/dist/cjs/renderer/field-renderers/NumberRenderer.js +216 -0
- package/dist/cjs/renderer/field-renderers/RadioGroupRenderer.js +128 -0
- package/dist/cjs/renderer/field-renderers/RadioRenderer.js +121 -0
- package/dist/cjs/renderer/field-renderers/TextRenderer.js +223 -0
- package/dist/cjs/renderer/field-renderers/ToggleRenderer.js +121 -0
- package/dist/cjs/renderer/field-renderers/ZipCodeRenderer/helper.js +132 -0
- package/dist/cjs/renderer/field-renderers/ZipCodeRenderer/hook.js +128 -0
- package/dist/cjs/renderer/field-renderers/ZipCodeRenderer/index.js +273 -0
- package/dist/cjs/renderer/index.js +24 -0
- package/dist/cjs/renderer/styles.js +51 -0
- package/dist/cjs/renderer/types.js +16 -0
- package/dist/cjs/tests/base/flowBase.js +125 -0
- package/dist/cjs/tests/base/index.js +52 -0
- package/dist/cjs/tests/flows/checkboxRendererFlows.js +85 -0
- package/dist/cjs/tests/flows/dateRendererFlows.js +870 -0
- package/dist/cjs/tests/flows/dropdownRendererFlows.js +591 -0
- package/dist/cjs/tests/flows/largeTextRendererFlows.js +99 -0
- package/dist/cjs/tests/flows/numberRendererFlows.js +175 -0
- package/dist/cjs/tests/flows/radioRendererFlows.js +115 -0
- package/dist/cjs/tests/flows/textRendererFlows.js +349 -0
- package/dist/cjs/tests/flows/toggleRendererFlows.js +106 -0
- package/dist/cjs/tests/flows/zipCodeRendererFlows.js +1163 -0
- package/dist/cjs/utils/dateHelper.js +65 -0
- package/dist/esm/ARCHITECTURE.md +434 -0
- package/dist/esm/OVERVIEW.md +229 -0
- package/dist/esm/bll/constants.js +66 -0
- package/dist/esm/bll/formatters/booleanFormatter.js +33 -0
- package/dist/esm/bll/formatters/dateFormatter.js +48 -0
- package/dist/esm/bll/formatters/dropdownFormatter.js +14 -0
- package/dist/esm/bll/formatters/factory/index.js +97 -0
- package/dist/esm/bll/formatters/index.js +4 -0
- package/dist/esm/bll/formatters/numberFormatter.js +54 -0
- package/dist/esm/bll/formatters/phoneFormatter.js +41 -0
- package/dist/esm/bll/formatters/regexFormatter.js +34 -0
- package/dist/esm/bll/formatters/ssnFormatter.js +32 -0
- package/dist/esm/bll/formatters/textFormatter.js +25 -0
- package/dist/esm/bll/formatters/zipFormatter.js +30 -0
- package/dist/esm/bll/index.js +44 -0
- package/dist/esm/bll/ssf/index.js +30 -0
- package/dist/esm/bll/ssf/loan.js +63 -0
- package/dist/esm/bll/ssf/loconnect.js +52 -0
- package/dist/esm/bll/ssf/ssfBase.js +67 -0
- package/dist/esm/bll/ssf/types.js +0 -0
- package/dist/esm/bll/types.js +0 -0
- package/dist/esm/bll/validators/dateValidator.js +30 -0
- package/dist/esm/bll/validators/emailValidator.js +29 -0
- package/dist/esm/bll/validators/factory/index.js +63 -0
- package/dist/esm/bll/validators/index.js +4 -0
- package/dist/esm/bll/validators/maxCharValidator.js +31 -0
- package/dist/esm/bll/validators/requiredValidator.js +26 -0
- package/dist/esm/bll/validators/zipValidator.js +35 -0
- package/dist/esm/core/index.js +34 -0
- package/dist/esm/demo/config.js +371 -0
- package/dist/esm/demo/index.js +11 -0
- package/dist/esm/package.json +7 -0
- package/dist/esm/renderer/FieldRenderer.js +15 -0
- package/dist/esm/renderer/base/hooks/fieldDescription.js +19 -0
- package/dist/esm/renderer/base/hooks/fieldDisabled.js +33 -0
- package/dist/esm/renderer/base/hooks/fieldGoTo.js +30 -0
- package/dist/esm/renderer/base/hooks/fieldLocked.js +22 -0
- package/dist/esm/renderer/base/hooks/fieldMeta.js +132 -0
- package/dist/esm/renderer/base/hooks/fieldSubscribers.js +36 -0
- package/dist/esm/renderer/base/hooks/fieldValidation.js +25 -0
- package/dist/esm/renderer/base/hooks/fieldValue.js +195 -0
- package/dist/esm/renderer/base/hooks/hookBase.js +9 -0
- package/dist/esm/renderer/base/hooks/index.js +121 -0
- package/dist/esm/renderer/base/renderer.js +178 -0
- package/dist/esm/renderer/base/rendererValidator.js +77 -0
- package/dist/esm/renderer/factory/index.js +38 -0
- package/dist/esm/renderer/field-renderers/AddonRenderer.js +55 -0
- package/dist/esm/renderer/field-renderers/CheckboxRenderer.js +93 -0
- package/dist/esm/renderer/field-renderers/DateRenderer.js +176 -0
- package/dist/esm/renderer/field-renderers/DropdownRenderer/hook.js +79 -0
- package/dist/esm/renderer/field-renderers/DropdownRenderer/index.js +186 -0
- package/dist/esm/renderer/field-renderers/LargeTextRenderer.js +179 -0
- package/dist/esm/renderer/field-renderers/NumberRenderer.js +188 -0
- package/dist/esm/renderer/field-renderers/RadioGroupRenderer.js +108 -0
- package/dist/esm/renderer/field-renderers/RadioRenderer.js +91 -0
- package/dist/esm/renderer/field-renderers/TextRenderer.js +197 -0
- package/dist/esm/renderer/field-renderers/ToggleRenderer.js +91 -0
- package/dist/esm/renderer/field-renderers/ZipCodeRenderer/helper.js +112 -0
- package/dist/esm/renderer/field-renderers/ZipCodeRenderer/hook.js +108 -0
- package/dist/esm/renderer/field-renderers/ZipCodeRenderer/index.js +247 -0
- package/dist/esm/renderer/index.js +4 -0
- package/dist/esm/renderer/styles.js +21 -0
- package/dist/esm/renderer/types.js +0 -0
- package/dist/esm/tests/base/flowBase.js +105 -0
- package/dist/esm/tests/base/index.js +22 -0
- package/dist/esm/tests/flows/checkboxRendererFlows.js +65 -0
- package/dist/esm/tests/flows/dateRendererFlows.js +850 -0
- package/dist/esm/tests/flows/dropdownRendererFlows.js +571 -0
- package/dist/esm/tests/flows/largeTextRendererFlows.js +79 -0
- package/dist/esm/tests/flows/numberRendererFlows.js +155 -0
- package/dist/esm/tests/flows/radioRendererFlows.js +95 -0
- package/dist/esm/tests/flows/textRendererFlows.js +329 -0
- package/dist/esm/tests/flows/toggleRendererFlows.js +86 -0
- package/dist/esm/tests/flows/zipCodeRendererFlows.js +1143 -0
- package/dist/esm/utils/dateHelper.js +35 -0
- package/dist/types/lib/bll/constants.d.ts +9 -0
- package/dist/types/lib/bll/formatters/booleanFormatter.d.ts +5 -0
- package/dist/types/lib/bll/formatters/dateFormatter.d.ts +28 -0
- package/dist/types/lib/bll/formatters/dropdownFormatter.d.ts +6 -0
- package/dist/types/lib/bll/formatters/factory/index.d.ts +71 -0
- package/dist/types/lib/bll/formatters/index.d.ts +2 -0
- package/dist/types/lib/bll/formatters/numberFormatter.d.ts +6 -0
- package/dist/types/lib/bll/formatters/phoneFormatter.d.ts +7 -0
- package/dist/types/lib/bll/formatters/regexFormatter.d.ts +5 -0
- package/dist/types/lib/bll/formatters/ssnFormatter.d.ts +5 -0
- package/dist/types/lib/bll/formatters/textFormatter.d.ts +6 -0
- package/dist/types/lib/bll/formatters/zipFormatter.d.ts +5 -0
- package/dist/types/lib/bll/index.d.ts +20 -0
- package/dist/types/lib/bll/ssf/index.d.ts +25 -0
- package/dist/types/lib/bll/ssf/loan.d.ts +16 -0
- package/dist/types/lib/bll/ssf/loconnect.d.ts +15 -0
- package/dist/types/lib/bll/ssf/ssfBase.d.ts +23 -0
- package/dist/types/lib/bll/ssf/types.d.ts +99 -0
- package/dist/types/lib/bll/types.d.ts +47 -0
- package/dist/types/lib/bll/validators/dateValidator.d.ts +16 -0
- package/dist/types/lib/bll/validators/emailValidator.d.ts +4 -0
- package/dist/types/lib/bll/validators/factory/index.d.ts +15 -0
- package/dist/types/lib/bll/validators/index.d.ts +2 -0
- package/dist/types/lib/bll/validators/maxCharValidator.d.ts +4 -0
- package/dist/types/lib/bll/validators/requiredValidator.d.ts +4 -0
- package/dist/types/lib/bll/validators/zipValidator.d.ts +5 -0
- package/dist/types/lib/core/index.d.ts +29 -0
- package/dist/types/lib/demo/config.d.ts +11 -0
- package/dist/types/lib/demo/index.d.ts +1 -0
- package/dist/types/lib/renderer/FieldRenderer.d.ts +5 -0
- package/dist/types/lib/renderer/base/hooks/fieldDescription.d.ts +5 -0
- package/dist/types/lib/renderer/base/hooks/fieldDisabled.d.ts +10 -0
- package/dist/types/lib/renderer/base/hooks/fieldGoTo.d.ts +4 -0
- package/dist/types/lib/renderer/base/hooks/fieldLocked.d.ts +4 -0
- package/dist/types/lib/renderer/base/hooks/fieldMeta.d.ts +10 -0
- package/dist/types/lib/renderer/base/hooks/fieldSubscribers.d.ts +6 -0
- package/dist/types/lib/renderer/base/hooks/fieldValidation.d.ts +9 -0
- package/dist/types/lib/renderer/base/hooks/fieldValue.d.ts +31 -0
- package/dist/types/lib/renderer/base/hooks/hookBase.d.ts +9 -0
- package/dist/types/lib/renderer/base/hooks/index.d.ts +19 -0
- package/dist/types/lib/renderer/base/renderer.d.ts +43 -0
- package/dist/types/lib/renderer/base/rendererValidator.d.ts +15 -0
- package/dist/types/lib/renderer/factory/index.d.ts +5 -0
- package/dist/types/lib/renderer/field-renderers/AddonRenderer.d.ts +12 -0
- package/dist/types/lib/renderer/field-renderers/CheckboxRenderer.d.ts +7 -0
- package/dist/types/lib/renderer/field-renderers/DateRenderer.d.ts +13 -0
- package/dist/types/lib/renderer/field-renderers/DropdownRenderer/hook.d.ts +23 -0
- package/dist/types/lib/renderer/field-renderers/DropdownRenderer/index.d.ts +12 -0
- package/dist/types/lib/renderer/field-renderers/LargeTextRenderer.d.ts +17 -0
- package/dist/types/lib/renderer/field-renderers/NumberRenderer.d.ts +12 -0
- package/dist/types/lib/renderer/field-renderers/RadioGroupRenderer.d.ts +8 -0
- package/dist/types/lib/renderer/field-renderers/RadioRenderer.d.ts +8 -0
- package/dist/types/lib/renderer/field-renderers/TextRenderer.d.ts +8 -0
- package/dist/types/lib/renderer/field-renderers/ToggleRenderer.d.ts +24 -0
- package/dist/types/lib/renderer/field-renderers/ZipCodeRenderer/helper.d.ts +48 -0
- package/dist/types/lib/renderer/field-renderers/ZipCodeRenderer/hook.d.ts +17 -0
- package/dist/types/lib/renderer/field-renderers/ZipCodeRenderer/index.d.ts +9 -0
- package/dist/types/lib/renderer/index.d.ts +2 -0
- package/dist/types/lib/renderer/styles.d.ts +7 -0
- package/dist/types/lib/renderer/types.d.ts +325 -0
- package/dist/types/lib/tests/base/flowBase.d.ts +13 -0
- package/dist/types/lib/tests/base/index.d.ts +6 -0
- package/dist/types/lib/tests/flows/checkboxRendererFlows.d.ts +9 -0
- package/dist/types/lib/tests/flows/dateRendererFlows.d.ts +120 -0
- package/dist/types/lib/tests/flows/dropdownRendererFlows.d.ts +92 -0
- package/dist/types/lib/tests/flows/largeTextRendererFlows.d.ts +9 -0
- package/dist/types/lib/tests/flows/numberRendererFlows.d.ts +11 -0
- package/dist/types/lib/tests/flows/radioRendererFlows.d.ts +10 -0
- package/dist/types/lib/tests/flows/textRendererFlows.d.ts +16 -0
- package/dist/types/lib/tests/flows/toggleRendererFlows.d.ts +10 -0
- package/dist/types/lib/tests/flows/zipCodeRendererFlows.d.ts +169 -0
- package/dist/types/lib/tests/loan-field-renderer-flows.test.d.ts +1 -0
- package/dist/types/lib/utils/dateHelper.d.ts +8 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1,1143 @@
|
|
|
1
|
+
import { TTriggerActions } from "@elliemae/flow-driven-testing";
|
|
2
|
+
import { fireEvent } from "@testing-library/react";
|
|
3
|
+
import { FlowBase } from "../base/flowBase";
|
|
4
|
+
const triggerZipLookupWithWait = async (selector, value) => {
|
|
5
|
+
const input = document.querySelector(selector);
|
|
6
|
+
if (input) {
|
|
7
|
+
fireEvent.change(input, { target: { value } });
|
|
8
|
+
await new Promise((resolve) => {
|
|
9
|
+
setTimeout(resolve, 300);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
const triggerBlurWithWait = async (selector, value) => {
|
|
14
|
+
const input = document.querySelector(selector);
|
|
15
|
+
if (input) {
|
|
16
|
+
if (value !== void 0) {
|
|
17
|
+
fireEvent.change(input, { target: { value } });
|
|
18
|
+
}
|
|
19
|
+
fireEvent.focusOut(input);
|
|
20
|
+
await new Promise((resolve) => {
|
|
21
|
+
setTimeout(resolve, 200);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
class ZipCodeRendererFlows extends FlowBase {
|
|
26
|
+
constructor(flowParams) {
|
|
27
|
+
super(flowParams);
|
|
28
|
+
this.flowParams = flowParams;
|
|
29
|
+
}
|
|
30
|
+
flowParams;
|
|
31
|
+
/**
|
|
32
|
+
* Test 1: Verify zip code field renders correctly
|
|
33
|
+
*/
|
|
34
|
+
CheckZipCodeRendering() {
|
|
35
|
+
return {
|
|
36
|
+
[`${this.flowParams.inboundFlow}`]: {
|
|
37
|
+
name: this.getFlowName(
|
|
38
|
+
"ZipCodeRenderer",
|
|
39
|
+
"check zip code field renders correctly"
|
|
40
|
+
),
|
|
41
|
+
asserts: [
|
|
42
|
+
{
|
|
43
|
+
selector: '[data-testid="FR0108"]',
|
|
44
|
+
isExists: true
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
transitions: [
|
|
48
|
+
{
|
|
49
|
+
to: "checkZipCodeInputValue"
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Test 2: Enter a valid 5-digit zip code and verify it triggers lookup
|
|
57
|
+
* Using 90210 which returns single result (auto-fill)
|
|
58
|
+
*/
|
|
59
|
+
CheckZipCodeInputValue() {
|
|
60
|
+
return {
|
|
61
|
+
checkZipCodeInputValue: {
|
|
62
|
+
name: this.getFlowName(
|
|
63
|
+
"ZipCodeRenderer",
|
|
64
|
+
"check zip code input triggers lookup"
|
|
65
|
+
),
|
|
66
|
+
waitForTimeout: 5e3,
|
|
67
|
+
startFlow: [
|
|
68
|
+
{
|
|
69
|
+
method: async () => {
|
|
70
|
+
await triggerZipLookupWithWait('[data-testid="FR0108"]', "90210");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
asserts: [
|
|
75
|
+
{
|
|
76
|
+
assertFn: () => {
|
|
77
|
+
const inputElement = document.querySelector(
|
|
78
|
+
'[data-testid="FR0108"]'
|
|
79
|
+
);
|
|
80
|
+
return inputElement && inputElement.value === "90210";
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
transitions: [
|
|
85
|
+
{
|
|
86
|
+
to: "checkZipCodeBlurEvent"
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Test 3: Verify blur event triggers SSF setFields
|
|
94
|
+
*/
|
|
95
|
+
CheckZipCodeBlurEvent() {
|
|
96
|
+
return {
|
|
97
|
+
checkZipCodeBlurEvent: {
|
|
98
|
+
name: this.getFlowName(
|
|
99
|
+
"ZipCodeRenderer",
|
|
100
|
+
"check blur event triggers SSF setFields"
|
|
101
|
+
),
|
|
102
|
+
waitForTimeout: 5e3,
|
|
103
|
+
startFlow: [
|
|
104
|
+
{
|
|
105
|
+
method: async () => {
|
|
106
|
+
await triggerBlurWithWait('[data-testid="FR0108"]', "90210");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
],
|
|
110
|
+
asserts: [
|
|
111
|
+
{
|
|
112
|
+
ssfFunctionsCalled: ["setFields"]
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
assertFn: () => {
|
|
116
|
+
const inputElement = document.querySelector(
|
|
117
|
+
'[data-testid="FR0108"]'
|
|
118
|
+
);
|
|
119
|
+
return inputElement && inputElement.value === "90210";
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
],
|
|
123
|
+
transitions: [
|
|
124
|
+
{
|
|
125
|
+
to: "checkGeoFieldsAutoFill"
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Test 4: Verify geo fields are auto-filled after single result lookup
|
|
133
|
+
* FR0108 has geoFields: city=FR0106, state=FR0107, county=FR0109
|
|
134
|
+
*/
|
|
135
|
+
CheckGeoFieldsAutoFill() {
|
|
136
|
+
return {
|
|
137
|
+
checkGeoFieldsAutoFill: {
|
|
138
|
+
name: this.getFlowName(
|
|
139
|
+
"ZipCodeRenderer",
|
|
140
|
+
"check geo fields auto-fill after lookup"
|
|
141
|
+
),
|
|
142
|
+
asserts: [
|
|
143
|
+
{
|
|
144
|
+
assertFn: () => {
|
|
145
|
+
const cityField = document.querySelector(
|
|
146
|
+
'[data-testid="FR0106"]'
|
|
147
|
+
);
|
|
148
|
+
return cityField !== null;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
assertFn: () => {
|
|
153
|
+
const stateField = document.querySelector(
|
|
154
|
+
'[data-testid="FR0107"]'
|
|
155
|
+
);
|
|
156
|
+
return stateField !== null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
],
|
|
160
|
+
transitions: [
|
|
161
|
+
{
|
|
162
|
+
to: "checkSecondZipCodeExists"
|
|
163
|
+
}
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Test 5: Verify second zip code field exists
|
|
170
|
+
*/
|
|
171
|
+
CheckSecondZipCodeExists() {
|
|
172
|
+
return {
|
|
173
|
+
checkSecondZipCodeExists: {
|
|
174
|
+
name: this.getFlowName(
|
|
175
|
+
"ZipCodeRenderer",
|
|
176
|
+
"check second zip code field exists"
|
|
177
|
+
),
|
|
178
|
+
asserts: [
|
|
179
|
+
{
|
|
180
|
+
selector: '[data-testid="15"]',
|
|
181
|
+
isExists: true
|
|
182
|
+
}
|
|
183
|
+
],
|
|
184
|
+
transitions: [
|
|
185
|
+
{
|
|
186
|
+
to: "checkMultipleResultsDropdown"
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Test 6: Enter zip with multiple results to trigger autocomplete dropdown
|
|
194
|
+
* Using 10001 which returns multiple results
|
|
195
|
+
*/
|
|
196
|
+
CheckMultipleResultsDropdown() {
|
|
197
|
+
return {
|
|
198
|
+
checkMultipleResultsDropdown: {
|
|
199
|
+
name: this.getFlowName(
|
|
200
|
+
"ZipCodeRenderer",
|
|
201
|
+
"check autocomplete dropdown appears for multiple results"
|
|
202
|
+
),
|
|
203
|
+
waitForTimeout: 5e3,
|
|
204
|
+
startFlow: [
|
|
205
|
+
{
|
|
206
|
+
method: async () => {
|
|
207
|
+
await triggerZipLookupWithWait('[data-testid="15"]', "10001");
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
],
|
|
211
|
+
asserts: [
|
|
212
|
+
{
|
|
213
|
+
assertFn: () => {
|
|
214
|
+
const inputElement = document.querySelector(
|
|
215
|
+
'[data-testid="15"]'
|
|
216
|
+
);
|
|
217
|
+
return inputElement && inputElement.value === "10001";
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
],
|
|
221
|
+
transitions: [
|
|
222
|
+
{
|
|
223
|
+
to: "checkAutocompleteOptionSelect"
|
|
224
|
+
}
|
|
225
|
+
]
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Test 7: Verify autocomplete behavior works with blur (fallback path)
|
|
231
|
+
*/
|
|
232
|
+
CheckAutocompleteOptionSelect() {
|
|
233
|
+
return {
|
|
234
|
+
checkAutocompleteOptionSelect: {
|
|
235
|
+
name: this.getFlowName(
|
|
236
|
+
"ZipCodeRenderer",
|
|
237
|
+
"check selecting option from autocomplete"
|
|
238
|
+
),
|
|
239
|
+
waitForTimeout: 5e3,
|
|
240
|
+
startFlow: [
|
|
241
|
+
{
|
|
242
|
+
method: async () => {
|
|
243
|
+
await triggerBlurWithWait('[data-testid="15"]', "10001");
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
],
|
|
247
|
+
asserts: [
|
|
248
|
+
{
|
|
249
|
+
ssfFunctionsCalled: ["setFields"]
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
assertFn: () => {
|
|
253
|
+
const inputElement = document.querySelector(
|
|
254
|
+
'[data-testid="15"]'
|
|
255
|
+
);
|
|
256
|
+
return inputElement && inputElement.value === "10001";
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
],
|
|
260
|
+
transitions: [
|
|
261
|
+
{
|
|
262
|
+
to: "checkZipCodeClearValue"
|
|
263
|
+
}
|
|
264
|
+
]
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Test 8: Verify zip code field can be cleared
|
|
270
|
+
*/
|
|
271
|
+
CheckZipCodeClearValue() {
|
|
272
|
+
return {
|
|
273
|
+
checkZipCodeClearValue: {
|
|
274
|
+
name: this.getFlowName(
|
|
275
|
+
"ZipCodeRenderer",
|
|
276
|
+
"check zip code can be cleared"
|
|
277
|
+
),
|
|
278
|
+
waitForTimeout: 5e3,
|
|
279
|
+
startFlow: [
|
|
280
|
+
{
|
|
281
|
+
method: async () => {
|
|
282
|
+
const input = document.querySelector(
|
|
283
|
+
'[data-testid="15"]'
|
|
284
|
+
);
|
|
285
|
+
if (input) {
|
|
286
|
+
fireEvent.change(input, { target: { value: "" } });
|
|
287
|
+
await new Promise((resolve) => {
|
|
288
|
+
setTimeout(resolve, 100);
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
],
|
|
294
|
+
asserts: [
|
|
295
|
+
{
|
|
296
|
+
assertFn: () => {
|
|
297
|
+
const inputElement = document.querySelector(
|
|
298
|
+
'[data-testid="15"]'
|
|
299
|
+
);
|
|
300
|
+
return inputElement && inputElement.value === "";
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
],
|
|
304
|
+
transitions: [
|
|
305
|
+
{
|
|
306
|
+
to: "checkNonDigitInput"
|
|
307
|
+
}
|
|
308
|
+
]
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Test 9a: Test non-digit input handling (should be rejected)
|
|
314
|
+
* This covers the early return in handleUSZipChange for non-digit values
|
|
315
|
+
*/
|
|
316
|
+
CheckNonDigitInput() {
|
|
317
|
+
return {
|
|
318
|
+
checkNonDigitInput: {
|
|
319
|
+
name: this.getFlowName(
|
|
320
|
+
"ZipCodeRenderer",
|
|
321
|
+
"check non-digit input is rejected"
|
|
322
|
+
),
|
|
323
|
+
waitForTimeout: 5e3,
|
|
324
|
+
startFlow: [
|
|
325
|
+
{
|
|
326
|
+
method: async () => {
|
|
327
|
+
const input = document.querySelector(
|
|
328
|
+
'[data-testid="15"]'
|
|
329
|
+
);
|
|
330
|
+
if (input) {
|
|
331
|
+
fireEvent.change(input, { target: { value: "abc" } });
|
|
332
|
+
await new Promise((resolve) => {
|
|
333
|
+
setTimeout(resolve, 100);
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
],
|
|
339
|
+
asserts: [
|
|
340
|
+
{
|
|
341
|
+
assertFn: () => {
|
|
342
|
+
const inputElement = document.querySelector(
|
|
343
|
+
'[data-testid="15"]'
|
|
344
|
+
);
|
|
345
|
+
return inputElement !== null;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
],
|
|
349
|
+
transitions: [
|
|
350
|
+
{
|
|
351
|
+
to: "checkThirdZipCodeExists"
|
|
352
|
+
}
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Test 9: Verify third zip code field exists (1260)
|
|
359
|
+
*/
|
|
360
|
+
CheckThirdZipCodeExists() {
|
|
361
|
+
return {
|
|
362
|
+
checkThirdZipCodeExists: {
|
|
363
|
+
name: this.getFlowName(
|
|
364
|
+
"ZipCodeRenderer",
|
|
365
|
+
"check third zip code field exists"
|
|
366
|
+
),
|
|
367
|
+
asserts: [
|
|
368
|
+
{
|
|
369
|
+
selector: '[data-testid="1260"]',
|
|
370
|
+
isExists: true
|
|
371
|
+
}
|
|
372
|
+
],
|
|
373
|
+
transitions: [
|
|
374
|
+
{
|
|
375
|
+
to: "checkThirdZipCodeInput"
|
|
376
|
+
}
|
|
377
|
+
]
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Test 10: Enter value in third zip code field with auto-fill
|
|
383
|
+
*/
|
|
384
|
+
CheckThirdZipCodeInput() {
|
|
385
|
+
return {
|
|
386
|
+
checkThirdZipCodeInput: {
|
|
387
|
+
name: this.getFlowName(
|
|
388
|
+
"ZipCodeRenderer",
|
|
389
|
+
"check third zip code input with auto-fill"
|
|
390
|
+
),
|
|
391
|
+
waitForTimeout: 5e3,
|
|
392
|
+
startFlow: [
|
|
393
|
+
{
|
|
394
|
+
method: async () => {
|
|
395
|
+
await triggerZipLookupWithWait('[data-testid="1260"]', "94105");
|
|
396
|
+
await triggerBlurWithWait('[data-testid="1260"]');
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
],
|
|
400
|
+
asserts: [
|
|
401
|
+
{
|
|
402
|
+
ssfFunctionsCalled: ["setFields"]
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
assertFn: () => {
|
|
406
|
+
const inputElement = document.querySelector(
|
|
407
|
+
'[data-testid="1260"]'
|
|
408
|
+
);
|
|
409
|
+
return inputElement && inputElement.value === "94105";
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
],
|
|
413
|
+
transitions: [
|
|
414
|
+
{
|
|
415
|
+
to: "checkPartialZipCode"
|
|
416
|
+
}
|
|
417
|
+
]
|
|
418
|
+
}
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Test 11: Verify partial zip code doesn't trigger lookup
|
|
423
|
+
* Less than 5 digits should not trigger lookup
|
|
424
|
+
*/
|
|
425
|
+
CheckPartialZipCode() {
|
|
426
|
+
return {
|
|
427
|
+
checkPartialZipCode: {
|
|
428
|
+
name: this.getFlowName(
|
|
429
|
+
"ZipCodeRenderer",
|
|
430
|
+
"check partial zip code does not trigger lookup"
|
|
431
|
+
),
|
|
432
|
+
startFlow: [
|
|
433
|
+
{
|
|
434
|
+
selector: '[data-testid="FR0108"]',
|
|
435
|
+
value: "902",
|
|
436
|
+
action: TTriggerActions.CHANGE
|
|
437
|
+
}
|
|
438
|
+
],
|
|
439
|
+
asserts: [
|
|
440
|
+
{
|
|
441
|
+
assertFn: () => {
|
|
442
|
+
const inputElement = document.querySelector(
|
|
443
|
+
'[data-testid="FR0108"]'
|
|
444
|
+
);
|
|
445
|
+
return inputElement && inputElement.value === "902";
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
],
|
|
449
|
+
transitions: [
|
|
450
|
+
{
|
|
451
|
+
to: "checkZipCodeValueChange"
|
|
452
|
+
}
|
|
453
|
+
]
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Test 12: Verify zip code value changes are tracked
|
|
459
|
+
*/
|
|
460
|
+
CheckZipCodeValueChange() {
|
|
461
|
+
return {
|
|
462
|
+
checkZipCodeValueChange: {
|
|
463
|
+
name: this.getFlowName(
|
|
464
|
+
"ZipCodeRenderer",
|
|
465
|
+
"check zip code value changes are tracked"
|
|
466
|
+
),
|
|
467
|
+
waitForTimeout: 5e3,
|
|
468
|
+
startFlow: [
|
|
469
|
+
{
|
|
470
|
+
method: async () => {
|
|
471
|
+
await triggerZipLookupWithWait('[data-testid="FR0108"]', "75001");
|
|
472
|
+
await triggerBlurWithWait('[data-testid="FR0108"]');
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
],
|
|
476
|
+
asserts: [
|
|
477
|
+
{
|
|
478
|
+
ssfFunctionsCalled: ["setFields"]
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
assertFn: () => {
|
|
482
|
+
const inputElement = document.querySelector(
|
|
483
|
+
'[data-testid="FR0108"]'
|
|
484
|
+
);
|
|
485
|
+
return inputElement && inputElement.value === "75001";
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
],
|
|
489
|
+
transitions: [
|
|
490
|
+
{
|
|
491
|
+
to: "checkZipCodeValidation"
|
|
492
|
+
}
|
|
493
|
+
]
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Test 13: Verify validation is executed on blur
|
|
499
|
+
*/
|
|
500
|
+
CheckZipCodeValidation() {
|
|
501
|
+
return {
|
|
502
|
+
checkZipCodeValidation: {
|
|
503
|
+
name: this.getFlowName(
|
|
504
|
+
"ZipCodeRenderer",
|
|
505
|
+
"check validation executes on blur"
|
|
506
|
+
),
|
|
507
|
+
startFlow: [
|
|
508
|
+
{
|
|
509
|
+
selector: '[data-testid="FR0108"]',
|
|
510
|
+
action: TTriggerActions.BLUR
|
|
511
|
+
}
|
|
512
|
+
],
|
|
513
|
+
asserts: [
|
|
514
|
+
{
|
|
515
|
+
assertFn: () => {
|
|
516
|
+
const errorElement = document.querySelector(
|
|
517
|
+
'[id="FR0108_error_message"] span'
|
|
518
|
+
);
|
|
519
|
+
return !errorElement;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
],
|
|
523
|
+
transitions: [
|
|
524
|
+
{
|
|
525
|
+
to: "checkZipCodeWithDifferentGeoFields"
|
|
526
|
+
}
|
|
527
|
+
]
|
|
528
|
+
}
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Test 14: Test zip code with different geo field configuration
|
|
533
|
+
* Field 1419 has country field in geoFields and isForeignAddress=true
|
|
534
|
+
*/
|
|
535
|
+
CheckZipCodeWithDifferentGeoFields() {
|
|
536
|
+
return {
|
|
537
|
+
checkZipCodeWithDifferentGeoFields: {
|
|
538
|
+
name: this.getFlowName(
|
|
539
|
+
"ZipCodeRenderer",
|
|
540
|
+
"check zip code with country geo field"
|
|
541
|
+
),
|
|
542
|
+
asserts: [
|
|
543
|
+
{
|
|
544
|
+
selector: '[data-testid="1419"]',
|
|
545
|
+
isExists: true
|
|
546
|
+
}
|
|
547
|
+
],
|
|
548
|
+
transitions: [
|
|
549
|
+
{
|
|
550
|
+
to: "checkFourthZipCodeInput"
|
|
551
|
+
}
|
|
552
|
+
]
|
|
553
|
+
}
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Test 15: Enter value in fourth zip code field (foreign address)
|
|
558
|
+
*/
|
|
559
|
+
CheckFourthZipCodeInput() {
|
|
560
|
+
return {
|
|
561
|
+
checkFourthZipCodeInput: {
|
|
562
|
+
name: this.getFlowName(
|
|
563
|
+
"ZipCodeRenderer",
|
|
564
|
+
"check fourth zip code field input"
|
|
565
|
+
),
|
|
566
|
+
startFlow: [
|
|
567
|
+
{
|
|
568
|
+
selector: '[data-testid="1419"]',
|
|
569
|
+
value: "SW1A 1AA",
|
|
570
|
+
action: TTriggerActions.BLUR
|
|
571
|
+
}
|
|
572
|
+
],
|
|
573
|
+
asserts: [
|
|
574
|
+
{
|
|
575
|
+
ssfFunctionsCalled: ["setFields"]
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
assertFn: () => {
|
|
579
|
+
const inputElement = document.querySelector(
|
|
580
|
+
'[data-testid="1419"]'
|
|
581
|
+
);
|
|
582
|
+
return inputElement && inputElement.value === "SW1A 1AA";
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
],
|
|
586
|
+
transitions: [
|
|
587
|
+
{
|
|
588
|
+
to: "checkZipCodeSequentialChanges"
|
|
589
|
+
}
|
|
590
|
+
]
|
|
591
|
+
}
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* Test 16: Test zip code with sequential value changes to cover onChange path
|
|
596
|
+
*/
|
|
597
|
+
CheckZipCodeSequentialChanges() {
|
|
598
|
+
return {
|
|
599
|
+
checkZipCodeSequentialChanges: {
|
|
600
|
+
name: this.getFlowName(
|
|
601
|
+
"ZipCodeRenderer",
|
|
602
|
+
"check sequential value changes"
|
|
603
|
+
),
|
|
604
|
+
startFlow: [
|
|
605
|
+
{
|
|
606
|
+
selector: '[data-testid="FR0108"]',
|
|
607
|
+
value: "9",
|
|
608
|
+
action: TTriggerActions.CHANGE
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
selector: '[data-testid="FR0108"]',
|
|
612
|
+
value: "90",
|
|
613
|
+
action: TTriggerActions.CHANGE
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
selector: '[data-testid="FR0108"]',
|
|
617
|
+
value: "902",
|
|
618
|
+
action: TTriggerActions.CHANGE
|
|
619
|
+
},
|
|
620
|
+
{
|
|
621
|
+
selector: '[data-testid="FR0108"]',
|
|
622
|
+
value: "9021",
|
|
623
|
+
action: TTriggerActions.CHANGE
|
|
624
|
+
},
|
|
625
|
+
{
|
|
626
|
+
selector: '[data-testid="FR0108"]',
|
|
627
|
+
value: "90210",
|
|
628
|
+
action: TTriggerActions.CHANGE
|
|
629
|
+
}
|
|
630
|
+
],
|
|
631
|
+
asserts: [
|
|
632
|
+
{
|
|
633
|
+
assertFn: () => {
|
|
634
|
+
const inputElement = document.querySelector(
|
|
635
|
+
'[data-testid="FR0108"]'
|
|
636
|
+
);
|
|
637
|
+
return inputElement && inputElement.value === "90210";
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
],
|
|
641
|
+
transitions: [
|
|
642
|
+
{
|
|
643
|
+
to: "checkZipCodeInputFocus"
|
|
644
|
+
}
|
|
645
|
+
]
|
|
646
|
+
}
|
|
647
|
+
};
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Test 17: Test input focus and blur cycle
|
|
651
|
+
*/
|
|
652
|
+
CheckZipCodeInputFocus() {
|
|
653
|
+
return {
|
|
654
|
+
checkZipCodeInputFocus: {
|
|
655
|
+
name: this.getFlowName(
|
|
656
|
+
"ZipCodeRenderer",
|
|
657
|
+
"check input focus and blur cycle"
|
|
658
|
+
),
|
|
659
|
+
startFlow: [
|
|
660
|
+
{
|
|
661
|
+
selector: '[data-testid="1260"]',
|
|
662
|
+
action: TTriggerActions.CLICK
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
selector: '[data-testid="1260"]',
|
|
666
|
+
value: "75001",
|
|
667
|
+
action: TTriggerActions.CHANGE
|
|
668
|
+
},
|
|
669
|
+
{
|
|
670
|
+
selector: '[data-testid="1260"]',
|
|
671
|
+
action: TTriggerActions.BLUR
|
|
672
|
+
}
|
|
673
|
+
],
|
|
674
|
+
asserts: [
|
|
675
|
+
{
|
|
676
|
+
ssfFunctionsCalled: ["setFields"]
|
|
677
|
+
},
|
|
678
|
+
{
|
|
679
|
+
assertFn: () => {
|
|
680
|
+
const inputElement = document.querySelector(
|
|
681
|
+
'[data-testid="1260"]'
|
|
682
|
+
);
|
|
683
|
+
return inputElement && inputElement.value === "75001";
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
],
|
|
687
|
+
transitions: [
|
|
688
|
+
{
|
|
689
|
+
to: "checkZipCodeWithEmptyBlur"
|
|
690
|
+
}
|
|
691
|
+
]
|
|
692
|
+
}
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Test 18: Test empty value on blur (covers clearOptions path)
|
|
697
|
+
*/
|
|
698
|
+
CheckZipCodeWithEmptyBlur() {
|
|
699
|
+
return {
|
|
700
|
+
checkZipCodeWithEmptyBlur: {
|
|
701
|
+
name: this.getFlowName(
|
|
702
|
+
"ZipCodeRenderer",
|
|
703
|
+
"check empty value on blur clears properly"
|
|
704
|
+
),
|
|
705
|
+
startFlow: [
|
|
706
|
+
{
|
|
707
|
+
selector: '[data-testid="1260"]',
|
|
708
|
+
value: "",
|
|
709
|
+
action: TTriggerActions.CHANGE
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
selector: '[data-testid="1260"]',
|
|
713
|
+
action: TTriggerActions.BLUR
|
|
714
|
+
}
|
|
715
|
+
],
|
|
716
|
+
asserts: [
|
|
717
|
+
{
|
|
718
|
+
assertFn: () => {
|
|
719
|
+
const inputElement = document.querySelector(
|
|
720
|
+
'[data-testid="1260"]'
|
|
721
|
+
);
|
|
722
|
+
return inputElement && inputElement.value === "";
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
],
|
|
726
|
+
transitions: [
|
|
727
|
+
{
|
|
728
|
+
to: "checkZipCodeNoResultsLookup"
|
|
729
|
+
}
|
|
730
|
+
]
|
|
731
|
+
}
|
|
732
|
+
};
|
|
733
|
+
}
|
|
734
|
+
/**
|
|
735
|
+
* Test 19: Test zip code that returns no results
|
|
736
|
+
* Using 00000 which should return empty results
|
|
737
|
+
*/
|
|
738
|
+
CheckZipCodeNoResultsLookup() {
|
|
739
|
+
return {
|
|
740
|
+
checkZipCodeNoResultsLookup: {
|
|
741
|
+
name: this.getFlowName(
|
|
742
|
+
"ZipCodeRenderer",
|
|
743
|
+
"check no results lookup handling"
|
|
744
|
+
),
|
|
745
|
+
waitForTimeout: 5e3,
|
|
746
|
+
startFlow: [
|
|
747
|
+
{
|
|
748
|
+
method: async () => {
|
|
749
|
+
await triggerZipLookupWithWait('[data-testid="15"]', "00000");
|
|
750
|
+
await triggerBlurWithWait('[data-testid="15"]');
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
],
|
|
754
|
+
asserts: [
|
|
755
|
+
{
|
|
756
|
+
ssfFunctionsCalled: ["setFields"]
|
|
757
|
+
},
|
|
758
|
+
{
|
|
759
|
+
assertFn: () => {
|
|
760
|
+
const inputElement = document.querySelector(
|
|
761
|
+
'[data-testid="15"]'
|
|
762
|
+
);
|
|
763
|
+
return inputElement && inputElement.value === "00000";
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
],
|
|
767
|
+
transitions: [
|
|
768
|
+
{
|
|
769
|
+
to: "checkZipCodeReEntryValue"
|
|
770
|
+
}
|
|
771
|
+
]
|
|
772
|
+
}
|
|
773
|
+
};
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Test 20: Test re-entering zip code value after clear
|
|
777
|
+
*/
|
|
778
|
+
CheckZipCodeReEntryValue() {
|
|
779
|
+
return {
|
|
780
|
+
checkZipCodeReEntryValue: {
|
|
781
|
+
name: this.getFlowName(
|
|
782
|
+
"ZipCodeRenderer",
|
|
783
|
+
"check re-entry value after clear"
|
|
784
|
+
),
|
|
785
|
+
waitForTimeout: 5e3,
|
|
786
|
+
startFlow: [
|
|
787
|
+
{
|
|
788
|
+
method: async () => {
|
|
789
|
+
await triggerZipLookupWithWait('[data-testid="15"]', "94105");
|
|
790
|
+
await triggerBlurWithWait('[data-testid="15"]');
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
],
|
|
794
|
+
asserts: [
|
|
795
|
+
{
|
|
796
|
+
ssfFunctionsCalled: ["setFields"]
|
|
797
|
+
},
|
|
798
|
+
{
|
|
799
|
+
assertFn: () => {
|
|
800
|
+
const inputElement = document.querySelector(
|
|
801
|
+
'[data-testid="15"]'
|
|
802
|
+
);
|
|
803
|
+
return inputElement && inputElement.value === "94105";
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
],
|
|
807
|
+
transitions: [
|
|
808
|
+
{
|
|
809
|
+
to: "checkZipCodeBlurWithValue"
|
|
810
|
+
}
|
|
811
|
+
]
|
|
812
|
+
}
|
|
813
|
+
};
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
816
|
+
* Test 21: Test blur event with existing value (validation path)
|
|
817
|
+
*/
|
|
818
|
+
CheckZipCodeBlurWithValue() {
|
|
819
|
+
return {
|
|
820
|
+
checkZipCodeBlurWithValue: {
|
|
821
|
+
name: this.getFlowName(
|
|
822
|
+
"ZipCodeRenderer",
|
|
823
|
+
"check blur with existing value triggers validation"
|
|
824
|
+
),
|
|
825
|
+
startFlow: [
|
|
826
|
+
{
|
|
827
|
+
selector: '[data-testid="FR0108"]',
|
|
828
|
+
action: TTriggerActions.BLUR
|
|
829
|
+
}
|
|
830
|
+
],
|
|
831
|
+
asserts: [
|
|
832
|
+
{
|
|
833
|
+
ssfFunctionsCalled: ["setFields"]
|
|
834
|
+
}
|
|
835
|
+
],
|
|
836
|
+
transitions: [
|
|
837
|
+
{
|
|
838
|
+
to: "checkForeignAddressFieldRendering"
|
|
839
|
+
}
|
|
840
|
+
]
|
|
841
|
+
}
|
|
842
|
+
};
|
|
843
|
+
}
|
|
844
|
+
/**
|
|
845
|
+
* Test 22: Verify foreign address field renders correctly
|
|
846
|
+
* Field 1419 has isForeignAddress=true
|
|
847
|
+
*/
|
|
848
|
+
CheckForeignAddressFieldRendering() {
|
|
849
|
+
return {
|
|
850
|
+
checkForeignAddressFieldRendering: {
|
|
851
|
+
name: this.getFlowName(
|
|
852
|
+
"ZipCodeRenderer",
|
|
853
|
+
"check foreign address field renders correctly"
|
|
854
|
+
),
|
|
855
|
+
asserts: [
|
|
856
|
+
{
|
|
857
|
+
selector: '[data-testid="1419"]',
|
|
858
|
+
isExists: true
|
|
859
|
+
},
|
|
860
|
+
{
|
|
861
|
+
assertFn: () => {
|
|
862
|
+
const inputElement = document.querySelector(
|
|
863
|
+
'[data-testid="1419"]'
|
|
864
|
+
);
|
|
865
|
+
return inputElement !== null;
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
],
|
|
869
|
+
transitions: [
|
|
870
|
+
{
|
|
871
|
+
to: "checkForeignAddressInput"
|
|
872
|
+
}
|
|
873
|
+
]
|
|
874
|
+
}
|
|
875
|
+
};
|
|
876
|
+
}
|
|
877
|
+
/**
|
|
878
|
+
* Test 23: Test foreign address input (covers handleForeignAddressChange)
|
|
879
|
+
*/
|
|
880
|
+
CheckForeignAddressInput() {
|
|
881
|
+
return {
|
|
882
|
+
checkForeignAddressInput: {
|
|
883
|
+
name: this.getFlowName(
|
|
884
|
+
"ZipCodeRenderer",
|
|
885
|
+
"check foreign address input handling"
|
|
886
|
+
),
|
|
887
|
+
startFlow: [
|
|
888
|
+
{
|
|
889
|
+
selector: '[data-testid="1419"]',
|
|
890
|
+
value: "EC1A 1BB",
|
|
891
|
+
action: TTriggerActions.CHANGE
|
|
892
|
+
}
|
|
893
|
+
],
|
|
894
|
+
asserts: [
|
|
895
|
+
{
|
|
896
|
+
assertFn: () => {
|
|
897
|
+
const inputElement = document.querySelector(
|
|
898
|
+
'[data-testid="1419"]'
|
|
899
|
+
);
|
|
900
|
+
return inputElement && inputElement.value === "EC1A 1BB";
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
],
|
|
904
|
+
transitions: [
|
|
905
|
+
{
|
|
906
|
+
to: "checkForeignAddressBlur"
|
|
907
|
+
}
|
|
908
|
+
]
|
|
909
|
+
}
|
|
910
|
+
};
|
|
911
|
+
}
|
|
912
|
+
/**
|
|
913
|
+
* Test 24: Test foreign address blur event
|
|
914
|
+
*/
|
|
915
|
+
CheckForeignAddressBlur() {
|
|
916
|
+
return {
|
|
917
|
+
checkForeignAddressBlur: {
|
|
918
|
+
name: this.getFlowName(
|
|
919
|
+
"ZipCodeRenderer",
|
|
920
|
+
"check foreign address blur triggers SSF"
|
|
921
|
+
),
|
|
922
|
+
startFlow: [
|
|
923
|
+
{
|
|
924
|
+
selector: '[data-testid="1419"]',
|
|
925
|
+
action: TTriggerActions.BLUR
|
|
926
|
+
}
|
|
927
|
+
],
|
|
928
|
+
asserts: [
|
|
929
|
+
{
|
|
930
|
+
ssfFunctionsCalled: ["setFields"]
|
|
931
|
+
},
|
|
932
|
+
{
|
|
933
|
+
assertFn: () => {
|
|
934
|
+
const inputElement = document.querySelector(
|
|
935
|
+
'[data-testid="1419"]'
|
|
936
|
+
);
|
|
937
|
+
return inputElement && inputElement.value === "EC1A 1BB";
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
],
|
|
941
|
+
transitions: [
|
|
942
|
+
{
|
|
943
|
+
to: "checkForeignAddressValueChange"
|
|
944
|
+
}
|
|
945
|
+
]
|
|
946
|
+
}
|
|
947
|
+
};
|
|
948
|
+
}
|
|
949
|
+
/**
|
|
950
|
+
* Test 25: Test foreign address value change
|
|
951
|
+
*/
|
|
952
|
+
CheckForeignAddressValueChange() {
|
|
953
|
+
return {
|
|
954
|
+
checkForeignAddressValueChange: {
|
|
955
|
+
name: this.getFlowName(
|
|
956
|
+
"ZipCodeRenderer",
|
|
957
|
+
"check foreign address value change"
|
|
958
|
+
),
|
|
959
|
+
startFlow: [
|
|
960
|
+
{
|
|
961
|
+
selector: '[data-testid="1419"]',
|
|
962
|
+
value: "W1A 0AX",
|
|
963
|
+
action: TTriggerActions.CHANGE
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
selector: '[data-testid="1419"]',
|
|
967
|
+
action: TTriggerActions.BLUR
|
|
968
|
+
}
|
|
969
|
+
],
|
|
970
|
+
asserts: [
|
|
971
|
+
{
|
|
972
|
+
ssfFunctionsCalled: ["setFields"]
|
|
973
|
+
},
|
|
974
|
+
{
|
|
975
|
+
assertFn: () => {
|
|
976
|
+
const inputElement = document.querySelector(
|
|
977
|
+
'[data-testid="1419"]'
|
|
978
|
+
);
|
|
979
|
+
return inputElement && inputElement.value === "W1A 0AX";
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
],
|
|
983
|
+
transitions: [
|
|
984
|
+
{
|
|
985
|
+
to: "checkForeignAddressFinalState"
|
|
986
|
+
}
|
|
987
|
+
]
|
|
988
|
+
}
|
|
989
|
+
};
|
|
990
|
+
}
|
|
991
|
+
/**
|
|
992
|
+
* Test 26: Verify foreign address final state
|
|
993
|
+
*/
|
|
994
|
+
CheckForeignAddressFinalState() {
|
|
995
|
+
return {
|
|
996
|
+
checkForeignAddressFinalState: {
|
|
997
|
+
name: this.getFlowName(
|
|
998
|
+
"ZipCodeRenderer",
|
|
999
|
+
"check foreign address final state"
|
|
1000
|
+
),
|
|
1001
|
+
asserts: [
|
|
1002
|
+
{
|
|
1003
|
+
assertFn: () => {
|
|
1004
|
+
const inputElement = document.querySelector(
|
|
1005
|
+
'[data-testid="1419"]'
|
|
1006
|
+
);
|
|
1007
|
+
return inputElement && inputElement.value.length > 0;
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
],
|
|
1011
|
+
transitions: [
|
|
1012
|
+
{
|
|
1013
|
+
to: "checkAutocompleteMenuSelection"
|
|
1014
|
+
}
|
|
1015
|
+
]
|
|
1016
|
+
}
|
|
1017
|
+
};
|
|
1018
|
+
}
|
|
1019
|
+
/**
|
|
1020
|
+
* Test 27: Trigger lookup to show autocomplete menu and select an option
|
|
1021
|
+
* This covers handleOptionSelect path and autocomplete interactions
|
|
1022
|
+
*/
|
|
1023
|
+
CheckAutocompleteMenuSelection() {
|
|
1024
|
+
return {
|
|
1025
|
+
checkAutocompleteMenuSelection: {
|
|
1026
|
+
name: this.getFlowName(
|
|
1027
|
+
"ZipCodeRenderer",
|
|
1028
|
+
"check autocomplete menu selection triggers geo fill"
|
|
1029
|
+
),
|
|
1030
|
+
waitForTimeout: 5e3,
|
|
1031
|
+
startFlow: [
|
|
1032
|
+
{
|
|
1033
|
+
method: async () => {
|
|
1034
|
+
const input = document.querySelector(
|
|
1035
|
+
'[data-testid="FR0108"]'
|
|
1036
|
+
);
|
|
1037
|
+
if (input) {
|
|
1038
|
+
fireEvent.focus(input);
|
|
1039
|
+
fireEvent.change(input, { target: { value: "10001" } });
|
|
1040
|
+
await new Promise((resolve) => {
|
|
1041
|
+
setTimeout(resolve, 400);
|
|
1042
|
+
});
|
|
1043
|
+
const menuOptions = document.querySelectorAll(
|
|
1044
|
+
'[role="listbox"] [role="option"], [data-testid*="autocomplete"] li, .ds-autocomplete-menu li, ul[role="listbox"] li'
|
|
1045
|
+
);
|
|
1046
|
+
if (menuOptions.length > 0) {
|
|
1047
|
+
fireEvent.click(menuOptions[0]);
|
|
1048
|
+
await new Promise((resolve) => {
|
|
1049
|
+
setTimeout(resolve, 200);
|
|
1050
|
+
});
|
|
1051
|
+
}
|
|
1052
|
+
fireEvent.blur(input);
|
|
1053
|
+
await new Promise((resolve) => {
|
|
1054
|
+
setTimeout(resolve, 200);
|
|
1055
|
+
});
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
],
|
|
1060
|
+
asserts: [
|
|
1061
|
+
{
|
|
1062
|
+
ssfFunctionsCalled: ["setFields"]
|
|
1063
|
+
},
|
|
1064
|
+
{
|
|
1065
|
+
assertFn: () => {
|
|
1066
|
+
const inputElement = document.querySelector(
|
|
1067
|
+
'[data-testid="FR0108"]'
|
|
1068
|
+
);
|
|
1069
|
+
return inputElement && inputElement.value.length > 0;
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
],
|
|
1073
|
+
transitions: [
|
|
1074
|
+
{
|
|
1075
|
+
to: "checkZipCodeFinalState"
|
|
1076
|
+
}
|
|
1077
|
+
]
|
|
1078
|
+
}
|
|
1079
|
+
};
|
|
1080
|
+
}
|
|
1081
|
+
/**
|
|
1082
|
+
* Test 28: Final state verification - all zip code fields present and valid
|
|
1083
|
+
*/
|
|
1084
|
+
CheckZipCodeFinalState() {
|
|
1085
|
+
const transitions = this.flowParams.outboundFlow ? [{ to: this.flowParams.outboundFlow }] : [];
|
|
1086
|
+
return {
|
|
1087
|
+
checkZipCodeFinalState: {
|
|
1088
|
+
name: this.getFlowName(
|
|
1089
|
+
"ZipCodeRenderer",
|
|
1090
|
+
"check all zip code fields final state is valid"
|
|
1091
|
+
),
|
|
1092
|
+
asserts: [
|
|
1093
|
+
{
|
|
1094
|
+
assertFn: () => {
|
|
1095
|
+
const zip1 = document.querySelector('[data-testid="FR0108"]');
|
|
1096
|
+
const zip2 = document.querySelector('[data-testid="15"]');
|
|
1097
|
+
const zip3 = document.querySelector('[data-testid="1260"]');
|
|
1098
|
+
const zip4 = document.querySelector('[data-testid="1419"]');
|
|
1099
|
+
return zip1 !== null && zip2 !== null && zip3 !== null && zip4 !== null;
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
],
|
|
1103
|
+
...transitions.length > 0 && { transitions }
|
|
1104
|
+
}
|
|
1105
|
+
};
|
|
1106
|
+
}
|
|
1107
|
+
get Flows() {
|
|
1108
|
+
return {
|
|
1109
|
+
...this.CheckZipCodeRendering(),
|
|
1110
|
+
...this.CheckZipCodeInputValue(),
|
|
1111
|
+
...this.CheckZipCodeBlurEvent(),
|
|
1112
|
+
...this.CheckGeoFieldsAutoFill(),
|
|
1113
|
+
...this.CheckSecondZipCodeExists(),
|
|
1114
|
+
...this.CheckMultipleResultsDropdown(),
|
|
1115
|
+
...this.CheckAutocompleteOptionSelect(),
|
|
1116
|
+
...this.CheckZipCodeClearValue(),
|
|
1117
|
+
...this.CheckNonDigitInput(),
|
|
1118
|
+
...this.CheckThirdZipCodeExists(),
|
|
1119
|
+
...this.CheckThirdZipCodeInput(),
|
|
1120
|
+
...this.CheckPartialZipCode(),
|
|
1121
|
+
...this.CheckZipCodeValueChange(),
|
|
1122
|
+
...this.CheckZipCodeValidation(),
|
|
1123
|
+
...this.CheckZipCodeWithDifferentGeoFields(),
|
|
1124
|
+
...this.CheckFourthZipCodeInput(),
|
|
1125
|
+
...this.CheckZipCodeSequentialChanges(),
|
|
1126
|
+
...this.CheckZipCodeInputFocus(),
|
|
1127
|
+
...this.CheckZipCodeWithEmptyBlur(),
|
|
1128
|
+
...this.CheckZipCodeNoResultsLookup(),
|
|
1129
|
+
...this.CheckZipCodeReEntryValue(),
|
|
1130
|
+
...this.CheckZipCodeBlurWithValue(),
|
|
1131
|
+
...this.CheckForeignAddressFieldRendering(),
|
|
1132
|
+
...this.CheckForeignAddressInput(),
|
|
1133
|
+
...this.CheckForeignAddressBlur(),
|
|
1134
|
+
...this.CheckForeignAddressValueChange(),
|
|
1135
|
+
...this.CheckForeignAddressFinalState(),
|
|
1136
|
+
...this.CheckAutocompleteMenuSelection(),
|
|
1137
|
+
...this.CheckZipCodeFinalState()
|
|
1138
|
+
};
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
export {
|
|
1142
|
+
ZipCodeRendererFlows
|
|
1143
|
+
};
|