@defra/forms-engine-plugin 4.7.2 → 4.7.3

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 (402) hide show
  1. package/.server/client/javascripts/geospatial-map.d.ts +6 -6
  2. package/.server/client/javascripts/geospatial-map.js +3 -3
  3. package/.server/client/javascripts/location-map.d.ts +1 -1
  4. package/.server/client/javascripts/location-map.js +1 -1
  5. package/.server/client/javascripts/map.d.ts +1 -1
  6. package/.server/client/javascripts/map.js +1 -1
  7. package/.server/client/javascripts/shared.d.ts +7 -7
  8. package/.server/server/index.d.ts +1 -1
  9. package/.server/server/plugins/crumb.d.ts +1 -1
  10. package/.server/server/plugins/engine/beta/form-context.d.ts +6 -6
  11. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +4 -4
  12. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +2 -2
  13. package/.server/server/plugins/engine/components/CheckboxesField.js +2 -2
  14. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  15. package/.server/server/plugins/engine/components/ComponentBase.d.ts +5 -5
  16. package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -8
  17. package/.server/server/plugins/engine/components/DatePartsField.d.ts +11 -11
  18. package/.server/server/plugins/engine/components/DeclarationField.d.ts +3 -3
  19. package/.server/server/plugins/engine/components/Details.d.ts +1 -1
  20. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +22 -22
  21. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -4
  22. package/.server/server/plugins/engine/components/FileUploadField.d.ts +3 -3
  23. package/.server/server/plugins/engine/components/FormComponent.d.ts +10 -10
  24. package/.server/server/plugins/engine/components/GeospatialField.d.ts +6 -6
  25. package/.server/server/plugins/engine/components/HiddenField.d.ts +2 -2
  26. package/.server/server/plugins/engine/components/Html.d.ts +1 -1
  27. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -1
  28. package/.server/server/plugins/engine/components/LatLongField.d.ts +22 -22
  29. package/.server/server/plugins/engine/components/List.d.ts +8 -8
  30. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +10 -10
  31. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +6 -6
  32. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +14 -14
  33. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -1
  34. package/.server/server/plugins/engine/components/MonthYearField.d.ts +11 -11
  35. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +5 -5
  36. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +1 -1
  37. package/.server/server/plugins/engine/components/NumberField.d.ts +3 -3
  38. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +1 -1
  39. package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -12
  40. package/.server/server/plugins/engine/components/RadiosField.d.ts +1 -1
  41. package/.server/server/plugins/engine/components/SelectField.d.ts +4 -4
  42. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +10 -10
  43. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +4 -4
  44. package/.server/server/plugins/engine/components/TextField.d.ts +2 -2
  45. package/.server/server/plugins/engine/components/UkAddressField.d.ts +11 -11
  46. package/.server/server/plugins/engine/components/YesNoField.d.ts +2 -2
  47. package/.server/server/plugins/engine/components/helpers/__stubs__/geospatial.d.ts +1 -1
  48. package/.server/server/plugins/engine/components/helpers/components.d.ts +5 -5
  49. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +1 -1
  50. package/.server/server/plugins/engine/components/index.d.ts +27 -27
  51. package/.server/server/plugins/engine/components/types.d.ts +1 -1
  52. package/.server/server/plugins/engine/configureEnginePlugin.d.ts +4 -4
  53. package/.server/server/plugins/engine/date-helper.d.ts +1 -1
  54. package/.server/server/plugins/engine/helpers.d.ts +8 -8
  55. package/.server/server/plugins/engine/index.d.ts +5 -5
  56. package/.server/server/plugins/engine/models/FormModel.d.ts +6 -6
  57. package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +6 -6
  58. package/.server/server/plugins/engine/models/index.d.ts +2 -2
  59. package/.server/server/plugins/engine/models/types.d.ts +4 -4
  60. package/.server/server/plugins/engine/options.d.ts +1 -1
  61. package/.server/server/plugins/engine/options.js +1 -1
  62. package/.server/server/plugins/engine/options.test.js +1 -1
  63. package/.server/server/plugins/engine/outputFormatters/adapter/v1.d.ts +4 -4
  64. package/.server/server/plugins/engine/outputFormatters/human/v1.d.ts +4 -4
  65. package/.server/server/plugins/engine/outputFormatters/index.d.ts +5 -5
  66. package/.server/server/plugins/engine/outputFormatters/machine/v1.d.ts +4 -4
  67. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +4 -4
  68. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +8 -8
  69. package/.server/server/plugins/engine/pageControllers/PageController.d.ts +6 -6
  70. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +8 -8
  71. package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +5 -5
  72. package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +4 -4
  73. package/.server/server/plugins/engine/pageControllers/StatusPageController.d.ts +4 -4
  74. package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +5 -5
  75. package/.server/server/plugins/engine/pageControllers/TerminalPageController.d.ts +3 -3
  76. package/.server/server/plugins/engine/pageControllers/__stubs__/request.d.ts +2 -2
  77. package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
  78. package/.server/server/plugins/engine/pageControllers/helpers/pages.d.ts +2 -2
  79. package/.server/server/plugins/engine/pageControllers/helpers/state.d.ts +5 -5
  80. package/.server/server/plugins/engine/pageControllers/helpers/state.js +1 -1
  81. package/.server/server/plugins/engine/pageControllers/helpers/state.js.map +1 -1
  82. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  83. package/.server/server/plugins/engine/pageControllers/index.d.ts +7 -7
  84. package/.server/server/plugins/engine/plugin.d.ts +1 -1
  85. package/.server/server/plugins/engine/routes/file-upload.d.ts +1 -1
  86. package/.server/server/plugins/engine/routes/index.d.ts +3 -3
  87. package/.server/server/plugins/engine/routes/payment-helper.d.ts +3 -3
  88. package/.server/server/plugins/engine/routes/payment-helper.js +2 -2
  89. package/.server/server/plugins/engine/routes/payment.js +5 -5
  90. package/.server/server/plugins/engine/routes/payment.test.js +1 -1
  91. package/.server/server/plugins/engine/routes/questions.d.ts +2 -2
  92. package/.server/server/plugins/engine/routes/repeaters/item-delete.d.ts +2 -2
  93. package/.server/server/plugins/engine/routes/repeaters/summary.d.ts +2 -2
  94. package/.server/server/plugins/engine/services/index.d.ts +3 -3
  95. package/.server/server/plugins/engine/services/notifyService.d.ts +4 -4
  96. package/.server/server/plugins/engine/services/uploadService.d.ts +2 -2
  97. package/.server/server/plugins/engine/services/uploadService.js +1 -1
  98. package/.server/server/plugins/engine/types/index.d.ts +10 -10
  99. package/.server/server/plugins/engine/types/schema.d.ts +1 -1
  100. package/.server/server/plugins/engine/types.d.ts +25 -16
  101. package/.server/server/plugins/engine/types.js.map +1 -1
  102. package/.server/server/plugins/engine/validationHelpers.d.ts +2 -2
  103. package/.server/server/plugins/engine/vision.d.ts +1 -1
  104. package/.server/server/plugins/map/index.d.ts +1 -1
  105. package/.server/server/plugins/map/index.js +1 -1
  106. package/.server/server/plugins/map/routes/get-os-token.d.ts +11 -1
  107. package/.server/server/plugins/map/routes/get-os-token.js +12 -2
  108. package/.server/server/plugins/map/routes/get-os-token.js.map +1 -1
  109. package/.server/server/plugins/map/routes/index.d.ts +4 -4
  110. package/.server/server/plugins/map/routes/index.js +3 -2
  111. package/.server/server/plugins/map/routes/index.js.map +1 -1
  112. package/.server/server/plugins/map/service.d.ts +1 -1
  113. package/.server/server/plugins/map/service.js +5 -2
  114. package/.server/server/plugins/map/service.js.map +1 -1
  115. package/.server/server/plugins/map/test/__stubs__/find.d.ts +1 -1
  116. package/.server/server/plugins/map/test/__stubs__/find.js +1 -1
  117. package/.server/server/plugins/nunjucks/context.d.ts +2 -2
  118. package/.server/server/plugins/nunjucks/context.js +2 -2
  119. package/.server/server/plugins/nunjucks/context.test.js +1 -1
  120. package/.server/server/plugins/nunjucks/enviroment.test.js +1 -1
  121. package/.server/server/plugins/nunjucks/environment.d.ts +3 -3
  122. package/.server/server/plugins/nunjucks/environment.js +3 -3
  123. package/.server/server/plugins/nunjucks/filters/answer.d.ts +1 -1
  124. package/.server/server/plugins/nunjucks/filters/answer.js +2 -2
  125. package/.server/server/plugins/nunjucks/filters/answer.test.js +1 -1
  126. package/.server/server/plugins/nunjucks/filters/evaluate.d.ts +1 -1
  127. package/.server/server/plugins/nunjucks/filters/evaluate.js +1 -1
  128. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  129. package/.server/server/plugins/nunjucks/filters/field.js +1 -1
  130. package/.server/server/plugins/nunjucks/filters/field.test.js +1 -1
  131. package/.server/server/plugins/nunjucks/filters/href.d.ts +1 -1
  132. package/.server/server/plugins/nunjucks/filters/href.js +1 -1
  133. package/.server/server/plugins/nunjucks/filters/href.test.js +1 -1
  134. package/.server/server/plugins/nunjucks/filters/index.d.ts +8 -8
  135. package/.server/server/plugins/nunjucks/filters/page.d.ts +1 -1
  136. package/.server/server/plugins/nunjucks/filters/page.js +1 -1
  137. package/.server/server/plugins/nunjucks/filters/page.test.js +1 -1
  138. package/.server/server/plugins/nunjucks/index.d.ts +3 -3
  139. package/.server/server/plugins/nunjucks/render.d.ts +2 -2
  140. package/.server/server/plugins/nunjucks/render.js +1 -1
  141. package/.server/server/plugins/nunjucks/types.d.ts +1 -1
  142. package/.server/server/plugins/nunjucks/types.js +1 -1
  143. package/.server/server/plugins/payment/helper.d.ts +2 -2
  144. package/.server/server/plugins/payment/helper.js +1 -1
  145. package/.server/server/plugins/payment/service.d.ts +3 -3
  146. package/.server/server/plugins/payment/service.js +1 -1
  147. package/.server/server/plugins/postcode-lookup/index.d.ts +1 -1
  148. package/.server/server/plugins/postcode-lookup/index.js +1 -1
  149. package/.server/server/plugins/postcode-lookup/models/index.d.ts +6 -6
  150. package/.server/server/plugins/postcode-lookup/models/index.js +1 -1
  151. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +6 -6
  152. package/.server/server/plugins/postcode-lookup/routes/index.js +15 -15
  153. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  154. package/.server/server/plugins/postcode-lookup/service.d.ts +1 -1
  155. package/.server/server/plugins/postcode-lookup/service.js +5 -2
  156. package/.server/server/plugins/postcode-lookup/service.js.map +1 -1
  157. package/.server/server/plugins/postcode-lookup/types.js +1 -1
  158. package/.server/server/routes/index.d.ts +2 -2
  159. package/.server/server/routes/types.d.ts +1 -1
  160. package/.server/server/schemas/index.d.ts +2 -2
  161. package/.server/server/services/cacheService.d.ts +8 -8
  162. package/.server/server/services/cacheService.js +2 -5
  163. package/.server/server/services/cacheService.js.map +1 -1
  164. package/.server/server/services/httpService.test.js +1 -1
  165. package/.server/server/services/index.d.ts +1 -1
  166. package/.server/server/types.d.ts +7 -7
  167. package/.server/server/utils/file-form-service.d.ts +2 -2
  168. package/.server/server/utils/file-form-service.js +1 -1
  169. package/package.json +8 -4
  170. package/src/client/javascripts/application.js +1 -1
  171. package/src/client/javascripts/geospatial-map.js +4 -4
  172. package/src/client/javascripts/location-map.js +2 -2
  173. package/src/client/javascripts/map.js +3 -3
  174. package/src/client/javascripts/shared.js +7 -7
  175. package/src/index.ts +3 -3
  176. package/src/server/common/helpers/logging/logger-options.ts +1 -1
  177. package/src/server/common/helpers/logging/logger.ts +1 -1
  178. package/src/server/common/helpers/logging/request-logger.ts +1 -1
  179. package/src/server/common/helpers/logging/request-tracing.js +1 -1
  180. package/src/server/common/helpers/redis-client.js +2 -2
  181. package/src/server/index.ts +13 -13
  182. package/src/server/plugins/crumb.ts +2 -2
  183. package/src/server/plugins/engine/beta/form-context.ts +9 -9
  184. package/src/server/plugins/engine/components/AutocompleteField.ts +3 -3
  185. package/src/server/plugins/engine/components/CheckboxesField.ts +7 -8
  186. package/src/server/plugins/engine/components/ComponentBase.ts +5 -5
  187. package/src/server/plugins/engine/components/ComponentCollection.ts +9 -9
  188. package/src/server/plugins/engine/components/DatePartsField.ts +8 -8
  189. package/src/server/plugins/engine/components/DeclarationField.ts +3 -3
  190. package/src/server/plugins/engine/components/Details.ts +1 -1
  191. package/src/server/plugins/engine/components/EastingNorthingField.ts +9 -9
  192. package/src/server/plugins/engine/components/EmailAddressField.ts +3 -3
  193. package/src/server/plugins/engine/components/FileUploadField.ts +6 -6
  194. package/src/server/plugins/engine/components/FormComponent.ts +4 -4
  195. package/src/server/plugins/engine/components/GeospatialField.ts +5 -5
  196. package/src/server/plugins/engine/components/HiddenField.ts +4 -4
  197. package/src/server/plugins/engine/components/Html.ts +1 -1
  198. package/src/server/plugins/engine/components/InsetText.ts +1 -1
  199. package/src/server/plugins/engine/components/LatLongField.ts +9 -9
  200. package/src/server/plugins/engine/components/List.ts +2 -2
  201. package/src/server/plugins/engine/components/ListFormComponent.ts +4 -4
  202. package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -5
  203. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +5 -5
  204. package/src/server/plugins/engine/components/Markdown.ts +1 -1
  205. package/src/server/plugins/engine/components/MonthYearField.ts +8 -8
  206. package/src/server/plugins/engine/components/MultilineTextField.ts +4 -4
  207. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +2 -2
  208. package/src/server/plugins/engine/components/NumberField.ts +3 -3
  209. package/src/server/plugins/engine/components/OsGridRefField.ts +2 -2
  210. package/src/server/plugins/engine/components/PaymentField.ts +8 -8
  211. package/src/server/plugins/engine/components/RadiosField.ts +1 -1
  212. package/src/server/plugins/engine/components/SelectField.ts +2 -2
  213. package/src/server/plugins/engine/components/SelectionControlField.ts +4 -4
  214. package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -4
  215. package/src/server/plugins/engine/components/TextField.ts +3 -3
  216. package/src/server/plugins/engine/components/UkAddressField.ts +7 -7
  217. package/src/server/plugins/engine/components/YesNoField.ts +5 -5
  218. package/src/server/plugins/engine/components/helpers/__stubs__/geospatial.ts +1 -1
  219. package/src/server/plugins/engine/components/helpers/components.ts +8 -8
  220. package/src/server/plugins/engine/components/helpers/geospatial.ts +1 -1
  221. package/src/server/plugins/engine/components/index.ts +27 -27
  222. package/src/server/plugins/engine/components/types.ts +1 -1
  223. package/src/server/plugins/engine/configureEnginePlugin.ts +10 -10
  224. package/src/server/plugins/engine/date-helper.ts +1 -1
  225. package/src/server/plugins/engine/helpers.ts +8 -8
  226. package/src/server/plugins/engine/index.ts +8 -8
  227. package/src/server/plugins/engine/models/FormModel.ts +15 -15
  228. package/src/server/plugins/engine/models/SummaryViewModel.ts +10 -10
  229. package/src/server/plugins/engine/models/index.ts +2 -2
  230. package/src/server/plugins/engine/models/types.ts +4 -4
  231. package/src/server/plugins/engine/options.js +3 -3
  232. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +6 -6
  233. package/src/server/plugins/engine/outputFormatters/human/v1.ts +9 -9
  234. package/src/server/plugins/engine/outputFormatters/index.ts +8 -8
  235. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +7 -7
  236. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +6 -6
  237. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +9 -9
  238. package/src/server/plugins/engine/pageControllers/PageController.ts +7 -7
  239. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +13 -13
  240. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +6 -6
  241. package/src/server/plugins/engine/pageControllers/StartPageController.ts +3 -3
  242. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +5 -5
  243. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +12 -12
  244. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +3 -3
  245. package/src/server/plugins/engine/pageControllers/__stubs__/request.ts +3 -3
  246. package/src/server/plugins/engine/pageControllers/__stubs__/server.ts +2 -2
  247. package/src/server/plugins/engine/pageControllers/errors.ts +1 -1
  248. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -2
  249. package/src/server/plugins/engine/pageControllers/helpers/state.ts +9 -9
  250. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +5 -5
  251. package/src/server/plugins/engine/pageControllers/index.ts +7 -7
  252. package/src/server/plugins/engine/pageControllers/validationOptions.ts +1 -1
  253. package/src/server/plugins/engine/plugin.ts +14 -14
  254. package/src/server/plugins/engine/routes/file-upload.ts +2 -2
  255. package/src/server/plugins/engine/routes/index.ts +10 -10
  256. package/src/server/plugins/engine/routes/payment-helper.js +4 -4
  257. package/src/server/plugins/engine/routes/payment.js +9 -9
  258. package/src/server/plugins/engine/routes/questions.ts +10 -10
  259. package/src/server/plugins/engine/routes/repeaters/item-delete.ts +6 -6
  260. package/src/server/plugins/engine/routes/repeaters/summary.ts +5 -5
  261. package/src/server/plugins/engine/services/formSubmissionService.js +2 -2
  262. package/src/server/plugins/engine/services/index.js +3 -3
  263. package/src/server/plugins/engine/services/localFormsService.js +2 -2
  264. package/src/server/plugins/engine/services/notifyService.ts +9 -9
  265. package/src/server/plugins/engine/services/uploadService.js +3 -3
  266. package/src/server/plugins/engine/types/index.ts +10 -10
  267. package/src/server/plugins/engine/types/schema.ts +2 -2
  268. package/src/server/plugins/engine/types.ts +22 -17
  269. package/src/server/plugins/engine/validationHelpers.ts +3 -3
  270. package/src/server/plugins/engine/vision.ts +3 -3
  271. package/src/server/plugins/map/index.js +2 -2
  272. package/src/server/plugins/map/routes/get-os-token.js +15 -3
  273. package/src/server/plugins/map/routes/index.js +7 -5
  274. package/src/server/plugins/map/service.js +7 -4
  275. package/src/server/plugins/map/test/__stubs__/find.js +1 -1
  276. package/src/server/plugins/nunjucks/context.js +5 -5
  277. package/src/server/plugins/nunjucks/environment.js +6 -6
  278. package/src/server/plugins/nunjucks/filters/answer.js +3 -3
  279. package/src/server/plugins/nunjucks/filters/evaluate.js +2 -2
  280. package/src/server/plugins/nunjucks/filters/field.js +1 -1
  281. package/src/server/plugins/nunjucks/filters/href.js +2 -2
  282. package/src/server/plugins/nunjucks/filters/index.js +8 -8
  283. package/src/server/plugins/nunjucks/filters/page.js +1 -1
  284. package/src/server/plugins/nunjucks/index.js +3 -3
  285. package/src/server/plugins/nunjucks/plugin.js +3 -3
  286. package/src/server/plugins/nunjucks/render.js +2 -2
  287. package/src/server/plugins/nunjucks/types.js +1 -1
  288. package/src/server/plugins/payment/helper.js +2 -2
  289. package/src/server/plugins/payment/service.js +4 -4
  290. package/src/server/plugins/postcode-lookup/index.js +2 -2
  291. package/src/server/plugins/postcode-lookup/models/index.js +3 -3
  292. package/src/server/plugins/postcode-lookup/routes/index.js +24 -14
  293. package/src/server/plugins/postcode-lookup/service.js +7 -4
  294. package/src/server/plugins/postcode-lookup/types.js +1 -1
  295. package/src/server/plugins/session.ts +1 -1
  296. package/src/server/routes/index.ts +2 -2
  297. package/src/server/routes/public.ts +1 -1
  298. package/src/server/routes/types.ts +1 -1
  299. package/src/server/schemas/index.ts +2 -2
  300. package/src/server/secure-context.js +1 -1
  301. package/src/server/services/cacheService.ts +13 -18
  302. package/src/server/services/httpService.ts +1 -1
  303. package/src/server/services/index.ts +1 -1
  304. package/src/server/types.ts +7 -7
  305. package/src/server/utils/notify.ts +2 -2
  306. package/src/server/utils/utils.js +1 -1
  307. package/src/typings/hapi/index.d.ts +4 -4
  308. package/src/typings/joi/index.d.ts +1 -1
  309. package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
  310. package/src/server/index.test.ts +0 -644
  311. package/src/server/plugins/engine/beta/form-context.test.ts +0 -373
  312. package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -362
  313. package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -486
  314. package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -927
  315. package/src/server/plugins/engine/components/DeclarationField.test.ts +0 -560
  316. package/src/server/plugins/engine/components/Details.test.ts +0 -49
  317. package/src/server/plugins/engine/components/EastingNorthingField.test.ts +0 -727
  318. package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -445
  319. package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -1079
  320. package/src/server/plugins/engine/components/GeospatialField.test.ts +0 -380
  321. package/src/server/plugins/engine/components/HiddenField.test.ts +0 -188
  322. package/src/server/plugins/engine/components/Html.test.ts +0 -48
  323. package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
  324. package/src/server/plugins/engine/components/LatLongField.test.ts +0 -898
  325. package/src/server/plugins/engine/components/List.test.ts +0 -79
  326. package/src/server/plugins/engine/components/LocationFieldBase.test.ts +0 -253
  327. package/src/server/plugins/engine/components/LocationFieldHelpers.test.ts +0 -743
  328. package/src/server/plugins/engine/components/Markdown.test.ts +0 -48
  329. package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -617
  330. package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -647
  331. package/src/server/plugins/engine/components/NationalGridFieldNumberField.test.ts +0 -449
  332. package/src/server/plugins/engine/components/NumberField.test.ts +0 -723
  333. package/src/server/plugins/engine/components/OsGridRefField.test.ts +0 -460
  334. package/src/server/plugins/engine/components/PaymentField.test.ts +0 -745
  335. package/src/server/plugins/engine/components/RadiosField.test.ts +0 -297
  336. package/src/server/plugins/engine/components/SelectField.test.ts +0 -289
  337. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -384
  338. package/src/server/plugins/engine/components/TextField.test.ts +0 -521
  339. package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -806
  340. package/src/server/plugins/engine/components/YesNoField.test.ts +0 -256
  341. package/src/server/plugins/engine/components/helpers/components.test.ts +0 -399
  342. package/src/server/plugins/engine/components/helpers/geospatial.test.js +0 -55
  343. package/src/server/plugins/engine/components/helpers/helpers.test.ts +0 -219
  344. package/src/server/plugins/engine/date-helper.test.ts +0 -47
  345. package/src/server/plugins/engine/helpers.test.ts +0 -868
  346. package/src/server/plugins/engine/models/FormModel.test.ts +0 -725
  347. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -472
  348. package/src/server/plugins/engine/options.test.js +0 -63
  349. package/src/server/plugins/engine/outputFormatters/adapter/v1.location.test.ts +0 -356
  350. package/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +0 -871
  351. package/src/server/plugins/engine/outputFormatters/human/v1.payment.test.ts +0 -147
  352. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -145
  353. package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
  354. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -268
  355. package/src/server/plugins/engine/outputFormatters/machine/v2.location.test.ts +0 -341
  356. package/src/server/plugins/engine/outputFormatters/machine/v2.payment.test.ts +0 -115
  357. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -311
  358. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1372
  359. package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -246
  360. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1686
  361. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -279
  362. package/src/server/plugins/engine/pageControllers/StartPageController.test.ts +0 -32
  363. package/src/server/plugins/engine/pageControllers/StatusPageController.test.ts +0 -32
  364. package/src/server/plugins/engine/pageControllers/SummaryPageController.test.ts +0 -89
  365. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -37
  366. package/src/server/plugins/engine/pageControllers/errors.test.ts +0 -78
  367. package/src/server/plugins/engine/pageControllers/helpers/helpers.test.ts +0 -182
  368. package/src/server/plugins/engine/pageControllers/helpers/state.test.ts +0 -359
  369. package/src/server/plugins/engine/pageControllers/helpers/submission.test.ts +0 -373
  370. package/src/server/plugins/engine/referenceNumbers.test.ts +0 -74
  371. package/src/server/plugins/engine/routes/index.test.ts +0 -332
  372. package/src/server/plugins/engine/routes/payment-helper.test.js +0 -136
  373. package/src/server/plugins/engine/routes/payment.test.js +0 -180
  374. package/src/server/plugins/engine/routes/questions.test.ts +0 -502
  375. package/src/server/plugins/engine/routes/repeaters/item-delete.test.ts +0 -83
  376. package/src/server/plugins/engine/routes/repeaters/summary.test.ts +0 -75
  377. package/src/server/plugins/engine/services/formsService.test.js +0 -26
  378. package/src/server/plugins/engine/services/notifyService.test.ts +0 -310
  379. package/src/server/plugins/engine/types/schema.test.ts +0 -234
  380. package/src/server/plugins/engine/views/components/service-banner/template.test.js +0 -43
  381. package/src/server/plugins/engine/views/components/tag-env/template.test.js +0 -28
  382. package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
  383. package/src/server/plugins/map/routes/get-os-token.test.js +0 -55
  384. package/src/server/plugins/map/service.test.js +0 -144
  385. package/src/server/plugins/nunjucks/context.test.js +0 -109
  386. package/src/server/plugins/nunjucks/enviroment.test.js +0 -207
  387. package/src/server/plugins/nunjucks/filters/answer.test.js +0 -92
  388. package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
  389. package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
  390. package/src/server/plugins/nunjucks/filters/merge.test.js +0 -15
  391. package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
  392. package/src/server/plugins/payment/helper.test.js +0 -29
  393. package/src/server/plugins/payment/service.test.js +0 -218
  394. package/src/server/plugins/postcode-lookup/service.test.js +0 -177
  395. package/src/server/postcode-lookup.test.ts +0 -64
  396. package/src/server/routes/dummy-api.test.ts +0 -97
  397. package/src/server/services/cacheService.test.ts +0 -308
  398. package/src/server/services/httpService.test.js +0 -491
  399. package/src/server/utils/file-form-service.test.js +0 -127
  400. package/src/server/utils/notify.test.ts +0 -37
  401. package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
  402. package/src/server/utils/utils.test.js +0 -69
@@ -1,743 +0,0 @@
1
- import { ComponentType, type LatLongFieldComponent } from '@defra/forms-model'
2
-
3
- import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
4
- import { type LatLongField } from '~/src/server/plugins/engine/components/LatLongField.js'
5
- import {
6
- deduplicateErrorsByHref,
7
- formatErrorList,
8
- joinWithAnd,
9
- mergeCssClasses
10
- } from '~/src/server/plugins/engine/components/LocationFieldHelpers.js'
11
- import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
12
- import { type FormSubmissionError } from '~/src/server/plugins/engine/types.js'
13
- import definition from '~/test/form/definitions/blank.js'
14
-
15
- describe('LocationFieldHelpers', () => {
16
- let model: FormModel
17
-
18
- beforeEach(() => {
19
- model = new FormModel(definition, {
20
- basePath: 'test'
21
- })
22
- })
23
-
24
- describe('joinWithAnd', () => {
25
- it('should join two items with "and"', () => {
26
- expect(joinWithAnd(['item1', 'item2'])).toBe('item1 and item2')
27
- })
28
-
29
- it('should join three items with commas and "and"', () => {
30
- expect(joinWithAnd(['item1', 'item2', 'item3'])).toBe(
31
- 'item1, item2 and item3'
32
- )
33
- })
34
-
35
- it('should join four items with commas and "and"', () => {
36
- expect(joinWithAnd(['item1', 'item2', 'item3', 'item4'])).toBe(
37
- 'item1, item2, item3 and item4'
38
- )
39
- })
40
- })
41
-
42
- describe('formatErrorList', () => {
43
- it('should return empty string for empty array', () => {
44
- expect(formatErrorList([])).toBe('')
45
- })
46
-
47
- it('should return single message without formatting', () => {
48
- expect(formatErrorList(['Error message'])).toBe('Error message')
49
- })
50
-
51
- describe('Enter field name patterns', () => {
52
- it('should lowercase field names in subsequent "Enter latitude/longitude" messages', () => {
53
- expect(formatErrorList(['Enter latitude', 'Enter longitude'])).toBe(
54
- 'Enter latitude and enter longitude'
55
- )
56
- })
57
-
58
- it('should lowercase field names in subsequent "Enter easting/northing" messages', () => {
59
- expect(formatErrorList(['Enter easting', 'Enter northing'])).toBe(
60
- 'Enter easting and enter northing'
61
- )
62
- })
63
-
64
- it('should lowercase field names in three or more "Enter" messages', () => {
65
- expect(
66
- formatErrorList([
67
- 'Enter latitude',
68
- 'Enter longitude',
69
- 'Enter easting'
70
- ])
71
- ).toBe('Enter latitude, enter longitude and enter easting')
72
- })
73
-
74
- it('should handle "Enter a valid" pattern', () => {
75
- expect(
76
- formatErrorList([
77
- 'Enter a valid latitude for location like 51.519450',
78
- 'Enter a valid longitude for location like -0.127758'
79
- ])
80
- ).toBe(
81
- 'Enter a valid latitude for location like 51.519450 and enter a valid longitude for location like -0.127758'
82
- )
83
- })
84
- })
85
-
86
- describe('Field name at start patterns', () => {
87
- it('should lowercase first character in subsequent messages', () => {
88
- expect(
89
- formatErrorList([
90
- 'Latitude for location must be between 49.85 and 60.859',
91
- 'Longitude for location must be between -13.687 and 1.767'
92
- ])
93
- ).toBe(
94
- 'Latitude for location must be between 49.85 and 60.859 and longitude for location must be between -13.687 and 1.767'
95
- )
96
- })
97
-
98
- it('should handle precision error messages', () => {
99
- expect(
100
- formatErrorList([
101
- 'Latitude must have no more than 7 decimal places',
102
- 'Longitude must have no more than 7 decimal places'
103
- ])
104
- ).toBe(
105
- 'Latitude must have no more than 7 decimal places and longitude must have no more than 7 decimal places'
106
- )
107
- })
108
- })
109
-
110
- describe('Mixed patterns', () => {
111
- it('should handle mixed Enter and validation error messages', () => {
112
- expect(
113
- formatErrorList([
114
- 'Enter latitude',
115
- 'Longitude for location must be between -13.687 and 1.767'
116
- ])
117
- ).toBe(
118
- 'Enter latitude and longitude for location must be between -13.687 and 1.767'
119
- )
120
- })
121
-
122
- it('should handle three mixed messages', () => {
123
- expect(
124
- formatErrorList([
125
- 'Latitude must have no more than 7 decimal places',
126
- 'Enter longitude',
127
- 'Easting for location must be between 0 and 700000'
128
- ])
129
- ).toBe(
130
- 'Latitude must have no more than 7 decimal places, enter longitude and easting for location must be between 0 and 700000'
131
- )
132
- })
133
- })
134
- })
135
-
136
- describe('deduplicateErrorsByHref', () => {
137
- it('should return undefined for undefined input', () => {
138
- expect(deduplicateErrorsByHref(undefined)).toBeUndefined()
139
- })
140
-
141
- it('should return undefined for empty array', () => {
142
- expect(deduplicateErrorsByHref([])).toBeUndefined()
143
- })
144
-
145
- it('should return single error unchanged', () => {
146
- const error: FormSubmissionError = {
147
- name: 'field1',
148
- path: ['field1'],
149
- href: '#field1',
150
- text: 'Error message'
151
- }
152
- expect(deduplicateErrorsByHref([error])).toEqual([error])
153
- })
154
-
155
- it('should deduplicate errors with same href', () => {
156
- const error1: FormSubmissionError = {
157
- name: 'field1',
158
- path: ['field1'],
159
- href: '#field1',
160
- text: 'Error 1'
161
- }
162
- const error2: FormSubmissionError = {
163
- name: 'field1',
164
- path: ['field1'],
165
- href: '#field1',
166
- text: 'Error 2'
167
- }
168
- const result = deduplicateErrorsByHref([error1, error2])
169
- expect(result).toHaveLength(1)
170
- expect(result?.[0]).toBe(error1) // Should keep first occurrence
171
- })
172
-
173
- it('should keep errors with different hrefs', () => {
174
- const error1: FormSubmissionError = {
175
- name: 'field1',
176
- path: ['field1'],
177
- href: '#field1',
178
- text: 'Error 1'
179
- }
180
- const error2: FormSubmissionError = {
181
- name: 'field2',
182
- path: ['field2'],
183
- href: '#field2',
184
- text: 'Error 2'
185
- }
186
- const result = deduplicateErrorsByHref([error1, error2])
187
- expect(result).toHaveLength(2)
188
- expect(result).toEqual([error1, error2])
189
- })
190
-
191
- it('should deduplicate multiple errors with same href', () => {
192
- const error1: FormSubmissionError = {
193
- name: 'field1',
194
- path: ['field1'],
195
- href: '#field1',
196
- text: 'Error 1'
197
- }
198
- const error2: FormSubmissionError = {
199
- name: 'field1',
200
- path: ['field1'],
201
- href: '#field1',
202
- text: 'Error 2'
203
- }
204
- const error3: FormSubmissionError = {
205
- name: 'field2',
206
- path: ['field2'],
207
- href: '#field2',
208
- text: 'Error 3'
209
- }
210
- const error4: FormSubmissionError = {
211
- name: 'field1',
212
- path: ['field1'],
213
- href: '#field1',
214
- text: 'Error 4'
215
- }
216
- const result = deduplicateErrorsByHref([error1, error2, error3, error4])
217
- expect(result).toHaveLength(2)
218
- expect(result?.[0]).toBe(error1) // First occurrence of #field1
219
- expect(result?.[1]).toBe(error3) // #field2
220
- })
221
- })
222
-
223
- describe('mergeCssClasses', () => {
224
- it('should return undefined for no arguments', () => {
225
- expect(mergeCssClasses()).toBeUndefined()
226
- })
227
-
228
- it('should return undefined for all undefined arguments', () => {
229
- expect(mergeCssClasses(undefined, undefined)).toBeUndefined()
230
- })
231
-
232
- it('should return undefined for empty strings', () => {
233
- expect(mergeCssClasses('', ' ', '')).toBeUndefined()
234
- })
235
-
236
- it('should return single class', () => {
237
- expect(mergeCssClasses('class1')).toBe('class1')
238
- })
239
-
240
- it('should merge multiple classes', () => {
241
- expect(mergeCssClasses('class1', 'class2')).toBe('class1 class2')
242
- })
243
-
244
- it('should deduplicate classes', () => {
245
- expect(mergeCssClasses('class1', 'class2 class1')).toBe('class1 class2')
246
- })
247
-
248
- it('should handle undefined mixed with classes', () => {
249
- expect(mergeCssClasses('class1', undefined, 'class2')).toBe(
250
- 'class1 class2'
251
- )
252
- })
253
-
254
- it('should handle multiple spaces in class strings', () => {
255
- expect(mergeCssClasses('class1 class2', ' class3')).toBe(
256
- 'class1 class2 class3'
257
- )
258
- })
259
- })
260
-
261
- describe('getLocationFieldViewModel', () => {
262
- it('should return view model with fieldset', () => {
263
- const def: LatLongFieldComponent = {
264
- title: 'Example lat long',
265
- name: 'myComponent',
266
- type: ComponentType.LatLongField,
267
- options: {},
268
- schema: {}
269
- }
270
-
271
- const collection = new ComponentCollection([def], { model })
272
- const field = collection.fields[0] as LatLongField
273
-
274
- const payload = {
275
- myComponent__latitude: 51.5,
276
- myComponent__longitude: -0.1
277
- }
278
-
279
- const viewModel = field.getViewModel(payload)
280
-
281
- expect(viewModel.fieldset).toEqual({
282
- legend: {
283
- text: def.title,
284
- classes: 'govuk-fieldset__legend--m'
285
- }
286
- })
287
-
288
- expect(viewModel.items).toHaveLength(2)
289
- })
290
-
291
- it('should include instruction text in view model when provided', () => {
292
- const def: LatLongFieldComponent = {
293
- title: 'Example lat long',
294
- name: 'myComponent',
295
- type: ComponentType.LatLongField,
296
- options: {
297
- instructionText: 'Enter coordinates in decimal format'
298
- },
299
- schema: {}
300
- }
301
-
302
- const collection = new ComponentCollection([def], { model })
303
- const field = collection.fields[0] as LatLongField
304
-
305
- const payload = {
306
- myComponent__latitude: 51.5,
307
- myComponent__longitude: -0.1
308
- }
309
-
310
- const viewModel = field.getViewModel(payload)
311
-
312
- const instructionText =
313
- 'instructionText' in viewModel ? viewModel.instructionText : undefined
314
- expect(instructionText).toBeTruthy()
315
- expect(instructionText).toContain('decimal format')
316
- })
317
-
318
- it('should handle component-level errors correctly', () => {
319
- const def: LatLongFieldComponent = {
320
- title: 'Example lat long',
321
- name: 'myComponent',
322
- type: ComponentType.LatLongField,
323
- options: {},
324
- schema: {}
325
- }
326
-
327
- const collection = new ComponentCollection([def], { model })
328
- const field = collection.fields[0] as LatLongField
329
-
330
- const payload = {
331
- myComponent__latitude: '',
332
- myComponent__longitude: ''
333
- }
334
-
335
- const errors = [
336
- {
337
- name: 'myComponent',
338
- text: 'Error message',
339
- path: ['myComponent'],
340
- href: '#myComponent'
341
- }
342
- ]
343
-
344
- const viewModel = field.getViewModel(payload, errors)
345
-
346
- // Check that errors are passed to the viewModel
347
- expect(viewModel.errors).toEqual(errors)
348
- expect(viewModel.showFieldsetError).toBe(true)
349
-
350
- // Items should still have their structure
351
- expect(viewModel.items[0]).toEqual(
352
- expect.objectContaining({
353
- id: 'myComponent__latitude',
354
- name: 'myComponent__latitude'
355
- })
356
- )
357
-
358
- expect(viewModel.items[1]).toEqual(
359
- expect.objectContaining({
360
- id: 'myComponent__longitude',
361
- name: 'myComponent__longitude'
362
- })
363
- )
364
- })
365
-
366
- it('should display single errors at fieldset level', () => {
367
- const def: LatLongFieldComponent = {
368
- title: 'Example lat long',
369
- name: 'myComponent',
370
- type: ComponentType.LatLongField,
371
- options: {},
372
- schema: {}
373
- }
374
-
375
- const collection = new ComponentCollection([def], { model })
376
- const field = collection.fields[0] as LatLongField
377
-
378
- const payload = {
379
- myComponent__latitude: 'invalid',
380
- myComponent__longitude: '-0.1'
381
- }
382
-
383
- const errors = [
384
- {
385
- name: 'myComponent__latitude',
386
- text: 'Invalid latitude',
387
- path: ['myComponent__latitude'],
388
- href: '#myComponent__latitude'
389
- }
390
- ]
391
-
392
- const viewModel = field.getViewModel(payload, errors)
393
-
394
- // Single errors should be displayed at fieldset level
395
- expect(viewModel.items[0].errorMessage).toBeUndefined()
396
- expect(viewModel.items[1].errorMessage).toBeUndefined()
397
-
398
- expect(viewModel.errorMessage).toEqual({
399
- text: 'Invalid latitude'
400
- })
401
-
402
- expect(viewModel.showFieldsetError).toBe(true)
403
-
404
- // Error styling should be applied to the field with error
405
- expect(viewModel.items[0].classes).toContain('govuk-input--error')
406
- })
407
-
408
- it('should display multiple errors as combined message at fieldset level', () => {
409
- const def: LatLongFieldComponent = {
410
- title: 'Example lat long',
411
- name: 'myComponent',
412
- type: ComponentType.LatLongField,
413
- options: {},
414
- schema: {}
415
- }
416
-
417
- const collection = new ComponentCollection([def], { model })
418
- const field = collection.fields[0] as LatLongField
419
-
420
- const payload = {
421
- myComponent__latitude: '',
422
- myComponent__longitude: ''
423
- }
424
-
425
- const errors = [
426
- {
427
- name: 'myComponent__latitude',
428
- text: 'Enter latitude',
429
- path: ['myComponent__latitude'],
430
- href: '#myComponent__latitude'
431
- },
432
- {
433
- name: 'myComponent__longitude',
434
- text: 'Enter longitude',
435
- path: ['myComponent__longitude'],
436
- href: '#myComponent__longitude'
437
- }
438
- ]
439
-
440
- const viewModel = field.getViewModel(payload, errors)
441
-
442
- expect(viewModel.items[0].errorMessage).toBeUndefined()
443
- expect(viewModel.items[1].errorMessage).toBeUndefined()
444
-
445
- expect(viewModel.errorMessage).toEqual({
446
- text: 'Enter latitude and enter longitude'
447
- })
448
- expect(viewModel.showFieldsetError).toBe(true)
449
-
450
- expect(viewModel.items[0].classes).toContain('govuk-input--error')
451
- expect(viewModel.items[1].classes).toContain('govuk-input--error')
452
- })
453
-
454
- it('should preserve individual error messages when no field errors exist', () => {
455
- const def: LatLongFieldComponent = {
456
- title: 'Example lat long',
457
- name: 'myComponent',
458
- type: ComponentType.LatLongField,
459
- options: {},
460
- schema: {}
461
- }
462
-
463
- const collection = new ComponentCollection([def], { model })
464
- const field = collection.fields[0] as LatLongField
465
-
466
- const payload = {
467
- myComponent__latitude: '',
468
- myComponent__longitude: ''
469
- }
470
-
471
- // No errors passed in, but the subViewModels might have errors from elsewhere
472
- const viewModel = field.getViewModel(payload, [])
473
-
474
- // When no field errors, items should not have error messages
475
- expect(viewModel.items[0].errorMessage).toBeUndefined()
476
- expect(viewModel.items[1].errorMessage).toBeUndefined()
477
-
478
- // No fieldset error when there are no field errors
479
- expect(viewModel.showFieldsetError).toBe(false)
480
- expect(viewModel.errorMessage).toBeUndefined()
481
-
482
- // No error styling when no field errors
483
- expect(viewModel.items[0].classes).not.toContain('govuk-input--error')
484
- expect(viewModel.items[1].classes).not.toContain('govuk-input--error')
485
- })
486
-
487
- it('should show fieldset error when viewModel has error but no field errors', () => {
488
- const def: LatLongFieldComponent = {
489
- title: 'Example lat long',
490
- name: 'myComponent',
491
- type: ComponentType.LatLongField,
492
- options: {},
493
- schema: {}
494
- }
495
-
496
- const collection = new ComponentCollection([def], { model })
497
- const field = collection.fields[0] as LatLongField
498
-
499
- const payload = {
500
- myComponent__latitude: '51.5',
501
- myComponent__longitude: '-0.1'
502
- }
503
-
504
- // Parent component error, not field-level
505
- const errors = [
506
- {
507
- name: 'myComponent',
508
- text: 'Location is required',
509
- path: ['myComponent'],
510
- href: '#myComponent'
511
- }
512
- ]
513
-
514
- const viewModel = field.getViewModel(payload, errors)
515
-
516
- // No individual field errors
517
- expect(viewModel.items[0].errorMessage).toBeUndefined()
518
- expect(viewModel.items[1].errorMessage).toBeUndefined()
519
-
520
- // But fieldset error should still be shown
521
- expect(viewModel.showFieldsetError).toBe(true)
522
- expect(viewModel.errorMessage).toEqual({
523
- text: 'Location is required'
524
- })
525
-
526
- // No error styling on inputs when no field errors
527
- expect(viewModel.items[0].classes).not.toContain('govuk-input--error')
528
- expect(viewModel.items[1].classes).not.toContain('govuk-input--error')
529
- })
530
-
531
- it('should handle classes with undefined base classes correctly', () => {
532
- const def: LatLongFieldComponent = {
533
- title: 'Example lat long',
534
- name: 'myComponent',
535
- type: ComponentType.LatLongField,
536
- options: {},
537
- schema: {}
538
- }
539
-
540
- const collection = new ComponentCollection([def], { model })
541
- const field = collection.fields[0] as LatLongField
542
-
543
- const payload = {
544
- myComponent__latitude: '51.5',
545
- myComponent__longitude: '-0.1'
546
- }
547
-
548
- const viewModel = field.getViewModel(payload)
549
-
550
- // When no errors and no additional classes, classes should not include govuk-input--error
551
- expect(viewModel.items[0].classes).not.toContain('govuk-input--error')
552
- expect(viewModel.items[1].classes).not.toContain('govuk-input--error')
553
- })
554
-
555
- it('should handle labels correctly in view model items', () => {
556
- const def: LatLongFieldComponent = {
557
- title: 'Example lat long',
558
- name: 'myComponent',
559
- type: ComponentType.LatLongField,
560
- options: {},
561
- schema: {}
562
- }
563
-
564
- const collection = new ComponentCollection([def], { model })
565
- const field = collection.fields[0] as LatLongField
566
-
567
- const payload = {
568
- myComponent__latitude: '51.5',
569
- myComponent__longitude: '-0.1'
570
- }
571
-
572
- const viewModel = field.getViewModel(payload)
573
-
574
- const label = viewModel.items[0].label
575
- expect(label).toBeDefined()
576
- expect(label?.text).toBe('Latitude')
577
-
578
- const labelString =
579
- label && 'toString' in label && typeof label.toString === 'function'
580
- ? (label as { toString: () => string }).toString()
581
- : ''
582
- expect(labelString).toBe('Latitude')
583
- })
584
-
585
- it('should use existing fieldset if provided', () => {
586
- const def: LatLongFieldComponent = {
587
- title: 'Example lat long',
588
- name: 'myComponent',
589
- type: ComponentType.LatLongField,
590
- options: {},
591
- schema: {}
592
- }
593
-
594
- const collection = new ComponentCollection([def], { model })
595
- const field = collection.fields[0] as LatLongField
596
-
597
- const payload = {
598
- myComponent__latitude: 51.5,
599
- myComponent__longitude: -0.1
600
- }
601
-
602
- const viewModel = field.getViewModel(payload)
603
-
604
- expect(viewModel.fieldset).toBeDefined()
605
- })
606
- })
607
-
608
- describe('createLocationFieldValidator', () => {
609
- it('should return error when required field is empty', () => {
610
- const def: LatLongFieldComponent = {
611
- title: 'Example lat long',
612
- name: 'myComponent',
613
- type: ComponentType.LatLongField,
614
- options: {},
615
- schema: {}
616
- }
617
-
618
- const collection = new ComponentCollection([def], { model })
619
-
620
- const payload = {
621
- myComponent__latitude: '',
622
- myComponent__longitude: ''
623
- }
624
-
625
- const result = collection.validate(payload)
626
-
627
- expect(result.errors).toBeTruthy()
628
- expect(result.errors?.length).toBeGreaterThan(0)
629
- })
630
-
631
- it('should return error when required field has invalid state', () => {
632
- const def: LatLongFieldComponent = {
633
- title: 'Example lat long',
634
- name: 'myComponent',
635
- type: ComponentType.LatLongField,
636
- options: {
637
- required: true
638
- },
639
- schema: {}
640
- }
641
-
642
- const collection = new ComponentCollection([def], { model })
643
-
644
- const payload = {
645
- myComponent__latitude: 'not_a_number',
646
- myComponent__longitude: 'also_not_a_number'
647
- }
648
-
649
- const result = collection.validate(payload)
650
-
651
- expect(result.errors).toBeTruthy()
652
- })
653
-
654
- it('should not return error when optional field is empty', () => {
655
- const def: LatLongFieldComponent = {
656
- title: 'Example lat long',
657
- name: 'myComponent',
658
- type: ComponentType.LatLongField,
659
- options: {
660
- required: false
661
- },
662
- schema: {}
663
- }
664
-
665
- const collection = new ComponentCollection([def], { model })
666
-
667
- const payload = {
668
- myComponent__latitude: '',
669
- myComponent__longitude: ''
670
- }
671
-
672
- const result = collection.validate(payload)
673
-
674
- expect(result.errors).toBeUndefined()
675
- })
676
-
677
- it('should return error when required field is partially filled', () => {
678
- const def: LatLongFieldComponent = {
679
- title: 'Example lat long',
680
- name: 'myComponent',
681
- type: ComponentType.LatLongField,
682
- options: {},
683
- schema: {}
684
- }
685
-
686
- const collection = new ComponentCollection([def], { model })
687
-
688
- const payload = {
689
- myComponent__latitude: '51.5',
690
- myComponent__longitude: ''
691
- }
692
-
693
- const result = collection.validate(payload)
694
-
695
- expect(result.errors).toBeTruthy()
696
- })
697
-
698
- it('should not return error when all required fields are filled', () => {
699
- const def: LatLongFieldComponent = {
700
- title: 'Example lat long',
701
- name: 'myComponent',
702
- type: ComponentType.LatLongField,
703
- options: {},
704
- schema: {}
705
- }
706
-
707
- const collection = new ComponentCollection([def], { model })
708
-
709
- const payload = {
710
- myComponent__latitude: '51.5',
711
- myComponent__longitude: '-0.1'
712
- }
713
-
714
- const result = collection.validate(payload)
715
-
716
- expect(result.errors).toBeUndefined()
717
- })
718
-
719
- it('should validate optional fields correctly when partially filled', () => {
720
- const def: LatLongFieldComponent = {
721
- title: 'Example lat long',
722
- name: 'myComponent',
723
- type: ComponentType.LatLongField,
724
- options: {
725
- required: false
726
- },
727
- schema: {}
728
- }
729
-
730
- const collection = new ComponentCollection([def], { model })
731
-
732
- const payload = {
733
- myComponent__latitude: '51.5',
734
- myComponent__longitude: ''
735
- }
736
-
737
- const result = collection.validate(payload)
738
-
739
- expect(result.errors).toBeTruthy()
740
- expect(result.errors?.length).toBeGreaterThan(0)
741
- })
742
- })
743
- })