@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.
Files changed (225) hide show
  1. package/dist/cjs/ARCHITECTURE.md +434 -0
  2. package/dist/cjs/OVERVIEW.md +229 -0
  3. package/dist/cjs/bll/constants.js +86 -0
  4. package/dist/cjs/bll/formatters/booleanFormatter.js +51 -0
  5. package/dist/cjs/bll/formatters/dateFormatter.js +78 -0
  6. package/dist/cjs/bll/formatters/dropdownFormatter.js +34 -0
  7. package/dist/cjs/bll/formatters/factory/index.js +115 -0
  8. package/dist/cjs/bll/formatters/index.js +24 -0
  9. package/dist/cjs/bll/formatters/numberFormatter.js +70 -0
  10. package/dist/cjs/bll/formatters/phoneFormatter.js +57 -0
  11. package/dist/cjs/bll/formatters/regexFormatter.js +52 -0
  12. package/dist/cjs/bll/formatters/ssnFormatter.js +50 -0
  13. package/dist/cjs/bll/formatters/textFormatter.js +43 -0
  14. package/dist/cjs/bll/formatters/zipFormatter.js +48 -0
  15. package/dist/cjs/bll/index.js +62 -0
  16. package/dist/cjs/bll/ssf/index.js +48 -0
  17. package/dist/cjs/bll/ssf/loan.js +81 -0
  18. package/dist/cjs/bll/ssf/loconnect.js +70 -0
  19. package/dist/cjs/bll/ssf/ssfBase.js +97 -0
  20. package/dist/cjs/bll/ssf/types.js +16 -0
  21. package/dist/cjs/bll/types.js +16 -0
  22. package/dist/cjs/bll/validators/dateValidator.js +60 -0
  23. package/dist/cjs/bll/validators/emailValidator.js +47 -0
  24. package/dist/cjs/bll/validators/factory/index.js +81 -0
  25. package/dist/cjs/bll/validators/index.js +24 -0
  26. package/dist/cjs/bll/validators/maxCharValidator.js +49 -0
  27. package/dist/cjs/bll/validators/requiredValidator.js +44 -0
  28. package/dist/cjs/bll/validators/zipValidator.js +53 -0
  29. package/dist/cjs/core/index.js +52 -0
  30. package/dist/cjs/demo/config.js +391 -0
  31. package/dist/cjs/demo/index.js +31 -0
  32. package/dist/cjs/package.json +7 -0
  33. package/dist/cjs/renderer/FieldRenderer.js +45 -0
  34. package/dist/cjs/renderer/base/hooks/fieldDescription.js +39 -0
  35. package/dist/cjs/renderer/base/hooks/fieldDisabled.js +53 -0
  36. package/dist/cjs/renderer/base/hooks/fieldGoTo.js +50 -0
  37. package/dist/cjs/renderer/base/hooks/fieldLocked.js +42 -0
  38. package/dist/cjs/renderer/base/hooks/fieldMeta.js +150 -0
  39. package/dist/cjs/renderer/base/hooks/fieldSubscribers.js +66 -0
  40. package/dist/cjs/renderer/base/hooks/fieldValidation.js +45 -0
  41. package/dist/cjs/renderer/base/hooks/fieldValue.js +215 -0
  42. package/dist/cjs/renderer/base/hooks/hookBase.js +29 -0
  43. package/dist/cjs/renderer/base/hooks/index.js +139 -0
  44. package/dist/cjs/renderer/base/renderer.js +198 -0
  45. package/dist/cjs/renderer/base/rendererValidator.js +97 -0
  46. package/dist/cjs/renderer/factory/index.js +58 -0
  47. package/dist/cjs/renderer/field-renderers/AddonRenderer.js +75 -0
  48. package/dist/cjs/renderer/field-renderers/CheckboxRenderer.js +123 -0
  49. package/dist/cjs/renderer/field-renderers/DateRenderer.js +206 -0
  50. package/dist/cjs/renderer/field-renderers/DropdownRenderer/hook.js +99 -0
  51. package/dist/cjs/renderer/field-renderers/DropdownRenderer/index.js +216 -0
  52. package/dist/cjs/renderer/field-renderers/LargeTextRenderer.js +209 -0
  53. package/dist/cjs/renderer/field-renderers/NumberRenderer.js +216 -0
  54. package/dist/cjs/renderer/field-renderers/RadioGroupRenderer.js +128 -0
  55. package/dist/cjs/renderer/field-renderers/RadioRenderer.js +121 -0
  56. package/dist/cjs/renderer/field-renderers/TextRenderer.js +223 -0
  57. package/dist/cjs/renderer/field-renderers/ToggleRenderer.js +121 -0
  58. package/dist/cjs/renderer/field-renderers/ZipCodeRenderer/helper.js +132 -0
  59. package/dist/cjs/renderer/field-renderers/ZipCodeRenderer/hook.js +128 -0
  60. package/dist/cjs/renderer/field-renderers/ZipCodeRenderer/index.js +273 -0
  61. package/dist/cjs/renderer/index.js +24 -0
  62. package/dist/cjs/renderer/styles.js +51 -0
  63. package/dist/cjs/renderer/types.js +16 -0
  64. package/dist/cjs/tests/base/flowBase.js +125 -0
  65. package/dist/cjs/tests/base/index.js +52 -0
  66. package/dist/cjs/tests/flows/checkboxRendererFlows.js +85 -0
  67. package/dist/cjs/tests/flows/dateRendererFlows.js +870 -0
  68. package/dist/cjs/tests/flows/dropdownRendererFlows.js +591 -0
  69. package/dist/cjs/tests/flows/largeTextRendererFlows.js +99 -0
  70. package/dist/cjs/tests/flows/numberRendererFlows.js +175 -0
  71. package/dist/cjs/tests/flows/radioRendererFlows.js +115 -0
  72. package/dist/cjs/tests/flows/textRendererFlows.js +349 -0
  73. package/dist/cjs/tests/flows/toggleRendererFlows.js +106 -0
  74. package/dist/cjs/tests/flows/zipCodeRendererFlows.js +1163 -0
  75. package/dist/cjs/utils/dateHelper.js +65 -0
  76. package/dist/esm/ARCHITECTURE.md +434 -0
  77. package/dist/esm/OVERVIEW.md +229 -0
  78. package/dist/esm/bll/constants.js +66 -0
  79. package/dist/esm/bll/formatters/booleanFormatter.js +33 -0
  80. package/dist/esm/bll/formatters/dateFormatter.js +48 -0
  81. package/dist/esm/bll/formatters/dropdownFormatter.js +14 -0
  82. package/dist/esm/bll/formatters/factory/index.js +97 -0
  83. package/dist/esm/bll/formatters/index.js +4 -0
  84. package/dist/esm/bll/formatters/numberFormatter.js +54 -0
  85. package/dist/esm/bll/formatters/phoneFormatter.js +41 -0
  86. package/dist/esm/bll/formatters/regexFormatter.js +34 -0
  87. package/dist/esm/bll/formatters/ssnFormatter.js +32 -0
  88. package/dist/esm/bll/formatters/textFormatter.js +25 -0
  89. package/dist/esm/bll/formatters/zipFormatter.js +30 -0
  90. package/dist/esm/bll/index.js +44 -0
  91. package/dist/esm/bll/ssf/index.js +30 -0
  92. package/dist/esm/bll/ssf/loan.js +63 -0
  93. package/dist/esm/bll/ssf/loconnect.js +52 -0
  94. package/dist/esm/bll/ssf/ssfBase.js +67 -0
  95. package/dist/esm/bll/ssf/types.js +0 -0
  96. package/dist/esm/bll/types.js +0 -0
  97. package/dist/esm/bll/validators/dateValidator.js +30 -0
  98. package/dist/esm/bll/validators/emailValidator.js +29 -0
  99. package/dist/esm/bll/validators/factory/index.js +63 -0
  100. package/dist/esm/bll/validators/index.js +4 -0
  101. package/dist/esm/bll/validators/maxCharValidator.js +31 -0
  102. package/dist/esm/bll/validators/requiredValidator.js +26 -0
  103. package/dist/esm/bll/validators/zipValidator.js +35 -0
  104. package/dist/esm/core/index.js +34 -0
  105. package/dist/esm/demo/config.js +371 -0
  106. package/dist/esm/demo/index.js +11 -0
  107. package/dist/esm/package.json +7 -0
  108. package/dist/esm/renderer/FieldRenderer.js +15 -0
  109. package/dist/esm/renderer/base/hooks/fieldDescription.js +19 -0
  110. package/dist/esm/renderer/base/hooks/fieldDisabled.js +33 -0
  111. package/dist/esm/renderer/base/hooks/fieldGoTo.js +30 -0
  112. package/dist/esm/renderer/base/hooks/fieldLocked.js +22 -0
  113. package/dist/esm/renderer/base/hooks/fieldMeta.js +132 -0
  114. package/dist/esm/renderer/base/hooks/fieldSubscribers.js +36 -0
  115. package/dist/esm/renderer/base/hooks/fieldValidation.js +25 -0
  116. package/dist/esm/renderer/base/hooks/fieldValue.js +195 -0
  117. package/dist/esm/renderer/base/hooks/hookBase.js +9 -0
  118. package/dist/esm/renderer/base/hooks/index.js +121 -0
  119. package/dist/esm/renderer/base/renderer.js +178 -0
  120. package/dist/esm/renderer/base/rendererValidator.js +77 -0
  121. package/dist/esm/renderer/factory/index.js +38 -0
  122. package/dist/esm/renderer/field-renderers/AddonRenderer.js +55 -0
  123. package/dist/esm/renderer/field-renderers/CheckboxRenderer.js +93 -0
  124. package/dist/esm/renderer/field-renderers/DateRenderer.js +176 -0
  125. package/dist/esm/renderer/field-renderers/DropdownRenderer/hook.js +79 -0
  126. package/dist/esm/renderer/field-renderers/DropdownRenderer/index.js +186 -0
  127. package/dist/esm/renderer/field-renderers/LargeTextRenderer.js +179 -0
  128. package/dist/esm/renderer/field-renderers/NumberRenderer.js +188 -0
  129. package/dist/esm/renderer/field-renderers/RadioGroupRenderer.js +108 -0
  130. package/dist/esm/renderer/field-renderers/RadioRenderer.js +91 -0
  131. package/dist/esm/renderer/field-renderers/TextRenderer.js +197 -0
  132. package/dist/esm/renderer/field-renderers/ToggleRenderer.js +91 -0
  133. package/dist/esm/renderer/field-renderers/ZipCodeRenderer/helper.js +112 -0
  134. package/dist/esm/renderer/field-renderers/ZipCodeRenderer/hook.js +108 -0
  135. package/dist/esm/renderer/field-renderers/ZipCodeRenderer/index.js +247 -0
  136. package/dist/esm/renderer/index.js +4 -0
  137. package/dist/esm/renderer/styles.js +21 -0
  138. package/dist/esm/renderer/types.js +0 -0
  139. package/dist/esm/tests/base/flowBase.js +105 -0
  140. package/dist/esm/tests/base/index.js +22 -0
  141. package/dist/esm/tests/flows/checkboxRendererFlows.js +65 -0
  142. package/dist/esm/tests/flows/dateRendererFlows.js +850 -0
  143. package/dist/esm/tests/flows/dropdownRendererFlows.js +571 -0
  144. package/dist/esm/tests/flows/largeTextRendererFlows.js +79 -0
  145. package/dist/esm/tests/flows/numberRendererFlows.js +155 -0
  146. package/dist/esm/tests/flows/radioRendererFlows.js +95 -0
  147. package/dist/esm/tests/flows/textRendererFlows.js +329 -0
  148. package/dist/esm/tests/flows/toggleRendererFlows.js +86 -0
  149. package/dist/esm/tests/flows/zipCodeRendererFlows.js +1143 -0
  150. package/dist/esm/utils/dateHelper.js +35 -0
  151. package/dist/types/lib/bll/constants.d.ts +9 -0
  152. package/dist/types/lib/bll/formatters/booleanFormatter.d.ts +5 -0
  153. package/dist/types/lib/bll/formatters/dateFormatter.d.ts +28 -0
  154. package/dist/types/lib/bll/formatters/dropdownFormatter.d.ts +6 -0
  155. package/dist/types/lib/bll/formatters/factory/index.d.ts +71 -0
  156. package/dist/types/lib/bll/formatters/index.d.ts +2 -0
  157. package/dist/types/lib/bll/formatters/numberFormatter.d.ts +6 -0
  158. package/dist/types/lib/bll/formatters/phoneFormatter.d.ts +7 -0
  159. package/dist/types/lib/bll/formatters/regexFormatter.d.ts +5 -0
  160. package/dist/types/lib/bll/formatters/ssnFormatter.d.ts +5 -0
  161. package/dist/types/lib/bll/formatters/textFormatter.d.ts +6 -0
  162. package/dist/types/lib/bll/formatters/zipFormatter.d.ts +5 -0
  163. package/dist/types/lib/bll/index.d.ts +20 -0
  164. package/dist/types/lib/bll/ssf/index.d.ts +25 -0
  165. package/dist/types/lib/bll/ssf/loan.d.ts +16 -0
  166. package/dist/types/lib/bll/ssf/loconnect.d.ts +15 -0
  167. package/dist/types/lib/bll/ssf/ssfBase.d.ts +23 -0
  168. package/dist/types/lib/bll/ssf/types.d.ts +99 -0
  169. package/dist/types/lib/bll/types.d.ts +47 -0
  170. package/dist/types/lib/bll/validators/dateValidator.d.ts +16 -0
  171. package/dist/types/lib/bll/validators/emailValidator.d.ts +4 -0
  172. package/dist/types/lib/bll/validators/factory/index.d.ts +15 -0
  173. package/dist/types/lib/bll/validators/index.d.ts +2 -0
  174. package/dist/types/lib/bll/validators/maxCharValidator.d.ts +4 -0
  175. package/dist/types/lib/bll/validators/requiredValidator.d.ts +4 -0
  176. package/dist/types/lib/bll/validators/zipValidator.d.ts +5 -0
  177. package/dist/types/lib/core/index.d.ts +29 -0
  178. package/dist/types/lib/demo/config.d.ts +11 -0
  179. package/dist/types/lib/demo/index.d.ts +1 -0
  180. package/dist/types/lib/renderer/FieldRenderer.d.ts +5 -0
  181. package/dist/types/lib/renderer/base/hooks/fieldDescription.d.ts +5 -0
  182. package/dist/types/lib/renderer/base/hooks/fieldDisabled.d.ts +10 -0
  183. package/dist/types/lib/renderer/base/hooks/fieldGoTo.d.ts +4 -0
  184. package/dist/types/lib/renderer/base/hooks/fieldLocked.d.ts +4 -0
  185. package/dist/types/lib/renderer/base/hooks/fieldMeta.d.ts +10 -0
  186. package/dist/types/lib/renderer/base/hooks/fieldSubscribers.d.ts +6 -0
  187. package/dist/types/lib/renderer/base/hooks/fieldValidation.d.ts +9 -0
  188. package/dist/types/lib/renderer/base/hooks/fieldValue.d.ts +31 -0
  189. package/dist/types/lib/renderer/base/hooks/hookBase.d.ts +9 -0
  190. package/dist/types/lib/renderer/base/hooks/index.d.ts +19 -0
  191. package/dist/types/lib/renderer/base/renderer.d.ts +43 -0
  192. package/dist/types/lib/renderer/base/rendererValidator.d.ts +15 -0
  193. package/dist/types/lib/renderer/factory/index.d.ts +5 -0
  194. package/dist/types/lib/renderer/field-renderers/AddonRenderer.d.ts +12 -0
  195. package/dist/types/lib/renderer/field-renderers/CheckboxRenderer.d.ts +7 -0
  196. package/dist/types/lib/renderer/field-renderers/DateRenderer.d.ts +13 -0
  197. package/dist/types/lib/renderer/field-renderers/DropdownRenderer/hook.d.ts +23 -0
  198. package/dist/types/lib/renderer/field-renderers/DropdownRenderer/index.d.ts +12 -0
  199. package/dist/types/lib/renderer/field-renderers/LargeTextRenderer.d.ts +17 -0
  200. package/dist/types/lib/renderer/field-renderers/NumberRenderer.d.ts +12 -0
  201. package/dist/types/lib/renderer/field-renderers/RadioGroupRenderer.d.ts +8 -0
  202. package/dist/types/lib/renderer/field-renderers/RadioRenderer.d.ts +8 -0
  203. package/dist/types/lib/renderer/field-renderers/TextRenderer.d.ts +8 -0
  204. package/dist/types/lib/renderer/field-renderers/ToggleRenderer.d.ts +24 -0
  205. package/dist/types/lib/renderer/field-renderers/ZipCodeRenderer/helper.d.ts +48 -0
  206. package/dist/types/lib/renderer/field-renderers/ZipCodeRenderer/hook.d.ts +17 -0
  207. package/dist/types/lib/renderer/field-renderers/ZipCodeRenderer/index.d.ts +9 -0
  208. package/dist/types/lib/renderer/index.d.ts +2 -0
  209. package/dist/types/lib/renderer/styles.d.ts +7 -0
  210. package/dist/types/lib/renderer/types.d.ts +325 -0
  211. package/dist/types/lib/tests/base/flowBase.d.ts +13 -0
  212. package/dist/types/lib/tests/base/index.d.ts +6 -0
  213. package/dist/types/lib/tests/flows/checkboxRendererFlows.d.ts +9 -0
  214. package/dist/types/lib/tests/flows/dateRendererFlows.d.ts +120 -0
  215. package/dist/types/lib/tests/flows/dropdownRendererFlows.d.ts +92 -0
  216. package/dist/types/lib/tests/flows/largeTextRendererFlows.d.ts +9 -0
  217. package/dist/types/lib/tests/flows/numberRendererFlows.d.ts +11 -0
  218. package/dist/types/lib/tests/flows/radioRendererFlows.d.ts +10 -0
  219. package/dist/types/lib/tests/flows/textRendererFlows.d.ts +16 -0
  220. package/dist/types/lib/tests/flows/toggleRendererFlows.d.ts +10 -0
  221. package/dist/types/lib/tests/flows/zipCodeRendererFlows.d.ts +169 -0
  222. package/dist/types/lib/tests/loan-field-renderer-flows.test.d.ts +1 -0
  223. package/dist/types/lib/utils/dateHelper.d.ts +8 -0
  224. package/dist/types/tsconfig.tsbuildinfo +1 -0
  225. 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
+ };