@defra/forms-engine-plugin 4.7.2-alpha → 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,927 +0,0 @@
1
- import { ComponentType, type DatePartsFieldComponent } from '@defra/forms-model'
2
- import { addDays, format, startOfDay } from 'date-fns'
3
-
4
- import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js'
5
- import {
6
- getAnswer,
7
- type Field
8
- } from '~/src/server/plugins/engine/components/helpers/components.js'
9
- import { type DateInputItem } from '~/src/server/plugins/engine/components/types.js'
10
- import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
11
- import {
12
- type ErrorMessageTemplateList,
13
- type FormPayload,
14
- type FormState
15
- } from '~/src/server/plugins/engine/types.js'
16
- import definition from '~/test/form/definitions/blank.js'
17
-
18
- describe('DatePartsField', () => {
19
- let model: FormModel
20
-
21
- beforeEach(() => {
22
- model = new FormModel(definition, {
23
- basePath: 'test'
24
- })
25
- })
26
-
27
- describe('Defaults', () => {
28
- let def: DatePartsFieldComponent
29
- let collection: ComponentCollection
30
- let field: Field
31
-
32
- beforeEach(() => {
33
- def = {
34
- title: 'Example date parts field',
35
- shortDescription: 'Example date parts',
36
- name: 'myComponent',
37
- type: ComponentType.DatePartsField,
38
- options: {}
39
- } satisfies DatePartsFieldComponent
40
-
41
- collection = new ComponentCollection([def], { model })
42
- field = collection.fields[0]
43
- })
44
-
45
- describe('Schema', () => {
46
- it('uses collection titles as labels', () => {
47
- const { formSchema } = collection
48
- const { keys } = formSchema.describe()
49
-
50
- expect(keys).toHaveProperty(
51
- 'myComponent__day',
52
- expect.objectContaining({
53
- flags: expect.objectContaining({ label: 'Day' })
54
- })
55
- )
56
-
57
- expect(keys).toHaveProperty(
58
- 'myComponent__month',
59
- expect.objectContaining({
60
- flags: expect.objectContaining({ label: 'Month' })
61
- })
62
- )
63
-
64
- expect(keys).toHaveProperty(
65
- 'myComponent__year',
66
- expect.objectContaining({
67
- flags: expect.objectContaining({ label: 'Year' })
68
- })
69
- )
70
- })
71
-
72
- it('uses collection names as keys', () => {
73
- const { formSchema } = collection
74
- const { keys } = formSchema.describe()
75
-
76
- expect(field.keys).toEqual([
77
- 'myComponent',
78
- 'myComponent__day',
79
- 'myComponent__month',
80
- 'myComponent__year'
81
- ])
82
-
83
- expect(field.collection?.keys).not.toHaveProperty('myComponent')
84
-
85
- for (const key of field.collection?.keys ?? []) {
86
- expect(keys).toHaveProperty(key)
87
- }
88
- })
89
-
90
- it('is required by default', () => {
91
- const { formSchema } = collection
92
- const { keys } = formSchema.describe()
93
-
94
- expect(keys).toHaveProperty(
95
- 'myComponent__day',
96
- expect.objectContaining({
97
- flags: expect.objectContaining({ presence: 'required' })
98
- })
99
- )
100
-
101
- expect(keys).toHaveProperty(
102
- 'myComponent__month',
103
- expect.objectContaining({
104
- flags: expect.objectContaining({ presence: 'required' })
105
- })
106
- )
107
-
108
- expect(keys).toHaveProperty(
109
- 'myComponent__year',
110
- expect.objectContaining({
111
- flags: expect.objectContaining({ presence: 'required' })
112
- })
113
- )
114
- })
115
-
116
- it('is optional when configured', () => {
117
- const collectionOptional = new ComponentCollection(
118
- [
119
- {
120
- title: 'Example date parts field',
121
- name: 'myComponent',
122
- type: ComponentType.DatePartsField,
123
- options: { required: false }
124
- }
125
- ],
126
- { model }
127
- )
128
-
129
- const { formSchema } = collectionOptional
130
- const { keys } = formSchema.describe()
131
-
132
- expect(keys).toHaveProperty(
133
- 'myComponent__day',
134
- expect.objectContaining({ allow: [''] })
135
- )
136
-
137
- expect(keys).toHaveProperty(
138
- 'myComponent__month',
139
- expect.objectContaining({ allow: [''] })
140
- )
141
-
142
- expect(keys).toHaveProperty(
143
- 'myComponent__year',
144
- expect.objectContaining({ allow: [''] })
145
- )
146
-
147
- // Empty optional payload (valid)
148
- const result1 = collectionOptional.validate(
149
- getFormData({
150
- day: '',
151
- month: '',
152
- year: ''
153
- })
154
- )
155
-
156
- // Partial optional payload (invalid)
157
- const result2 = collectionOptional.validate(
158
- getFormData({
159
- day: '31',
160
- month: '',
161
- year: ''
162
- })
163
- )
164
-
165
- expect(result1.errors).toBeUndefined()
166
- expect(result2.errors).toEqual([
167
- expect.objectContaining({
168
- text: 'Example date parts field must include a month'
169
- })
170
- ])
171
- })
172
-
173
- it('accepts valid values', () => {
174
- const result1 = collection.validate(
175
- getFormData({
176
- day: '31',
177
- month: '12',
178
- year: '2024'
179
- })
180
- )
181
-
182
- const result2 = collection.validate(
183
- getFormData({
184
- day: '1',
185
- month: '2',
186
- year: '2024'
187
- })
188
- )
189
-
190
- // Leap year in 2024
191
- const result3 = collection.validate(
192
- getFormData({
193
- day: '29',
194
- month: '2',
195
- year: '2024'
196
- })
197
- )
198
-
199
- expect(result1.errors).toBeUndefined()
200
- expect(result2.errors).toBeUndefined()
201
- expect(result3.errors).toBeUndefined()
202
- })
203
-
204
- it('adds errors for empty value when short description exists', () => {
205
- const result = collection.validate(
206
- getFormData({
207
- day: '',
208
- month: '',
209
- year: ''
210
- })
211
- )
212
-
213
- expect(result.errors).toEqual([
214
- expect.objectContaining({
215
- text: 'Example date parts must include a day'
216
- }),
217
- expect.objectContaining({
218
- text: 'Example date parts must include a month'
219
- }),
220
- expect.objectContaining({
221
- text: 'Example date parts must include a year'
222
- })
223
- ])
224
- })
225
-
226
- it('adds errors for invalid values', () => {
227
- const result1 = collection.validate(getFormData({ unknown: 'invalid' }))
228
-
229
- const result2 = collection.validate(
230
- getFormData({
231
- day: ['invalid'],
232
- month: ['invalid'],
233
- year: ['invalid']
234
- })
235
- )
236
-
237
- const result3 = collection.validate(
238
- getFormData({
239
- day: 'invalid',
240
- month: 'invalid',
241
- year: 'invalid'
242
- })
243
- )
244
-
245
- // Check a non-4-digit year shows as an error
246
- const state4 = getFormState({
247
- day: 1,
248
- month: 2,
249
- year: 20
250
- })
251
- const result4 = field.getContextValueFromState(state4)
252
-
253
- const state5 = getFormState({
254
- day: 1,
255
- month: 2,
256
- year: 2000
257
- })
258
- const result5 = field.getContextValueFromState(state5)
259
-
260
- expect(result1.errors).toBeTruthy()
261
- expect(result2.errors).toBeTruthy()
262
- expect(result3.errors).toBeTruthy()
263
- expect(result4).toBeNull()
264
- expect(result5).toBe('2000-02-01')
265
- })
266
- })
267
-
268
- describe('State', () => {
269
- const date = new Date('2024-12-31')
270
-
271
- it('returns text from state', () => {
272
- const state1 = getFormState(date)
273
- const state2 = getFormState({})
274
-
275
- const answer1 = getAnswer(field, state1)
276
- const answer2 = getAnswer(field, state2)
277
-
278
- expect(answer1).toBe('31 December 2024')
279
- expect(answer2).toBe('')
280
- })
281
-
282
- it('returns payload from state', () => {
283
- const state1 = getFormState(startOfDay(date))
284
- const state2 = getFormState({})
285
-
286
- const payload1 = field.getFormDataFromState(state1)
287
- const payload2 = field.getFormDataFromState(state2)
288
-
289
- expect(payload1).toEqual(getFormData(date))
290
- expect(payload2).toEqual(getFormData({}))
291
- })
292
-
293
- it('returns value from state', () => {
294
- const state1 = getFormState(startOfDay(date))
295
- const state2 = getFormState({})
296
-
297
- const value1 = field.getFormValueFromState(state1)
298
- const value2 = field.getFormValueFromState(state2)
299
-
300
- expect(value1).toEqual({
301
- day: 31,
302
- month: 12,
303
- year: 2024
304
- })
305
-
306
- expect(value2).toBeUndefined()
307
- })
308
-
309
- it('returns context for conditions and form submission', () => {
310
- const state1 = getFormState(startOfDay(date))
311
- const state2 = getFormState({})
312
-
313
- const value1 = field.getContextValueFromState(state1)
314
- const value2 = field.getContextValueFromState(state2)
315
-
316
- expect(value1).toBe('2024-12-31')
317
- expect(value2).toBeNull()
318
- })
319
-
320
- it('returns null context when date is invalid', () => {
321
- const state1 = getFormState({ day: 1, month: 0, year: 2025 })
322
- const state2 = getFormState({})
323
- const state3 = getFormState({ day: 1, month: 13, year: 2025 })
324
- const state4 = getFormState({ day: 32, month: 12, year: 2025 })
325
-
326
- const value1 = field.getContextValueFromState(state1)
327
- const value2 = field.getContextValueFromState(state2)
328
- const value3 = field.getContextValueFromState(state3)
329
- const value4 = field.getContextValueFromState(state4)
330
-
331
- expect(value1).toBeNull()
332
- expect(value2).toBeNull()
333
- expect(value3).toBeNull()
334
- expect(value4).toBeNull()
335
- })
336
-
337
- it('returns state from payload', () => {
338
- const payload1 = getFormData(date)
339
- const payload2 = getFormData({})
340
-
341
- const value1 = field.getStateFromValidForm(payload1)
342
- const value2 = field.getStateFromValidForm(payload2)
343
-
344
- expect(value1).toEqual(getFormState(date))
345
- expect(value2).toEqual(getFormState({}))
346
- })
347
- })
348
-
349
- describe('View model', () => {
350
- const date = new Date('2024-12-31')
351
-
352
- it('sets Nunjucks component defaults', () => {
353
- const payload = getFormData(date)
354
- const viewModel = field.getViewModel(payload)
355
-
356
- expect(viewModel).toEqual(
357
- expect.objectContaining({
358
- label: { text: def.title },
359
- name: 'myComponent',
360
- id: 'myComponent',
361
- value: undefined,
362
- items: [
363
- expect.objectContaining(
364
- getViewModel(date, 'day', {
365
- label: { text: 'Day' },
366
- classes: 'govuk-input--width-2',
367
- value: 31
368
- })
369
- ),
370
-
371
- expect.objectContaining(
372
- getViewModel(date, 'month', {
373
- label: { text: 'Month' },
374
- classes: 'govuk-input--width-2',
375
- value: 12
376
- })
377
- ),
378
-
379
- expect.objectContaining(
380
- getViewModel(date, 'year', {
381
- label: { text: 'Year' },
382
- classes: 'govuk-input--width-4',
383
- value: 2024
384
- })
385
- )
386
- ]
387
- })
388
- )
389
- })
390
-
391
- it('sets Nunjucks component value when invalid', () => {
392
- const payload = getFormData({
393
- day: 'DD',
394
- month: 'MM',
395
- year: 'YYYY'
396
- })
397
-
398
- const viewModel = field.getViewModel(payload)
399
-
400
- expect(viewModel).toEqual(
401
- expect.objectContaining({
402
- items: [
403
- expect.objectContaining(
404
- getViewModel(date, 'day', { value: 'DD' })
405
- ),
406
-
407
- expect.objectContaining(
408
- getViewModel(date, 'month', { value: 'MM' })
409
- ),
410
-
411
- expect.objectContaining(
412
- getViewModel(date, 'year', { value: 'YYYY' })
413
- )
414
- ]
415
- })
416
- )
417
- })
418
-
419
- it('sets Nunjucks component fieldset', () => {
420
- const payload = getFormData(date)
421
- const viewModel = field.getViewModel(payload)
422
-
423
- expect(viewModel.fieldset).toEqual({
424
- legend: {
425
- text: def.title,
426
- classes: 'govuk-fieldset__legend--m'
427
- }
428
- })
429
- })
430
- })
431
-
432
- describe('AllPossibleErrors', () => {
433
- it('should return errors from instance method', () => {
434
- const errors = field.getAllPossibleErrors()
435
- expect(errors.baseErrors).not.toBeEmpty()
436
- expect(errors.advancedSettingsErrors).not.toBeEmpty()
437
- })
438
-
439
- it('should return errors from static method', () => {
440
- const staticErrors = (
441
- field.constructor as typeof field.constructor & {
442
- getAllPossibleErrors(): ErrorMessageTemplateList
443
- }
444
- ).getAllPossibleErrors()
445
- expect(staticErrors.baseErrors).not.toBeEmpty()
446
- expect(staticErrors.advancedSettingsErrors).not.toBeEmpty()
447
- })
448
-
449
- it('instance method should delegate to static method', () => {
450
- const staticResult = (
451
- field.constructor as typeof field.constructor & {
452
- getAllPossibleErrors(): ErrorMessageTemplateList
453
- }
454
- ).getAllPossibleErrors()
455
-
456
- const instanceResult = field.getAllPossibleErrors()
457
-
458
- expect(instanceResult).toEqual(staticResult)
459
- })
460
- })
461
- })
462
-
463
- describe('Validation', () => {
464
- const today = startOfDay(new Date())
465
- const date = new Date('2001-01-01')
466
-
467
- const OneDayInPast = addDays(today, -1)
468
- const TwoDaysInPast = addDays(today, -2)
469
- const OneDayInFuture = addDays(today, 1)
470
- const TwoDaysInFuture = addDays(today, 2)
471
-
472
- describe.each([
473
- {
474
- description: 'Trim empty spaces',
475
- component: {
476
- title: 'Example date parts field',
477
- name: 'myComponent',
478
- type: ComponentType.DatePartsField,
479
- options: {}
480
- } satisfies DatePartsFieldComponent,
481
- assertions: [
482
- {
483
- input: getFormData({
484
- day: ' 01',
485
- month: ' 01',
486
- year: ' 2001'
487
- }),
488
- output: {
489
- value: getFormData(date)
490
- }
491
- },
492
- {
493
- input: getFormData({
494
- day: '01 ',
495
- month: '01 ',
496
- year: '2001 '
497
- }),
498
- output: {
499
- value: getFormData(date)
500
- }
501
- },
502
- {
503
- input: getFormData({
504
- day: ' 01 \n\n',
505
- month: ' 01 \n\n',
506
- year: ' 2001 \n\n'
507
- }),
508
- output: {
509
- value: getFormData(date)
510
- }
511
- }
512
- ]
513
- },
514
- {
515
- description: 'Decimals',
516
- component: {
517
- title: 'Example date parts field',
518
- name: 'myComponent',
519
- type: ComponentType.DatePartsField,
520
- options: {}
521
- } satisfies DatePartsFieldComponent,
522
- assertions: [
523
- {
524
- input: getFormData({
525
- day: '1.1',
526
- month: '1.2',
527
- year: '2001.3'
528
- }),
529
- output: {
530
- value: getFormData({
531
- day: 1.1,
532
- month: 1.2,
533
- year: 2001.3
534
- }),
535
- errors: [
536
- expect.objectContaining({
537
- text: 'Example date parts field must be a real date'
538
- }),
539
- expect.objectContaining({
540
- text: 'Example date parts field must be a real date'
541
- }),
542
- expect.objectContaining({
543
- text: 'Example date parts field must be a real date'
544
- })
545
- ]
546
- }
547
- }
548
- ]
549
- },
550
- {
551
- description: 'Leap years',
552
- component: {
553
- title: 'Example date parts field',
554
- name: 'myComponent',
555
- type: ComponentType.DatePartsField,
556
- options: {}
557
- } satisfies DatePartsFieldComponent,
558
- assertions: [
559
- {
560
- // Leap year in 2024
561
- input: getFormData({
562
- day: '29',
563
- month: '2',
564
- year: '2024'
565
- }),
566
- output: {
567
- value: getFormData({
568
- day: 29,
569
- month: 2,
570
- year: 2024
571
- })
572
- }
573
- },
574
- {
575
- // Not a leap year in 2023
576
- input: getFormData({
577
- day: '29',
578
- month: '2',
579
- year: '2023'
580
- }),
581
- output: {
582
- value: getFormData({
583
- day: 29,
584
- month: 2,
585
- year: 2023
586
- }),
587
- errors: [
588
- expect.objectContaining({
589
- text: 'Example date parts field must be a real date'
590
- })
591
- ]
592
- }
593
- }
594
- ]
595
- },
596
- {
597
- description: 'Out of range values',
598
- component: {
599
- title: 'Example date parts field',
600
- name: 'myComponent',
601
- type: ComponentType.DatePartsField,
602
- options: {}
603
- } satisfies DatePartsFieldComponent,
604
- assertions: [
605
- {
606
- input: getFormData({
607
- day: '32',
608
- month: '1',
609
- year: '2024'
610
- }),
611
- output: {
612
- value: getFormData({
613
- day: 32,
614
- month: 1,
615
- year: 2024
616
- }),
617
- errors: [
618
- expect.objectContaining({
619
- text: 'Example date parts field must be a real date'
620
- })
621
- ]
622
- }
623
- },
624
- {
625
- input: getFormData({
626
- day: '1',
627
- month: '13',
628
- year: '2024'
629
- }),
630
- output: {
631
- value: getFormData({
632
- day: 1,
633
- month: 13,
634
- year: 2024
635
- }),
636
- errors: [
637
- expect.objectContaining({
638
- text: 'Example date parts field must be a real date'
639
- })
640
- ]
641
- }
642
- },
643
- {
644
- input: getFormData({
645
- day: '1',
646
- month: '1',
647
- year: '999'
648
- }),
649
- output: {
650
- value: getFormData({
651
- day: 1,
652
- month: 1,
653
- year: 999
654
- }),
655
- errors: [
656
- expect.objectContaining({
657
- text: 'Example date parts field must be a real date'
658
- })
659
- ]
660
- }
661
- }
662
- ]
663
- },
664
- {
665
- description: 'Impossible dates',
666
- component: {
667
- title: 'Example date parts field',
668
- name: 'myComponent',
669
- type: ComponentType.DatePartsField,
670
- options: {}
671
- } satisfies DatePartsFieldComponent,
672
- assertions: [
673
- {
674
- input: getFormData({
675
- day: '31',
676
- month: '4',
677
- year: '2024'
678
- }),
679
- output: {
680
- value: getFormData({
681
- day: 31,
682
- month: 4,
683
- year: 2024
684
- }),
685
- errors: [
686
- expect.objectContaining({
687
- text: 'Example date parts field must be a real date'
688
- })
689
- ]
690
- }
691
- },
692
- {
693
- input: getFormData({
694
- day: '31',
695
- month: '6',
696
- year: '2024'
697
- }),
698
- output: {
699
- value: getFormData({
700
- day: 31,
701
- month: 6,
702
- year: 2024
703
- }),
704
- errors: [
705
- expect.objectContaining({
706
- text: 'Example date parts field must be a real date'
707
- })
708
- ]
709
- }
710
- }
711
- ]
712
- },
713
- {
714
- description: 'Max days in the past option',
715
- component: {
716
- title: 'Example date parts field',
717
- name: 'myComponent',
718
- type: ComponentType.DatePartsField,
719
- options: {
720
- maxDaysInPast: 1
721
- }
722
- } satisfies DatePartsFieldComponent,
723
- assertions: [
724
- {
725
- input: getFormData(TwoDaysInPast),
726
- output: {
727
- value: getFormData(TwoDaysInPast),
728
- errors: [
729
- expect.objectContaining({
730
- text: `Example date parts field must be the same as or after ${format(OneDayInPast, 'd MMMM yyyy')}`
731
- })
732
- ]
733
- }
734
- },
735
- {
736
- input: getFormData(today),
737
- output: { value: getFormData(today) }
738
- }
739
- ]
740
- },
741
- {
742
- description: 'Max days in the future option',
743
- component: {
744
- title: 'Example date parts field',
745
- name: 'myComponent',
746
- type: ComponentType.DatePartsField,
747
- options: {
748
- maxDaysInFuture: 1
749
- }
750
- } satisfies DatePartsFieldComponent,
751
- assertions: [
752
- {
753
- input: getFormData(TwoDaysInFuture),
754
- output: {
755
- value: getFormData(TwoDaysInFuture),
756
- errors: [
757
- expect.objectContaining({
758
- text: `Example date parts field must be the same as or before ${format(OneDayInFuture, 'd MMMM yyyy')}`
759
- })
760
- ]
761
- }
762
- },
763
- {
764
- input: getFormData(today),
765
- output: { value: getFormData(today) }
766
- }
767
- ]
768
- },
769
- {
770
- description: 'Max days in the future of zero',
771
- component: {
772
- title: 'Example date parts field',
773
- name: 'myComponent',
774
- type: ComponentType.DatePartsField,
775
- options: {
776
- maxDaysInFuture: 0
777
- }
778
- } satisfies DatePartsFieldComponent,
779
- assertions: [
780
- {
781
- input: getFormData(OneDayInFuture),
782
- output: {
783
- value: getFormData(OneDayInFuture),
784
- errors: [
785
- expect.objectContaining({
786
- text: `Example date parts field must be the same as or before ${format(today, 'd MMMM yyyy')}`
787
- })
788
- ]
789
- }
790
- },
791
- {
792
- input: getFormData(today),
793
- output: { value: getFormData(today) }
794
- }
795
- ]
796
- },
797
- {
798
- description: 'Max days in the past of zero',
799
- component: {
800
- title: 'Example date parts field',
801
- name: 'myComponent',
802
- type: ComponentType.DatePartsField,
803
- options: {
804
- maxDaysInPast: 0
805
- }
806
- } satisfies DatePartsFieldComponent,
807
- assertions: [
808
- {
809
- input: getFormData(OneDayInPast),
810
- output: {
811
- value: getFormData(OneDayInPast),
812
- errors: [
813
- expect.objectContaining({
814
- text: `Example date parts field must be the same as or after ${format(today, 'd MMMM yyyy')}`
815
- })
816
- ]
817
- }
818
- },
819
- {
820
- input: getFormData(today),
821
- output: { value: getFormData(today) }
822
- }
823
- ]
824
- },
825
- {
826
- description: 'Optional fields',
827
- component: {
828
- title: 'Example date parts field',
829
- name: 'myComponent',
830
- type: ComponentType.DatePartsField,
831
- options: {
832
- required: false
833
- }
834
- } satisfies DatePartsFieldComponent,
835
- assertions: [
836
- {
837
- input: getFormData({
838
- day: '',
839
- month: '',
840
- year: ''
841
- }),
842
- output: {
843
- value: getFormData({
844
- day: '',
845
- month: '',
846
- year: ''
847
- })
848
- }
849
- }
850
- ]
851
- }
852
- ])('$description', ({ component: def, assertions }) => {
853
- let collection: ComponentCollection
854
-
855
- beforeEach(() => {
856
- collection = new ComponentCollection([def], { model })
857
- })
858
-
859
- it.each([...assertions])(
860
- 'validates custom example',
861
- ({ input, output }) => {
862
- const result = collection.validate(input)
863
- expect(result).toEqual(output)
864
- }
865
- )
866
- })
867
- })
868
- })
869
-
870
- /**
871
- * Date field view model
872
- */
873
- function getViewModel(
874
- date: Date,
875
- name: string,
876
- overrides?: Partial<DateInputItem>
877
- ): DateInputItem {
878
- const payload = getFormData(date)
879
-
880
- const fieldName = `myComponent__${name}`
881
- const fieldValue = overrides?.value ?? payload[fieldName]
882
- const fieldClasses = overrides?.classes ?? expect.any(String)
883
-
884
- return {
885
- label: expect.objectContaining(
886
- overrides?.label ?? {
887
- text: expect.any(String)
888
- }
889
- ),
890
- name: fieldName,
891
- id: fieldName,
892
- value: fieldValue as DateInputItem['value'],
893
- classes: fieldClasses
894
- }
895
- }
896
-
897
- /**
898
- * Date form data
899
- */
900
- function getFormData(date: Date | FormPayload): FormPayload {
901
- if (date instanceof Date) {
902
- date = {
903
- day: date.getDate(),
904
- month: date.getMonth() + 1,
905
- year: date.getFullYear()
906
- }
907
- }
908
-
909
- return {
910
- myComponent__day: date.day,
911
- myComponent__month: date.month,
912
- myComponent__year: date.year
913
- }
914
- }
915
-
916
- /**
917
- * Date session state
918
- */
919
- function getFormState(date: Date | FormPayload): FormState {
920
- const [day, month, year] = Object.values(getFormData(date))
921
-
922
- return {
923
- myComponent__day: day ?? null,
924
- myComponent__month: month ?? null,
925
- myComponent__year: year ?? null
926
- }
927
- }