@defra/forms-engine-plugin 4.7.2 → 4.8.0

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 (407) hide show
  1. package/.public/javascripts/shared.min.js +1 -1
  2. package/.public/javascripts/shared.min.js.map +1 -1
  3. package/.server/client/javascripts/geospatial-map.d.ts +6 -6
  4. package/.server/client/javascripts/geospatial-map.js +3 -3
  5. package/.server/client/javascripts/location-map.d.ts +1 -1
  6. package/.server/client/javascripts/location-map.js +1 -1
  7. package/.server/client/javascripts/map.d.ts +5 -1
  8. package/.server/client/javascripts/map.js +10 -2
  9. package/.server/client/javascripts/map.js.map +1 -1
  10. package/.server/client/javascripts/shared.d.ts +7 -7
  11. package/.server/server/index.d.ts +1 -1
  12. package/.server/server/plugins/crumb.d.ts +1 -1
  13. package/.server/server/plugins/engine/beta/form-context.d.ts +6 -6
  14. package/.server/server/plugins/engine/components/AutocompleteField.d.ts +4 -4
  15. package/.server/server/plugins/engine/components/CheckboxesField.d.ts +2 -2
  16. package/.server/server/plugins/engine/components/CheckboxesField.js +2 -2
  17. package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
  18. package/.server/server/plugins/engine/components/ComponentBase.d.ts +5 -5
  19. package/.server/server/plugins/engine/components/ComponentCollection.d.ts +8 -8
  20. package/.server/server/plugins/engine/components/DatePartsField.d.ts +11 -11
  21. package/.server/server/plugins/engine/components/DeclarationField.d.ts +3 -3
  22. package/.server/server/plugins/engine/components/Details.d.ts +1 -1
  23. package/.server/server/plugins/engine/components/EastingNorthingField.d.ts +22 -22
  24. package/.server/server/plugins/engine/components/EmailAddressField.d.ts +4 -4
  25. package/.server/server/plugins/engine/components/FileUploadField.d.ts +3 -3
  26. package/.server/server/plugins/engine/components/FormComponent.d.ts +10 -10
  27. package/.server/server/plugins/engine/components/GeospatialField.d.ts +6 -6
  28. package/.server/server/plugins/engine/components/HiddenField.d.ts +2 -2
  29. package/.server/server/plugins/engine/components/Html.d.ts +1 -1
  30. package/.server/server/plugins/engine/components/InsetText.d.ts +1 -1
  31. package/.server/server/plugins/engine/components/LatLongField.d.ts +22 -22
  32. package/.server/server/plugins/engine/components/List.d.ts +8 -8
  33. package/.server/server/plugins/engine/components/ListFormComponent.d.ts +10 -10
  34. package/.server/server/plugins/engine/components/LocationFieldBase.d.ts +6 -6
  35. package/.server/server/plugins/engine/components/LocationFieldHelpers.d.ts +14 -14
  36. package/.server/server/plugins/engine/components/Markdown.d.ts +1 -1
  37. package/.server/server/plugins/engine/components/MonthYearField.d.ts +11 -11
  38. package/.server/server/plugins/engine/components/MultilineTextField.d.ts +5 -5
  39. package/.server/server/plugins/engine/components/NationalGridFieldNumberField.d.ts +1 -1
  40. package/.server/server/plugins/engine/components/NumberField.d.ts +3 -3
  41. package/.server/server/plugins/engine/components/OsGridRefField.d.ts +1 -1
  42. package/.server/server/plugins/engine/components/PaymentField.d.ts +12 -12
  43. package/.server/server/plugins/engine/components/RadiosField.d.ts +1 -1
  44. package/.server/server/plugins/engine/components/SelectField.d.ts +4 -4
  45. package/.server/server/plugins/engine/components/SelectionControlField.d.ts +10 -10
  46. package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +4 -4
  47. package/.server/server/plugins/engine/components/TextField.d.ts +2 -2
  48. package/.server/server/plugins/engine/components/UkAddressField.d.ts +11 -11
  49. package/.server/server/plugins/engine/components/YesNoField.d.ts +2 -2
  50. package/.server/server/plugins/engine/components/helpers/__stubs__/geospatial.d.ts +1 -1
  51. package/.server/server/plugins/engine/components/helpers/components.d.ts +5 -5
  52. package/.server/server/plugins/engine/components/helpers/geospatial.d.ts +1 -1
  53. package/.server/server/plugins/engine/components/index.d.ts +27 -27
  54. package/.server/server/plugins/engine/components/types.d.ts +1 -1
  55. package/.server/server/plugins/engine/configureEnginePlugin.d.ts +4 -4
  56. package/.server/server/plugins/engine/date-helper.d.ts +1 -1
  57. package/.server/server/plugins/engine/helpers.d.ts +8 -8
  58. package/.server/server/plugins/engine/index.d.ts +5 -5
  59. package/.server/server/plugins/engine/models/FormModel.d.ts +6 -6
  60. package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +6 -6
  61. package/.server/server/plugins/engine/models/index.d.ts +2 -2
  62. package/.server/server/plugins/engine/models/types.d.ts +4 -4
  63. package/.server/server/plugins/engine/options.d.ts +1 -1
  64. package/.server/server/plugins/engine/options.js +1 -1
  65. package/.server/server/plugins/engine/options.test.js +1 -1
  66. package/.server/server/plugins/engine/outputFormatters/adapter/v1.d.ts +4 -4
  67. package/.server/server/plugins/engine/outputFormatters/human/v1.d.ts +4 -4
  68. package/.server/server/plugins/engine/outputFormatters/index.d.ts +5 -5
  69. package/.server/server/plugins/engine/outputFormatters/machine/v1.d.ts +4 -4
  70. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +4 -4
  71. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +8 -8
  72. package/.server/server/plugins/engine/pageControllers/PageController.d.ts +6 -6
  73. package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +8 -8
  74. package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +5 -5
  75. package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +4 -4
  76. package/.server/server/plugins/engine/pageControllers/StatusPageController.d.ts +4 -4
  77. package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +5 -5
  78. package/.server/server/plugins/engine/pageControllers/TerminalPageController.d.ts +3 -3
  79. package/.server/server/plugins/engine/pageControllers/__stubs__/request.d.ts +2 -2
  80. package/.server/server/plugins/engine/pageControllers/errors.d.ts +1 -1
  81. package/.server/server/plugins/engine/pageControllers/helpers/pages.d.ts +2 -2
  82. package/.server/server/plugins/engine/pageControllers/helpers/state.d.ts +5 -5
  83. package/.server/server/plugins/engine/pageControllers/helpers/state.js +1 -1
  84. package/.server/server/plugins/engine/pageControllers/helpers/state.js.map +1 -1
  85. package/.server/server/plugins/engine/pageControllers/helpers/submission.d.ts +1 -1
  86. package/.server/server/plugins/engine/pageControllers/index.d.ts +7 -7
  87. package/.server/server/plugins/engine/plugin.d.ts +1 -1
  88. package/.server/server/plugins/engine/routes/file-upload.d.ts +1 -1
  89. package/.server/server/plugins/engine/routes/index.d.ts +3 -3
  90. package/.server/server/plugins/engine/routes/payment-helper.d.ts +3 -3
  91. package/.server/server/plugins/engine/routes/payment-helper.js +2 -2
  92. package/.server/server/plugins/engine/routes/payment.js +5 -5
  93. package/.server/server/plugins/engine/routes/payment.test.js +1 -1
  94. package/.server/server/plugins/engine/routes/questions.d.ts +2 -2
  95. package/.server/server/plugins/engine/routes/repeaters/item-delete.d.ts +2 -2
  96. package/.server/server/plugins/engine/routes/repeaters/summary.d.ts +2 -2
  97. package/.server/server/plugins/engine/services/index.d.ts +3 -3
  98. package/.server/server/plugins/engine/services/notifyService.d.ts +4 -4
  99. package/.server/server/plugins/engine/services/uploadService.d.ts +2 -2
  100. package/.server/server/plugins/engine/services/uploadService.js +1 -1
  101. package/.server/server/plugins/engine/types/index.d.ts +10 -10
  102. package/.server/server/plugins/engine/types/schema.d.ts +1 -1
  103. package/.server/server/plugins/engine/types.d.ts +25 -16
  104. package/.server/server/plugins/engine/types.js.map +1 -1
  105. package/.server/server/plugins/engine/validationHelpers.d.ts +2 -2
  106. package/.server/server/plugins/engine/vision.d.ts +1 -1
  107. package/.server/server/plugins/map/index.d.ts +1 -1
  108. package/.server/server/plugins/map/index.js +1 -1
  109. package/.server/server/plugins/map/routes/get-os-token.d.ts +11 -1
  110. package/.server/server/plugins/map/routes/get-os-token.js +12 -2
  111. package/.server/server/plugins/map/routes/get-os-token.js.map +1 -1
  112. package/.server/server/plugins/map/routes/index.d.ts +4 -4
  113. package/.server/server/plugins/map/routes/index.js +3 -2
  114. package/.server/server/plugins/map/routes/index.js.map +1 -1
  115. package/.server/server/plugins/map/routes/vts/esri-aerial.json +23 -0
  116. package/.server/server/plugins/map/service.d.ts +1 -1
  117. package/.server/server/plugins/map/service.js +5 -2
  118. package/.server/server/plugins/map/service.js.map +1 -1
  119. package/.server/server/plugins/map/test/__stubs__/find.d.ts +1 -1
  120. package/.server/server/plugins/map/test/__stubs__/find.js +1 -1
  121. package/.server/server/plugins/nunjucks/context.d.ts +2 -2
  122. package/.server/server/plugins/nunjucks/context.js +2 -2
  123. package/.server/server/plugins/nunjucks/context.test.js +1 -1
  124. package/.server/server/plugins/nunjucks/enviroment.test.js +1 -1
  125. package/.server/server/plugins/nunjucks/environment.d.ts +3 -3
  126. package/.server/server/plugins/nunjucks/environment.js +3 -3
  127. package/.server/server/plugins/nunjucks/filters/answer.d.ts +1 -1
  128. package/.server/server/plugins/nunjucks/filters/answer.js +2 -2
  129. package/.server/server/plugins/nunjucks/filters/answer.test.js +1 -1
  130. package/.server/server/plugins/nunjucks/filters/evaluate.d.ts +1 -1
  131. package/.server/server/plugins/nunjucks/filters/evaluate.js +1 -1
  132. package/.server/server/plugins/nunjucks/filters/field.d.ts +1 -1
  133. package/.server/server/plugins/nunjucks/filters/field.js +1 -1
  134. package/.server/server/plugins/nunjucks/filters/field.test.js +1 -1
  135. package/.server/server/plugins/nunjucks/filters/href.d.ts +1 -1
  136. package/.server/server/plugins/nunjucks/filters/href.js +1 -1
  137. package/.server/server/plugins/nunjucks/filters/href.test.js +1 -1
  138. package/.server/server/plugins/nunjucks/filters/index.d.ts +8 -8
  139. package/.server/server/plugins/nunjucks/filters/page.d.ts +1 -1
  140. package/.server/server/plugins/nunjucks/filters/page.js +1 -1
  141. package/.server/server/plugins/nunjucks/filters/page.test.js +1 -1
  142. package/.server/server/plugins/nunjucks/index.d.ts +3 -3
  143. package/.server/server/plugins/nunjucks/render.d.ts +2 -2
  144. package/.server/server/plugins/nunjucks/render.js +1 -1
  145. package/.server/server/plugins/nunjucks/types.d.ts +1 -1
  146. package/.server/server/plugins/nunjucks/types.js +1 -1
  147. package/.server/server/plugins/payment/helper.d.ts +2 -2
  148. package/.server/server/plugins/payment/helper.js +1 -1
  149. package/.server/server/plugins/payment/service.d.ts +3 -3
  150. package/.server/server/plugins/payment/service.js +1 -1
  151. package/.server/server/plugins/postcode-lookup/index.d.ts +1 -1
  152. package/.server/server/plugins/postcode-lookup/index.js +1 -1
  153. package/.server/server/plugins/postcode-lookup/models/index.d.ts +6 -6
  154. package/.server/server/plugins/postcode-lookup/models/index.js +1 -1
  155. package/.server/server/plugins/postcode-lookup/routes/index.d.ts +6 -6
  156. package/.server/server/plugins/postcode-lookup/routes/index.js +15 -15
  157. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  158. package/.server/server/plugins/postcode-lookup/service.d.ts +1 -1
  159. package/.server/server/plugins/postcode-lookup/service.js +5 -2
  160. package/.server/server/plugins/postcode-lookup/service.js.map +1 -1
  161. package/.server/server/plugins/postcode-lookup/types.js +1 -1
  162. package/.server/server/routes/index.d.ts +2 -2
  163. package/.server/server/routes/types.d.ts +1 -1
  164. package/.server/server/schemas/index.d.ts +2 -2
  165. package/.server/server/services/cacheService.d.ts +8 -8
  166. package/.server/server/services/cacheService.js +2 -5
  167. package/.server/server/services/cacheService.js.map +1 -1
  168. package/.server/server/services/httpService.test.js +1 -1
  169. package/.server/server/services/index.d.ts +1 -1
  170. package/.server/server/types.d.ts +7 -7
  171. package/.server/server/utils/file-form-service.d.ts +2 -2
  172. package/.server/server/utils/file-form-service.js +1 -1
  173. package/package.json +8 -4
  174. package/src/client/javascripts/application.js +1 -1
  175. package/src/client/javascripts/geospatial-map.js +4 -4
  176. package/src/client/javascripts/location-map.js +2 -2
  177. package/src/client/javascripts/map.js +13 -4
  178. package/src/client/javascripts/shared.js +7 -7
  179. package/src/index.ts +3 -3
  180. package/src/server/common/helpers/logging/logger-options.ts +1 -1
  181. package/src/server/common/helpers/logging/logger.ts +1 -1
  182. package/src/server/common/helpers/logging/request-logger.ts +1 -1
  183. package/src/server/common/helpers/logging/request-tracing.js +1 -1
  184. package/src/server/common/helpers/redis-client.js +2 -2
  185. package/src/server/index.ts +13 -13
  186. package/src/server/plugins/crumb.ts +2 -2
  187. package/src/server/plugins/engine/beta/form-context.ts +9 -9
  188. package/src/server/plugins/engine/components/AutocompleteField.ts +3 -3
  189. package/src/server/plugins/engine/components/CheckboxesField.ts +7 -8
  190. package/src/server/plugins/engine/components/ComponentBase.ts +5 -5
  191. package/src/server/plugins/engine/components/ComponentCollection.ts +9 -9
  192. package/src/server/plugins/engine/components/DatePartsField.ts +8 -8
  193. package/src/server/plugins/engine/components/DeclarationField.ts +3 -3
  194. package/src/server/plugins/engine/components/Details.ts +1 -1
  195. package/src/server/plugins/engine/components/EastingNorthingField.ts +9 -9
  196. package/src/server/plugins/engine/components/EmailAddressField.ts +3 -3
  197. package/src/server/plugins/engine/components/FileUploadField.ts +6 -6
  198. package/src/server/plugins/engine/components/FormComponent.ts +4 -4
  199. package/src/server/plugins/engine/components/GeospatialField.ts +5 -5
  200. package/src/server/plugins/engine/components/HiddenField.ts +4 -4
  201. package/src/server/plugins/engine/components/Html.ts +1 -1
  202. package/src/server/plugins/engine/components/InsetText.ts +1 -1
  203. package/src/server/plugins/engine/components/LatLongField.ts +9 -9
  204. package/src/server/plugins/engine/components/List.ts +2 -2
  205. package/src/server/plugins/engine/components/ListFormComponent.ts +4 -4
  206. package/src/server/plugins/engine/components/LocationFieldBase.ts +5 -5
  207. package/src/server/plugins/engine/components/LocationFieldHelpers.ts +5 -5
  208. package/src/server/plugins/engine/components/Markdown.ts +1 -1
  209. package/src/server/plugins/engine/components/MonthYearField.ts +8 -8
  210. package/src/server/plugins/engine/components/MultilineTextField.ts +4 -4
  211. package/src/server/plugins/engine/components/NationalGridFieldNumberField.ts +2 -2
  212. package/src/server/plugins/engine/components/NumberField.ts +3 -3
  213. package/src/server/plugins/engine/components/OsGridRefField.ts +2 -2
  214. package/src/server/plugins/engine/components/PaymentField.ts +8 -8
  215. package/src/server/plugins/engine/components/RadiosField.ts +1 -1
  216. package/src/server/plugins/engine/components/SelectField.ts +2 -2
  217. package/src/server/plugins/engine/components/SelectionControlField.ts +4 -4
  218. package/src/server/plugins/engine/components/TelephoneNumberField.ts +4 -4
  219. package/src/server/plugins/engine/components/TextField.ts +3 -3
  220. package/src/server/plugins/engine/components/UkAddressField.ts +7 -7
  221. package/src/server/plugins/engine/components/YesNoField.ts +5 -5
  222. package/src/server/plugins/engine/components/helpers/__stubs__/geospatial.ts +1 -1
  223. package/src/server/plugins/engine/components/helpers/components.ts +8 -8
  224. package/src/server/plugins/engine/components/helpers/geospatial.ts +1 -1
  225. package/src/server/plugins/engine/components/index.ts +27 -27
  226. package/src/server/plugins/engine/components/types.ts +1 -1
  227. package/src/server/plugins/engine/configureEnginePlugin.ts +10 -10
  228. package/src/server/plugins/engine/date-helper.ts +1 -1
  229. package/src/server/plugins/engine/helpers.ts +8 -8
  230. package/src/server/plugins/engine/index.ts +8 -8
  231. package/src/server/plugins/engine/models/FormModel.ts +15 -15
  232. package/src/server/plugins/engine/models/SummaryViewModel.ts +10 -10
  233. package/src/server/plugins/engine/models/index.ts +2 -2
  234. package/src/server/plugins/engine/models/types.ts +4 -4
  235. package/src/server/plugins/engine/options.js +3 -3
  236. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +6 -6
  237. package/src/server/plugins/engine/outputFormatters/human/v1.ts +9 -9
  238. package/src/server/plugins/engine/outputFormatters/index.ts +8 -8
  239. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +7 -7
  240. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +6 -6
  241. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +9 -9
  242. package/src/server/plugins/engine/pageControllers/PageController.ts +7 -7
  243. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +13 -13
  244. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +6 -6
  245. package/src/server/plugins/engine/pageControllers/StartPageController.ts +3 -3
  246. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +5 -5
  247. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +12 -12
  248. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +3 -3
  249. package/src/server/plugins/engine/pageControllers/__stubs__/request.ts +3 -3
  250. package/src/server/plugins/engine/pageControllers/__stubs__/server.ts +2 -2
  251. package/src/server/plugins/engine/pageControllers/errors.ts +1 -1
  252. package/src/server/plugins/engine/pageControllers/helpers/pages.ts +2 -2
  253. package/src/server/plugins/engine/pageControllers/helpers/state.ts +9 -9
  254. package/src/server/plugins/engine/pageControllers/helpers/submission.ts +5 -5
  255. package/src/server/plugins/engine/pageControllers/index.ts +7 -7
  256. package/src/server/plugins/engine/pageControllers/validationOptions.ts +1 -1
  257. package/src/server/plugins/engine/plugin.ts +14 -14
  258. package/src/server/plugins/engine/routes/file-upload.ts +2 -2
  259. package/src/server/plugins/engine/routes/index.ts +10 -10
  260. package/src/server/plugins/engine/routes/payment-helper.js +4 -4
  261. package/src/server/plugins/engine/routes/payment.js +9 -9
  262. package/src/server/plugins/engine/routes/questions.ts +10 -10
  263. package/src/server/plugins/engine/routes/repeaters/item-delete.ts +6 -6
  264. package/src/server/plugins/engine/routes/repeaters/summary.ts +5 -5
  265. package/src/server/plugins/engine/services/formSubmissionService.js +2 -2
  266. package/src/server/plugins/engine/services/index.js +3 -3
  267. package/src/server/plugins/engine/services/localFormsService.js +2 -2
  268. package/src/server/plugins/engine/services/notifyService.ts +9 -9
  269. package/src/server/plugins/engine/services/uploadService.js +3 -3
  270. package/src/server/plugins/engine/types/index.ts +10 -10
  271. package/src/server/plugins/engine/types/schema.ts +2 -2
  272. package/src/server/plugins/engine/types.ts +22 -17
  273. package/src/server/plugins/engine/validationHelpers.ts +3 -3
  274. package/src/server/plugins/engine/vision.ts +3 -3
  275. package/src/server/plugins/map/index.js +2 -2
  276. package/src/server/plugins/map/routes/get-os-token.js +15 -3
  277. package/src/server/plugins/map/routes/index.js +7 -5
  278. package/src/server/plugins/map/routes/vts/esri-aerial.json +23 -0
  279. package/src/server/plugins/map/service.js +7 -4
  280. package/src/server/plugins/map/test/__stubs__/find.js +1 -1
  281. package/src/server/plugins/nunjucks/context.js +5 -5
  282. package/src/server/plugins/nunjucks/environment.js +6 -6
  283. package/src/server/plugins/nunjucks/filters/answer.js +3 -3
  284. package/src/server/plugins/nunjucks/filters/evaluate.js +2 -2
  285. package/src/server/plugins/nunjucks/filters/field.js +1 -1
  286. package/src/server/plugins/nunjucks/filters/href.js +2 -2
  287. package/src/server/plugins/nunjucks/filters/index.js +8 -8
  288. package/src/server/plugins/nunjucks/filters/page.js +1 -1
  289. package/src/server/plugins/nunjucks/index.js +3 -3
  290. package/src/server/plugins/nunjucks/plugin.js +3 -3
  291. package/src/server/plugins/nunjucks/render.js +2 -2
  292. package/src/server/plugins/nunjucks/types.js +1 -1
  293. package/src/server/plugins/payment/helper.js +2 -2
  294. package/src/server/plugins/payment/service.js +4 -4
  295. package/src/server/plugins/postcode-lookup/index.js +2 -2
  296. package/src/server/plugins/postcode-lookup/models/index.js +3 -3
  297. package/src/server/plugins/postcode-lookup/routes/index.js +24 -14
  298. package/src/server/plugins/postcode-lookup/service.js +7 -4
  299. package/src/server/plugins/postcode-lookup/types.js +1 -1
  300. package/src/server/plugins/session.ts +1 -1
  301. package/src/server/routes/index.ts +2 -2
  302. package/src/server/routes/public.ts +1 -1
  303. package/src/server/routes/types.ts +1 -1
  304. package/src/server/schemas/index.ts +2 -2
  305. package/src/server/secure-context.js +1 -1
  306. package/src/server/services/cacheService.ts +13 -18
  307. package/src/server/services/httpService.ts +1 -1
  308. package/src/server/services/index.ts +1 -1
  309. package/src/server/types.ts +7 -7
  310. package/src/server/utils/notify.ts +2 -2
  311. package/src/server/utils/utils.js +1 -1
  312. package/src/typings/hapi/index.d.ts +4 -4
  313. package/src/typings/joi/index.d.ts +1 -1
  314. package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
  315. package/src/server/index.test.ts +0 -644
  316. package/src/server/plugins/engine/beta/form-context.test.ts +0 -373
  317. package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -362
  318. package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -486
  319. package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -927
  320. package/src/server/plugins/engine/components/DeclarationField.test.ts +0 -560
  321. package/src/server/plugins/engine/components/Details.test.ts +0 -49
  322. package/src/server/plugins/engine/components/EastingNorthingField.test.ts +0 -727
  323. package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -445
  324. package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -1079
  325. package/src/server/plugins/engine/components/GeospatialField.test.ts +0 -380
  326. package/src/server/plugins/engine/components/HiddenField.test.ts +0 -188
  327. package/src/server/plugins/engine/components/Html.test.ts +0 -48
  328. package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
  329. package/src/server/plugins/engine/components/LatLongField.test.ts +0 -898
  330. package/src/server/plugins/engine/components/List.test.ts +0 -79
  331. package/src/server/plugins/engine/components/LocationFieldBase.test.ts +0 -253
  332. package/src/server/plugins/engine/components/LocationFieldHelpers.test.ts +0 -743
  333. package/src/server/plugins/engine/components/Markdown.test.ts +0 -48
  334. package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -617
  335. package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -647
  336. package/src/server/plugins/engine/components/NationalGridFieldNumberField.test.ts +0 -449
  337. package/src/server/plugins/engine/components/NumberField.test.ts +0 -723
  338. package/src/server/plugins/engine/components/OsGridRefField.test.ts +0 -460
  339. package/src/server/plugins/engine/components/PaymentField.test.ts +0 -745
  340. package/src/server/plugins/engine/components/RadiosField.test.ts +0 -297
  341. package/src/server/plugins/engine/components/SelectField.test.ts +0 -289
  342. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -384
  343. package/src/server/plugins/engine/components/TextField.test.ts +0 -521
  344. package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -806
  345. package/src/server/plugins/engine/components/YesNoField.test.ts +0 -256
  346. package/src/server/plugins/engine/components/helpers/components.test.ts +0 -399
  347. package/src/server/plugins/engine/components/helpers/geospatial.test.js +0 -55
  348. package/src/server/plugins/engine/components/helpers/helpers.test.ts +0 -219
  349. package/src/server/plugins/engine/date-helper.test.ts +0 -47
  350. package/src/server/plugins/engine/helpers.test.ts +0 -868
  351. package/src/server/plugins/engine/models/FormModel.test.ts +0 -725
  352. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -472
  353. package/src/server/plugins/engine/options.test.js +0 -63
  354. package/src/server/plugins/engine/outputFormatters/adapter/v1.location.test.ts +0 -356
  355. package/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +0 -871
  356. package/src/server/plugins/engine/outputFormatters/human/v1.payment.test.ts +0 -147
  357. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -145
  358. package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
  359. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -268
  360. package/src/server/plugins/engine/outputFormatters/machine/v2.location.test.ts +0 -341
  361. package/src/server/plugins/engine/outputFormatters/machine/v2.payment.test.ts +0 -115
  362. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -311
  363. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1372
  364. package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -246
  365. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1686
  366. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -279
  367. package/src/server/plugins/engine/pageControllers/StartPageController.test.ts +0 -32
  368. package/src/server/plugins/engine/pageControllers/StatusPageController.test.ts +0 -32
  369. package/src/server/plugins/engine/pageControllers/SummaryPageController.test.ts +0 -89
  370. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -37
  371. package/src/server/plugins/engine/pageControllers/errors.test.ts +0 -78
  372. package/src/server/plugins/engine/pageControllers/helpers/helpers.test.ts +0 -182
  373. package/src/server/plugins/engine/pageControllers/helpers/state.test.ts +0 -359
  374. package/src/server/plugins/engine/pageControllers/helpers/submission.test.ts +0 -373
  375. package/src/server/plugins/engine/referenceNumbers.test.ts +0 -74
  376. package/src/server/plugins/engine/routes/index.test.ts +0 -332
  377. package/src/server/plugins/engine/routes/payment-helper.test.js +0 -136
  378. package/src/server/plugins/engine/routes/payment.test.js +0 -180
  379. package/src/server/plugins/engine/routes/questions.test.ts +0 -502
  380. package/src/server/plugins/engine/routes/repeaters/item-delete.test.ts +0 -83
  381. package/src/server/plugins/engine/routes/repeaters/summary.test.ts +0 -75
  382. package/src/server/plugins/engine/services/formsService.test.js +0 -26
  383. package/src/server/plugins/engine/services/notifyService.test.ts +0 -310
  384. package/src/server/plugins/engine/types/schema.test.ts +0 -234
  385. package/src/server/plugins/engine/views/components/service-banner/template.test.js +0 -43
  386. package/src/server/plugins/engine/views/components/tag-env/template.test.js +0 -28
  387. package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
  388. package/src/server/plugins/map/routes/get-os-token.test.js +0 -55
  389. package/src/server/plugins/map/service.test.js +0 -144
  390. package/src/server/plugins/nunjucks/context.test.js +0 -109
  391. package/src/server/plugins/nunjucks/enviroment.test.js +0 -207
  392. package/src/server/plugins/nunjucks/filters/answer.test.js +0 -92
  393. package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
  394. package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
  395. package/src/server/plugins/nunjucks/filters/merge.test.js +0 -15
  396. package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
  397. package/src/server/plugins/payment/helper.test.js +0 -29
  398. package/src/server/plugins/payment/service.test.js +0 -218
  399. package/src/server/plugins/postcode-lookup/service.test.js +0 -177
  400. package/src/server/postcode-lookup.test.ts +0 -64
  401. package/src/server/routes/dummy-api.test.ts +0 -97
  402. package/src/server/services/cacheService.test.ts +0 -308
  403. package/src/server/services/httpService.test.js +0 -491
  404. package/src/server/utils/file-form-service.test.js +0 -127
  405. package/src/server/utils/notify.test.ts +0 -37
  406. package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
  407. package/src/server/utils/utils.test.js +0 -69
@@ -1,868 +0,0 @@
1
- import {
2
- ComponentType,
3
- type FormDefinition,
4
- type PageQuestion
5
- } from '@defra/forms-model'
6
- import Boom from '@hapi/boom'
7
- import { type ResponseObject, type ResponseToolkit } from '@hapi/hapi'
8
- import { StatusCodes } from 'http-status-codes'
9
- import { ValidationError } from 'joi'
10
-
11
- import {
12
- checkEmailAddressForLiveFormSubmission,
13
- checkFormStatus,
14
- encodeUrl,
15
- engine,
16
- evaluateTemplate,
17
- getErrors,
18
- getExponentialBackoffDelay,
19
- getPageHref,
20
- proceed,
21
- setPageTitles,
22
- type GlobalScope
23
- } from '~/src/server/plugins/engine/helpers.js'
24
- import { handleLegacyRedirect } from '~/src/server/plugins/engine/helpers.js'
25
- import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
26
- import { buildFormContextRequest } from '~/src/server/plugins/engine/pageControllers/__stubs__/request.js'
27
- import {
28
- createPage,
29
- type PageControllerClass
30
- } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'
31
- import {
32
- type FormContext,
33
- type FormContextRequest
34
- } from '~/src/server/plugins/engine/types.js'
35
- import {
36
- FormAction,
37
- FormStatus,
38
- type FormResponseToolkit
39
- } from '~/src/server/routes/types.js'
40
- import definition from '~/test/form/definitions/basic.js'
41
- import templateDefinition from '~/test/form/definitions/templates.js'
42
-
43
- interface NunjucksContext {
44
- context: {
45
- globals: GlobalScope
46
- }
47
- }
48
-
49
- type EvaluateFilter = (this: NunjucksContext, template: unknown) => unknown
50
- type HrefFilter = (this: NunjucksContext, path: string) => string | undefined
51
-
52
- describe('Helpers', () => {
53
- let page: PageControllerClass
54
- let request: FormContextRequest
55
- let h: FormResponseToolkit
56
-
57
- beforeEach(() => {
58
- jest.clearAllMocks()
59
- const model = new FormModel(definition, {
60
- basePath: 'test'
61
- })
62
-
63
- page = createPage(model, definition.pages[0])
64
- const pageUrl = new URL(page.href, 'http://example.com')
65
-
66
- request = buildFormContextRequest({
67
- method: 'get',
68
- url: pageUrl,
69
- path: pageUrl.pathname,
70
- params: {
71
- path: 'licence',
72
- slug: 'test'
73
- },
74
- query: {},
75
- app: { model }
76
- })
77
-
78
- const response = {
79
- code: jest.fn().mockImplementation(() => response)
80
- }
81
-
82
- h = {
83
- redirect: jest.fn().mockImplementation(() => response),
84
- view: jest.fn(),
85
- continue: Symbol('continue')
86
- }
87
- })
88
-
89
- describe('proceed', () => {
90
- it.each([
91
- {
92
- href: 'https://www.gov.uk/help/privacy-notice',
93
-
94
- request: {
95
- method: 'get'
96
- } satisfies Partial<FormContextRequest>,
97
-
98
- redirect: {
99
- statusCode: StatusCodes.MOVED_TEMPORARILY
100
- } satisfies Partial<ResponseObject>
101
- },
102
- {
103
- href: '/test/full-name',
104
-
105
- request: {
106
- method: 'get'
107
- } satisfies Partial<FormContextRequest>,
108
-
109
- redirect: {
110
- statusCode: StatusCodes.MOVED_TEMPORARILY
111
- } satisfies Partial<ResponseObject>
112
- },
113
- {
114
- href: '/test/full-name',
115
-
116
- request: {
117
- method: 'post',
118
- payload: {
119
- action: FormAction.Validate
120
- }
121
- } satisfies Partial<FormContextRequest>,
122
-
123
- redirect: {
124
- statusCode: StatusCodes.SEE_OTHER
125
- } satisfies Partial<ResponseObject>
126
- }
127
- ])(
128
- 'should redirect to the path provided',
129
- ({ href, redirect, ...options }) => {
130
- request = { ...request, ...options.request }
131
-
132
- const response = proceed(request, h, href)
133
-
134
- expect(h.view).not.toHaveBeenCalled()
135
- expect(h.redirect).toHaveBeenCalledWith(href)
136
- expect(response.code).toHaveBeenCalledWith(redirect.statusCode)
137
- }
138
- )
139
-
140
- it.each([
141
- {
142
- href: '/test/full-name',
143
-
144
- request: {
145
- method: 'post',
146
- payload: {
147
- action: FormAction.Validate
148
- },
149
- query: {
150
- myParam1: 'myValue1',
151
- myParam2: 'myValue2',
152
- returnUrl: '/test/summary'
153
- }
154
- } satisfies Partial<FormContextRequest>,
155
-
156
- redirect: {
157
- statusCode: StatusCodes.SEE_OTHER
158
- } satisfies Partial<ResponseObject>
159
- }
160
- ])(
161
- "should redirect to the 'returnUrl' query param provided (relative paths)",
162
- ({ href, redirect, ...options }) => {
163
- request = { ...request, ...options.request }
164
-
165
- const response = proceed(request, h, href)
166
-
167
- expect(h.view).not.toHaveBeenCalled()
168
- expect(h.redirect).toHaveBeenCalledWith(request.query.returnUrl)
169
- expect(response.code).toHaveBeenCalledWith(redirect.statusCode)
170
- }
171
- )
172
-
173
- it.each([
174
- {
175
- href: '/test/full-name',
176
-
177
- request: {
178
- method: 'get',
179
- query: { returnUrl: 'slash-missing' }
180
- } satisfies Partial<FormContextRequest>,
181
-
182
- redirect: {
183
- statusCode: StatusCodes.MOVED_TEMPORARILY
184
- } satisfies Partial<ResponseObject>
185
- },
186
- {
187
- href: '/test/full-name',
188
-
189
- request: {
190
- method: 'post',
191
- payload: {
192
- action: FormAction.Validate
193
- },
194
- query: { returnUrl: 'https://www.gov.uk/help/privacy-notice' }
195
- } satisfies Partial<FormContextRequest>,
196
-
197
- redirect: {
198
- statusCode: StatusCodes.SEE_OTHER
199
- } satisfies Partial<ResponseObject>
200
- },
201
- {
202
- href: '/test/repeater/example',
203
-
204
- request: {
205
- method: 'post',
206
- query: {
207
- myParam1: 'myValue1',
208
- myParam2: 'myValue2',
209
- returnUrl: '/test/repeater/summary'
210
- },
211
- payload: {
212
- action: FormAction.AddAnother
213
- }
214
- } satisfies Partial<FormContextRequest>,
215
-
216
- redirect: {
217
- statusCode: StatusCodes.MOVED_TEMPORARILY
218
- } satisfies Partial<ResponseObject>
219
- }
220
- ])(
221
- "should not redirect to the 'returnUrl' query param provided (other paths)",
222
- ({ href, ...options }) => {
223
- request = { ...request, ...options.request }
224
-
225
- proceed(request, h, href)
226
- expect(h.redirect).not.toHaveBeenCalledWith(request.query.returnUrl)
227
- }
228
- )
229
-
230
- it('should not forward custom query params on POST', () => {
231
- request = {
232
- ...request,
233
- method: 'post',
234
- query: { parcelId: 'SD5848-9205' }
235
- }
236
-
237
- proceed(request, h, '/test/next-page')
238
-
239
- expect(h.redirect).toHaveBeenCalledWith('/test/next-page')
240
- })
241
-
242
- it('should forward custom query params on GET so pre-population params survive dispatch redirects', () => {
243
- request = {
244
- ...request,
245
- method: 'get',
246
- query: { formId: '69afefa99b7b18cc1cd2c606' }
247
- }
248
-
249
- proceed(request, h, '/test/next-page')
250
-
251
- expect(h.redirect).toHaveBeenCalledWith(
252
- '/test/next-page?formId=69afefa99b7b18cc1cd2c606'
253
- )
254
- })
255
-
256
- it('should forward custom query params on GET but not returnUrl', () => {
257
- request = {
258
- ...request,
259
- method: 'get',
260
- query: { formId: '69afefa99b7b18cc1cd2c606', returnUrl: '/summary' }
261
- }
262
-
263
- proceed(request, h, '/test/next-page')
264
-
265
- expect(h.redirect).toHaveBeenCalledWith(
266
- '/test/next-page?formId=69afefa99b7b18cc1cd2c606'
267
- )
268
- })
269
- })
270
-
271
- describe('encodeUrl', () => {
272
- it.each([
273
- {
274
- input: 'http://example.com?myParam=has spaces&more£',
275
- output: 'http://example.com/?myParam=has%20spaces&more%C2%A3'
276
- },
277
- {
278
- input: 'mailto:hello@example.com?subject=has spaces&body=more£',
279
- output: 'mailto:hello@example.com?subject=has%20spaces&body=more%C2%A3'
280
- }
281
- ])('should percent encode parameters', ({ input, output }) => {
282
- const returned = encodeUrl(input)
283
- expect(returned).toBe(output)
284
- })
285
-
286
- it('should return undefined when no url is provided', () => {
287
- const returned = encodeUrl()
288
- expect(returned).toBeUndefined()
289
- })
290
-
291
- it('should throw when invalid url is provided', () => {
292
- expect(() => encodeUrl('not a url')).toThrow()
293
- })
294
- })
295
-
296
- describe('getPageHref', () => {
297
- it('should return page href', () => {
298
- const returned = getPageHref(page)
299
- expect(returned).toEqual(page.href)
300
- })
301
-
302
- it('should return page href (path override)', () => {
303
- const nextPath = '/badgers/monkeys'
304
- const nextHref = '/test/badgers/monkeys'
305
-
306
- const returned = getPageHref(page, nextPath)
307
- expect(returned).toEqual(nextHref)
308
- })
309
-
310
- it('should return page href without query params', () => {
311
- request.query.myParam = 'myValue'
312
- request.query.myParam2 = 'myValue2'
313
-
314
- const returned = getPageHref(page)
315
- expect(returned).toEqual(page.href)
316
- })
317
-
318
- it('should return page href (path override) without query params', () => {
319
- request.query.myParam = 'myValue'
320
- request.query.myParam2 = 'myValue2'
321
-
322
- const nextPath = '/badgers/monkeys'
323
- const nextHref = '/test/badgers/monkeys'
324
-
325
- const returned = getPageHref(page, nextPath)
326
- expect(returned).toEqual(nextHref)
327
- })
328
-
329
- it('should return page href with new query params', () => {
330
- const returned = getPageHref(page, {
331
- returnUrl: page.getSummaryPath(),
332
- badger: 'monkeys'
333
- })
334
-
335
- expect(returned).toBe(
336
- `${page.href}?returnUrl=${encodeURIComponent('/summary')}&badger=monkeys`
337
- )
338
- })
339
-
340
- it('should return page href (path override) with new query params', () => {
341
- const nextPath = '/badgers/monkeys'
342
- const nextHref = '/test/badgers/monkeys'
343
-
344
- const returned = getPageHref(page, nextPath, {
345
- returnUrl: page.getSummaryPath(),
346
- badger: 'monkeys'
347
- })
348
-
349
- expect(returned).toBe(
350
- `${nextHref}?returnUrl=${encodeURIComponent('/summary')}&badger=monkeys`
351
- )
352
- })
353
-
354
- it('should throw when absolute URL is provided', () => {
355
- expect(() =>
356
- getPageHref(page, 'https://www.gov.uk/help/privacy-notice')
357
- ).toThrow('Only relative URLs are allowed')
358
- })
359
- })
360
-
361
- describe('checkFormStatus', () => {
362
- it('should return true/live for params that include live state segment', () => {
363
- expect(
364
- checkFormStatus({
365
- state: FormStatus.Live,
366
- slug: 'another',
367
- path: 'segment'
368
- })
369
- ).toStrictEqual({
370
- state: FormStatus.Live,
371
- isPreview: true
372
- })
373
- })
374
-
375
- it('should return true/draft for params that include draft state segment', () => {
376
- expect(
377
- checkFormStatus({
378
- state: FormStatus.Draft,
379
- slug: 'another',
380
- path: 'segment'
381
- })
382
- ).toStrictEqual({
383
- state: FormStatus.Draft,
384
- isPreview: true
385
- })
386
- })
387
-
388
- it('should return false/live for paths without a state segment', () => {
389
- expect(
390
- checkFormStatus({
391
- slug: 'some',
392
- path: 'other'
393
- })
394
- ).toStrictEqual({
395
- state: FormStatus.Live,
396
- isPreview: false
397
- })
398
- })
399
- })
400
-
401
- describe('checkEmailAddressForLiveFormSubmission', () => {
402
- it('should throw an error if emailAddress is undefined and isPreview is false', () => {
403
- expect(() =>
404
- checkEmailAddressForLiveFormSubmission(undefined, false)
405
- ).toThrow(
406
- Boom.internal(
407
- 'An email address is required to complete the form submission'
408
- )
409
- )
410
- })
411
-
412
- it('should not throw an error if emailAddress is defined and isPreview is false', () => {
413
- expect(() =>
414
- checkEmailAddressForLiveFormSubmission('test@example.com', false)
415
- ).not.toThrow()
416
- })
417
-
418
- it('should not throw an error if emailAddress is undefined and isPreview is true', () => {
419
- expect(() =>
420
- checkEmailAddressForLiveFormSubmission(undefined, true)
421
- ).not.toThrow()
422
- })
423
-
424
- it('should not throw an error if emailAddress is defined and isPreview is true', () => {
425
- expect(() =>
426
- checkEmailAddressForLiveFormSubmission('test@example.com', true)
427
- ).not.toThrow()
428
- })
429
- })
430
-
431
- describe('getErrors', () => {
432
- it('formats dates with ISO strings', () => {
433
- const { details } = new ValidationError(
434
- 'Date of marriage example',
435
- [
436
- {
437
- message:
438
- 'Date of marriage must be on or before 2021-12-25T00:00:00.000Z',
439
- path: ['dateField'],
440
- type: 'date.max',
441
- context: {
442
- key: 'dateField',
443
- title: 'date of marriage'
444
- }
445
- }
446
- ],
447
- undefined
448
- )
449
-
450
- expect(getErrors(details)).toEqual([
451
- {
452
- path: ['dateField'],
453
- href: '#dateField',
454
- name: 'dateField',
455
- text: 'Date of marriage must be on or before 25 December 2021',
456
- context: {
457
- key: 'dateField',
458
- title: 'date of marriage'
459
- }
460
- }
461
- ])
462
- })
463
-
464
- it('does not format the first letter to uppercase', () => {
465
- const { details } = new ValidationError(
466
- 'Date of marriage example',
467
- [
468
- {
469
- message: 'something invalid',
470
- path: ['yesNoField'],
471
- type: 'string.pattern.base',
472
- context: {
473
- key: 'yesNoField'
474
- }
475
- }
476
- ],
477
- undefined
478
- )
479
-
480
- expect(getErrors(details)).toEqual([
481
- {
482
- path: ['yesNoField'],
483
- href: '#yesNoField',
484
- name: 'yesNoField',
485
- text: 'something invalid',
486
- context: {
487
- key: 'yesNoField'
488
- }
489
- }
490
- ])
491
- })
492
- })
493
-
494
- describe('getExponentialBackoffDelay', () => {
495
- it.each([
496
- { depth: 1, expected: 2000 },
497
- { depth: 2, expected: 4000 },
498
- { depth: 3, expected: 8000 },
499
- { depth: 4, expected: 16000 },
500
- { depth: 5, expected: 25000 },
501
- { depth: 6, expected: 25000 },
502
- { depth: 7, expected: 25000 }
503
- ])(
504
- 'should calculate correct delay for depth $depth',
505
- ({ depth, expected }) => {
506
- expect(getExponentialBackoffDelay(depth)).toBe(expected)
507
- }
508
- )
509
-
510
- it('should handle depth of 0', () => {
511
- expect(getExponentialBackoffDelay(0)).toBe(1000)
512
- })
513
-
514
- it('should handle negative depth', () => {
515
- expect(getExponentialBackoffDelay(-1)).toBe(500)
516
- })
517
-
518
- it('should cap at 25 seconds (25000ms) even for large depths', () => {
519
- // For depth 10: 2000 * 2^(9) would be too high, so it should be capped
520
- expect(getExponentialBackoffDelay(10)).toBe(25000)
521
- expect(getExponentialBackoffDelay(20)).toBe(25000)
522
- })
523
- })
524
-
525
- describe('evaluateTemplate', () => {
526
- let model: FormModel
527
- let formContext: FormContext
528
-
529
- beforeEach(() => {
530
- model = new FormModel(templateDefinition, {
531
- basePath: 'template'
532
- })
533
-
534
- formContext = {
535
- evaluationState: {},
536
- relevantState: {},
537
- relevantPages: [],
538
- payload: {},
539
- state: {},
540
- paths: [],
541
- isForceAccess: false,
542
- data: {},
543
- pageDefMap: model.pageDefMap,
544
- listDefMap: model.listDefMap,
545
- componentDefMap: model.componentDefMap,
546
- pageMap: model.pageMap,
547
- componentMap: model.componentMap,
548
- referenceNumber: 'foobar'
549
- }
550
- })
551
-
552
- it('should replace placeholders with values from form context relevantState', () => {
553
- Object.assign(formContext.relevantState, {
554
- WmHfSb: 'Enrique Chase'
555
- })
556
-
557
- const areYouInEngland = templateDefinition.pages[2]
558
- expect(areYouInEngland.title).toBe('Are you in England, {{ WmHfSb }}?')
559
-
560
- const result = evaluateTemplate(areYouInEngland.title, formContext)
561
- expect(result).toBe('Are you in England, Enrique Chase?')
562
- })
563
-
564
- it('should replace placeholders with values from form context data', () => {
565
- Object.assign(formContext.data, {
566
- score: 'Low'
567
- })
568
-
569
- const result = evaluateTemplate(
570
- 'Your score is: {{ context.data.score }}',
571
- formContext
572
- )
573
-
574
- expect(result).toBe('Your score is: Low')
575
- })
576
-
577
- it('evaluate filter should evaluate a liquid template', () => {
578
- Object.assign(formContext.relevantState, {
579
- WmHfSb: 'Enrique Chase'
580
- })
581
-
582
- const result = evaluateTemplate(
583
- '{{ "Hello, {{ WmHfSb }}!" | evaluate }}',
584
- formContext
585
- )
586
-
587
- expect(result).toBe('Hello, Enrique Chase!')
588
- })
589
-
590
- it('page filter should return the page definition', () => {
591
- // @ts-expect-error - spyOn type issue
592
- const filterSpy = jest.spyOn(engine.filters, 'page')
593
- const result = evaluateTemplate(
594
- '{%- assign startPageDef = "/start" | page -%}{{ startPageDef.title }}',
595
- formContext
596
- )
597
-
598
- expect(filterSpy).toHaveBeenCalledWith('/start')
599
- expect(result).toBe('Start page')
600
- })
601
-
602
- it('page filter should return empty when anything but a string is passed', () => {
603
- // @ts-expect-error - spyOn type issue
604
- const pageFilterSpy = jest.spyOn(engine.filters, 'page')
605
-
606
- let result = evaluateTemplate('{{ 0 | page }}', formContext)
607
- expect(pageFilterSpy).toHaveBeenLastCalledWith(0)
608
- expect(result).toBe('')
609
-
610
- result = evaluateTemplate('{{ undefined | page }}', formContext)
611
- expect(pageFilterSpy).toHaveBeenLastCalledWith(undefined)
612
- expect(result).toBe('')
613
-
614
- result = evaluateTemplate('{{ null | page }}', formContext)
615
- expect(result).toBe('')
616
-
617
- result = evaluateTemplate('{{ false | page }}', formContext)
618
- expect(pageFilterSpy).toHaveBeenLastCalledWith(false)
619
- expect(result).toBe('')
620
-
621
- result = evaluateTemplate('{{ [] | page }}', formContext)
622
- expect(result).toBe('')
623
- })
624
-
625
- it('href filter should return the page href', () => {
626
- // @ts-expect-error - spyOn type issue
627
- const filterSpy = jest.spyOn(engine.filters, 'href')
628
- const result = evaluateTemplate('{{ "/full-name" | href }}', formContext)
629
-
630
- expect(filterSpy).toHaveBeenCalledWith('/full-name')
631
- expect(result).toBe('/template/full-name')
632
- })
633
-
634
- it('href filter should return empty when no page passed', () => {
635
- // @ts-expect-error - spyOn type issue
636
- const pageFilterSpy = jest.spyOn(engine.filters, 'href')
637
-
638
- const result = evaluateTemplate('{{ undefined | href }}', formContext)
639
- expect(pageFilterSpy).toHaveBeenLastCalledWith(undefined)
640
- expect(result).toBe('')
641
- })
642
-
643
- it('field filter should return the component definition', () => {
644
- // @ts-expect-error - spyOn type issue
645
- const filterSpy = jest.spyOn(engine.filters, 'field')
646
- const result = evaluateTemplate(
647
- '{%- assign fullNameComponentDef = "WmHfSb" | field -%}{{ fullNameComponentDef.title }}',
648
- formContext
649
- )
650
-
651
- expect(filterSpy).toHaveBeenCalledWith('WmHfSb')
652
- expect(result).toBe('What&#39;s your full name?')
653
- })
654
-
655
- it('field filter should return empty when anything but a string is passed', () => {
656
- // @ts-expect-error - spyOn type issue
657
- const pageFilterSpy = jest.spyOn(engine.filters, 'field')
658
-
659
- let result = evaluateTemplate('{{ 0 | field }}', formContext)
660
- expect(pageFilterSpy).toHaveBeenLastCalledWith(0)
661
- expect(result).toBe('')
662
-
663
- result = evaluateTemplate('{{ undefined | field }}', formContext)
664
- expect(pageFilterSpy).toHaveBeenLastCalledWith(undefined)
665
- expect(result).toBe('')
666
-
667
- result = evaluateTemplate('{{ null | field }}', formContext)
668
- expect(result).toBe('')
669
-
670
- result = evaluateTemplate('{{ false | field }}', formContext)
671
- expect(pageFilterSpy).toHaveBeenLastCalledWith(false)
672
- expect(result).toBe('')
673
-
674
- result = evaluateTemplate('{{ [] | field }}', formContext)
675
- expect(result).toBe('')
676
- })
677
-
678
- it('answer filter should return the formatted submitted answer', () => {
679
- Object.assign(formContext.relevantState, {
680
- TKsWbP: true,
681
- WmHfSb: 'Enrique Chase'
682
- })
683
-
684
- // @ts-expect-error - spyOn type issue
685
- const filterSpy = jest.spyOn(engine.filters, 'answer')
686
-
687
- let result = evaluateTemplate("{{ 'TKsWbP' | answer }}", formContext)
688
- expect(filterSpy).toHaveBeenCalledWith('TKsWbP')
689
- expect(result).toBe('Yes')
690
-
691
- result = evaluateTemplate("{{ 'WmHfSb' | answer }}", formContext)
692
- expect(filterSpy).toHaveBeenCalledWith('WmHfSb')
693
- expect(result).toBe('Enrique Chase')
694
- })
695
-
696
- it('answer filter should return empty when anything but a string is passed', () => {
697
- // @ts-expect-error - spyOn type issue
698
- const pageFilterSpy = jest.spyOn(engine.filters, 'answer')
699
-
700
- let result = evaluateTemplate('{{ 0 | answer }}', formContext)
701
- expect(pageFilterSpy).toHaveBeenLastCalledWith(0)
702
- expect(result).toBe('')
703
-
704
- result = evaluateTemplate('{{ undefined | answer }}', formContext)
705
- expect(pageFilterSpy).toHaveBeenLastCalledWith(undefined)
706
- expect(result).toBe('')
707
-
708
- result = evaluateTemplate('{{ null | answer }}', formContext)
709
- expect(result).toBe('')
710
-
711
- result = evaluateTemplate('{{ false | answer }}', formContext)
712
- expect(pageFilterSpy).toHaveBeenLastCalledWith(false)
713
- expect(result).toBe('')
714
-
715
- result = evaluateTemplate('{{ [] | answer }}', formContext)
716
- expect(result).toBe('')
717
- })
718
-
719
- it('answer filter should return empty when non-form component name is passed', () => {
720
- // @ts-expect-error - spyOn type issue
721
- const pageFilterSpy = jest.spyOn(engine.filters, 'answer')
722
-
723
- const result = evaluateTemplate('{{ "FGyiLS" | answer }}', formContext)
724
- expect(pageFilterSpy).toHaveBeenLastCalledWith('FGyiLS')
725
- expect(result).toBe('')
726
- })
727
- })
728
-
729
- describe('Nunjucks filters', () => {
730
- describe('evaluate filter', () => {
731
- it('returns non-string values unchanged', () => {
732
- const mockContext: NunjucksContext = {
733
- context: {
734
- globals: {
735
- context: { pageMap: new Map() } as FormContext,
736
- pages: new Map(),
737
- components: new Map()
738
- }
739
- }
740
- }
741
-
742
- const numResult = (
743
- engine.filters.evaluate as unknown as EvaluateFilter
744
- ).call(mockContext, 123)
745
- expect(numResult).toBe(123)
746
-
747
- const objResult = (
748
- engine.filters.evaluate as unknown as EvaluateFilter
749
- ).call(mockContext, { foo: 'bar' })
750
- expect(objResult).toEqual({ foo: 'bar' })
751
- })
752
- })
753
-
754
- describe('href filter', () => {
755
- it('returns undefined when page is undefined', () => {
756
- const mockContext: NunjucksContext = {
757
- context: {
758
- globals: {
759
- context: { pageMap: new Map() } as FormContext,
760
- pages: new Map(),
761
- components: new Map()
762
- }
763
- }
764
- }
765
-
766
- const result = (engine.filters.href as unknown as HrefFilter).call(
767
- mockContext,
768
- '/some-page'
769
- )
770
-
771
- expect(result).toBeUndefined()
772
- })
773
- })
774
- })
775
-
776
- describe('handleLegacyRedirect', () => {
777
- let mockH: jest.Mocked<Pick<ResponseToolkit, 'redirect'>>
778
- let mockRedirectResponse: jest.Mocked<
779
- ReturnType<ResponseToolkit['redirect']>
780
- >
781
-
782
- beforeEach(() => {
783
- mockRedirectResponse = {
784
- permanent: jest.fn().mockReturnThis(),
785
- takeover: jest.fn().mockReturnThis()
786
- } as unknown as jest.Mocked<ReturnType<ResponseToolkit['redirect']>>
787
-
788
- mockH = {
789
- redirect: jest.fn().mockReturnValue(mockRedirectResponse)
790
- }
791
- })
792
-
793
- it('should call h.redirect with the target URL', () => {
794
- const targetUrl = '/another/target'
795
- handleLegacyRedirect(mockH as unknown as ResponseToolkit, targetUrl)
796
-
797
- expect(mockH.redirect).toHaveBeenCalledTimes(1)
798
- expect(mockH.redirect).toHaveBeenCalledWith(targetUrl)
799
- })
800
-
801
- it('should call permanent() and takeover() on the redirect response', () => {
802
- const targetUrl = '/final/destination'
803
- handleLegacyRedirect(mockH as unknown as ResponseToolkit, targetUrl)
804
-
805
- expect(mockRedirectResponse.permanent).toHaveBeenCalledTimes(1)
806
- expect(mockRedirectResponse.takeover).toHaveBeenCalledTimes(1)
807
- })
808
-
809
- it('should return the final response object from takeover()', () => {
810
- const targetUrl = '/the/end'
811
- const response = handleLegacyRedirect(
812
- mockH as unknown as ResponseToolkit,
813
- targetUrl
814
- )
815
-
816
- expect(response).toBe(mockRedirectResponse)
817
- })
818
- })
819
-
820
- describe('setPageTitles', () => {
821
- const definition: FormDefinition = {
822
- name: 'Test Form',
823
- startPage: '/page1',
824
- pages: [
825
- {
826
- path: '/page1',
827
- title: '',
828
- next: [],
829
- components: [
830
- {
831
- type: ComponentType.TextField,
832
- name: 'textfield1',
833
- title: 'What is your name?',
834
- options: {},
835
- schema: {}
836
- },
837
- {
838
- type: ComponentType.TextField,
839
- name: 'textfield2',
840
- title: 'What is your favourite food?',
841
- options: {},
842
- schema: {}
843
- }
844
- ]
845
- } satisfies PageQuestion
846
- ],
847
- lists: [],
848
- sections: [],
849
- conditions: []
850
- }
851
-
852
- beforeEach(() => {
853
- jest.clearAllMocks()
854
- })
855
- it('should set title if missing', () => {
856
- const def = structuredClone(definition)
857
- setPageTitles(def)
858
- expect(def.pages[0].title).toBe('What is your name?')
859
- })
860
-
861
- it('should keep title if supplied', () => {
862
- const def = structuredClone(definition)
863
- def.pages[0].title = 'Page 1 title'
864
- setPageTitles(def)
865
- expect(def.pages[0].title).toBe('Page 1 title')
866
- })
867
- })
868
- })