@defra/forms-engine-plugin 0.0.2 → 0.0.4

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 (330) hide show
  1. package/.public/assets/fonts/bold-affa96571d-v2.woff +0 -0
  2. package/.public/assets/fonts/bold-b542beb274-v2.woff2 +0 -0
  3. package/.public/assets/fonts/light-94a07e06a1-v2.woff2 +0 -0
  4. package/.public/assets/fonts/light-f591b13f7d-v2.woff +0 -0
  5. package/.public/assets/images/favicon.ico +0 -0
  6. package/.public/assets/images/favicon.svg +1 -0
  7. package/.public/assets/images/govuk-crest.svg +1 -0
  8. package/.public/assets/images/govuk-icon-180.png +0 -0
  9. package/.public/assets/images/govuk-icon-192.png +0 -0
  10. package/.public/assets/images/govuk-icon-512.png +0 -0
  11. package/.public/assets/images/govuk-icon-mask.svg +1 -0
  12. package/.public/assets/images/govuk-opengraph-image.png +0 -0
  13. package/.public/assets/manifest.json +39 -0
  14. package/.public/assets-manifest.json +24 -0
  15. package/.public/javascripts/application.0fd8c18.min.js +3 -0
  16. package/.public/javascripts/application.0fd8c18.min.js.LICENSE.txt +58 -0
  17. package/.public/javascripts/application.0fd8c18.min.js.map +1 -0
  18. package/.public/javascripts/file-upload.b2f18f5.min.js +2 -0
  19. package/.public/javascripts/file-upload.b2f18f5.min.js.map +1 -0
  20. package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js +2 -0
  21. package/.public/javascripts/vendor/accessible-autocomplete.275d332.min.js.map +1 -0
  22. package/.public/stylesheets/application.e340021.min.css +14 -0
  23. package/.public/stylesheets/application.e340021.min.css.map +1 -0
  24. package/.server/server/plugins/nunjucks/environment.js +3 -3
  25. package/.server/server/plugins/nunjucks/environment.js.map +1 -1
  26. package/package.json +6 -2
  27. package/.browserslistrc +0 -16
  28. package/.editorconfig +0 -9
  29. package/.eslintrc.cjs +0 -266
  30. package/.github/dependabot.yml +0 -85
  31. package/.github/workflows/check-pull-request.yml +0 -209
  32. package/.github/workflows/pr-notifier.yml +0 -98
  33. package/.github/workflows/publish.yml +0 -111
  34. package/.husky/pre-commit +0 -1
  35. package/.lintstagedrc.js +0 -4
  36. package/.nvmrc +0 -1
  37. package/.prettierignore +0 -8
  38. package/.prettierrc.cjs +0 -26
  39. package/Dockerfile +0 -61
  40. package/Procfile +0 -1
  41. package/babel.config.cjs +0 -55
  42. package/compose/aws.env +0 -4
  43. package/compose/start-localstack.sh +0 -26
  44. package/docker-compose.yaml +0 -86
  45. package/globals.d.ts +0 -1
  46. package/jest.config.cjs +0 -54
  47. package/jest.environment.js +0 -4
  48. package/jest.setup.cjs +0 -14
  49. package/postcss.config.js +0 -26
  50. package/sonar-project.properties +0 -17
  51. package/src/client/javascripts/application.js +0 -87
  52. package/src/client/javascripts/file-upload.js +0 -386
  53. package/src/client/stylesheets/_code.scss +0 -33
  54. package/src/client/stylesheets/_govuk-frontend.scss +0 -4
  55. package/src/client/stylesheets/_prose.scss +0 -56
  56. package/src/client/stylesheets/_service-banner.scss +0 -24
  57. package/src/client/stylesheets/_summary-list.scss +0 -28
  58. package/src/client/stylesheets/_tag-env.scss +0 -24
  59. package/src/client/stylesheets/application.scss +0 -14
  60. package/src/common/cookies.js +0 -58
  61. package/src/common/cookies.test.js +0 -23
  62. package/src/common/types.js +0 -5
  63. package/src/config/index.ts +0 -271
  64. package/src/index.ts +0 -31
  65. package/src/server/common/helpers/logging/logger-options.test.ts +0 -50
  66. package/src/server/common/helpers/logging/logger-options.ts +0 -46
  67. package/src/server/common/helpers/logging/logger.ts +0 -7
  68. package/src/server/common/helpers/logging/request-logger.ts +0 -9
  69. package/src/server/common/helpers/logging/request-tracing.js +0 -10
  70. package/src/server/common/helpers/redis-client.js +0 -70
  71. package/src/server/constants.js +0 -1
  72. package/src/server/forms/README.md +0 -10
  73. package/src/server/forms/components.json +0 -1015
  74. package/src/server/forms/report-a-terrorist.json +0 -270
  75. package/src/server/forms/runner-components-test.json +0 -365
  76. package/src/server/forms/test.json +0 -581
  77. package/src/server/index.test.ts +0 -582
  78. package/src/server/index.ts +0 -140
  79. package/src/server/plugins/blankie.test.ts +0 -73
  80. package/src/server/plugins/blankie.ts +0 -48
  81. package/src/server/plugins/crumb.ts +0 -20
  82. package/src/server/plugins/engine/README.md +0 -87
  83. package/src/server/plugins/engine/components/AutocompleteField.test.ts +0 -294
  84. package/src/server/plugins/engine/components/AutocompleteField.ts +0 -49
  85. package/src/server/plugins/engine/components/CheckboxesField.test.ts +0 -379
  86. package/src/server/plugins/engine/components/CheckboxesField.ts +0 -106
  87. package/src/server/plugins/engine/components/ComponentBase.ts +0 -97
  88. package/src/server/plugins/engine/components/ComponentCollection.ts +0 -278
  89. package/src/server/plugins/engine/components/DatePartsField.test.ts +0 -822
  90. package/src/server/plugins/engine/components/DatePartsField.ts +0 -264
  91. package/src/server/plugins/engine/components/Details.test.ts +0 -49
  92. package/src/server/plugins/engine/components/Details.ts +0 -30
  93. package/src/server/plugins/engine/components/EmailAddressField.test.ts +0 -395
  94. package/src/server/plugins/engine/components/EmailAddressField.ts +0 -55
  95. package/src/server/plugins/engine/components/FileUploadField.test.ts +0 -778
  96. package/src/server/plugins/engine/components/FileUploadField.ts +0 -262
  97. package/src/server/plugins/engine/components/FormComponent.ts +0 -249
  98. package/src/server/plugins/engine/components/Html.test.ts +0 -48
  99. package/src/server/plugins/engine/components/Html.ts +0 -29
  100. package/src/server/plugins/engine/components/InsetText.test.ts +0 -48
  101. package/src/server/plugins/engine/components/InsetText.ts +0 -27
  102. package/src/server/plugins/engine/components/List.test.ts +0 -76
  103. package/src/server/plugins/engine/components/List.ts +0 -72
  104. package/src/server/plugins/engine/components/ListFormComponent.ts +0 -140
  105. package/src/server/plugins/engine/components/MonthYearField.test.ts +0 -567
  106. package/src/server/plugins/engine/components/MonthYearField.ts +0 -222
  107. package/src/server/plugins/engine/components/MultilineTextField.test.ts +0 -558
  108. package/src/server/plugins/engine/components/MultilineTextField.ts +0 -138
  109. package/src/server/plugins/engine/components/NumberField.test.ts +0 -701
  110. package/src/server/plugins/engine/components/NumberField.ts +0 -163
  111. package/src/server/plugins/engine/components/RadiosField.test.ts +0 -288
  112. package/src/server/plugins/engine/components/RadiosField.ts +0 -24
  113. package/src/server/plugins/engine/components/SelectField.test.ts +0 -288
  114. package/src/server/plugins/engine/components/SelectField.ts +0 -47
  115. package/src/server/plugins/engine/components/SelectionControlField.ts +0 -43
  116. package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +0 -356
  117. package/src/server/plugins/engine/components/TelephoneNumberField.ts +0 -67
  118. package/src/server/plugins/engine/components/TextField.test.ts +0 -489
  119. package/src/server/plugins/engine/components/TextField.ts +0 -96
  120. package/src/server/plugins/engine/components/UkAddressField.test.ts +0 -623
  121. package/src/server/plugins/engine/components/UkAddressField.ts +0 -172
  122. package/src/server/plugins/engine/components/YesNoField.test.ts +0 -248
  123. package/src/server/plugins/engine/components/YesNoField.ts +0 -31
  124. package/src/server/plugins/engine/components/constants.ts +0 -1
  125. package/src/server/plugins/engine/components/helpers.ts +0 -330
  126. package/src/server/plugins/engine/components/index.ts +0 -24
  127. package/src/server/plugins/engine/components/types.ts +0 -117
  128. package/src/server/plugins/engine/configureEnginePlugin.ts +0 -47
  129. package/src/server/plugins/engine/helpers.test.ts +0 -791
  130. package/src/server/plugins/engine/helpers.ts +0 -379
  131. package/src/server/plugins/engine/index.ts +0 -7
  132. package/src/server/plugins/engine/models/FormModel.test.ts +0 -42
  133. package/src/server/plugins/engine/models/FormModel.ts +0 -443
  134. package/src/server/plugins/engine/models/RepeatingSummaryViewModel.ts +0 -0
  135. package/src/server/plugins/engine/models/Section.ts +0 -0
  136. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +0 -209
  137. package/src/server/plugins/engine/models/SummaryViewModel.ts +0 -220
  138. package/src/server/plugins/engine/models/index.ts +0 -2
  139. package/src/server/plugins/engine/models/types.ts +0 -114
  140. package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +0 -143
  141. package/src/server/plugins/engine/outputFormatters/human/v1.ts +0 -73
  142. package/src/server/plugins/engine/outputFormatters/index.test.ts +0 -17
  143. package/src/server/plugins/engine/outputFormatters/index.ts +0 -44
  144. package/src/server/plugins/engine/outputFormatters/machine/v1.test.ts +0 -229
  145. package/src/server/plugins/engine/outputFormatters/machine/v1.ts +0 -140
  146. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +0 -229
  147. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +0 -153
  148. package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +0 -1108
  149. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +0 -446
  150. package/src/server/plugins/engine/pageControllers/PageController.test.ts +0 -205
  151. package/src/server/plugins/engine/pageControllers/PageController.ts +0 -176
  152. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +0 -1264
  153. package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +0 -561
  154. package/src/server/plugins/engine/pageControllers/README.md +0 -28
  155. package/src/server/plugins/engine/pageControllers/RepeatPageController.test.ts +0 -264
  156. package/src/server/plugins/engine/pageControllers/RepeatPageController.ts +0 -458
  157. package/src/server/plugins/engine/pageControllers/StartPageController.ts +0 -18
  158. package/src/server/plugins/engine/pageControllers/StatusPageController.ts +0 -50
  159. package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +0 -261
  160. package/src/server/plugins/engine/pageControllers/TerminalController.test.ts +0 -28
  161. package/src/server/plugins/engine/pageControllers/TerminalPageController.ts +0 -19
  162. package/src/server/plugins/engine/pageControllers/helpers.test.ts +0 -198
  163. package/src/server/plugins/engine/pageControllers/helpers.ts +0 -101
  164. package/src/server/plugins/engine/pageControllers/index.ts +0 -10
  165. package/src/server/plugins/engine/pageControllers/validationOptions.ts +0 -89
  166. package/src/server/plugins/engine/plugin.ts +0 -673
  167. package/src/server/plugins/engine/services/formSubmissionService.js +0 -46
  168. package/src/server/plugins/engine/services/formsService.js +0 -46
  169. package/src/server/plugins/engine/services/formsService.test.js +0 -90
  170. package/src/server/plugins/engine/services/index.js +0 -3
  171. package/src/server/plugins/engine/services/notifyService.test.ts +0 -132
  172. package/src/server/plugins/engine/services/notifyService.ts +0 -64
  173. package/src/server/plugins/engine/services/uploadService.js +0 -60
  174. package/src/server/plugins/engine/types.ts +0 -315
  175. package/src/server/plugins/engine/views/components/autocompletefield.html +0 -5
  176. package/src/server/plugins/engine/views/components/checkboxesfield.html +0 -5
  177. package/src/server/plugins/engine/views/components/datepartsfield.html +0 -5
  178. package/src/server/plugins/engine/views/components/details.html +0 -6
  179. package/src/server/plugins/engine/views/components/emailaddressfield.html +0 -5
  180. package/src/server/plugins/engine/views/components/fileuploadfield-key.html +0 -8
  181. package/src/server/plugins/engine/views/components/fileuploadfield-value.html +0 -3
  182. package/src/server/plugins/engine/views/components/fileuploadfield.html +0 -24
  183. package/src/server/plugins/engine/views/components/html.html +0 -3
  184. package/src/server/plugins/engine/views/components/insettext.html +0 -7
  185. package/src/server/plugins/engine/views/components/list.html +0 -36
  186. package/src/server/plugins/engine/views/components/monthyearfield.html +0 -5
  187. package/src/server/plugins/engine/views/components/multilinetextfield.html +0 -10
  188. package/src/server/plugins/engine/views/components/numberfield.html +0 -5
  189. package/src/server/plugins/engine/views/components/radiosfield.html +0 -5
  190. package/src/server/plugins/engine/views/components/selectfield.html +0 -5
  191. package/src/server/plugins/engine/views/components/telephonenumberfield.html +0 -5
  192. package/src/server/plugins/engine/views/components/textfield.html +0 -5
  193. package/src/server/plugins/engine/views/components/ukaddressfield.html +0 -25
  194. package/src/server/plugins/engine/views/components/yesnofield.html +0 -5
  195. package/src/server/plugins/engine/views/file-upload.html +0 -45
  196. package/src/server/plugins/engine/views/index.html +0 -39
  197. package/src/server/plugins/engine/views/item-delete.html +0 -56
  198. package/src/server/plugins/engine/views/partials/components.html +0 -6
  199. package/src/server/plugins/engine/views/partials/conditional-components.html +0 -3
  200. package/src/server/plugins/engine/views/partials/debug.html +0 -44
  201. package/src/server/plugins/engine/views/partials/form.html +0 -15
  202. package/src/server/plugins/engine/views/partials/heading.html +0 -16
  203. package/src/server/plugins/engine/views/partials/preview-banner.html +0 -32
  204. package/src/server/plugins/engine/views/partials/preview-banner.test.js +0 -122
  205. package/src/server/plugins/engine/views/partials/warn-missing-notification-email.html +0 -10
  206. package/src/server/plugins/engine/views/repeat-list-summary.html +0 -53
  207. package/src/server/plugins/errorPages.ts +0 -58
  208. package/src/server/plugins/nunjucks/context.js +0 -88
  209. package/src/server/plugins/nunjucks/context.test.js +0 -142
  210. package/src/server/plugins/nunjucks/enviroment.test.js +0 -201
  211. package/src/server/plugins/nunjucks/environment.js +0 -116
  212. package/src/server/plugins/nunjucks/filters/answer.js +0 -27
  213. package/src/server/plugins/nunjucks/filters/answer.test.js +0 -89
  214. package/src/server/plugins/nunjucks/filters/evaluate.js +0 -21
  215. package/src/server/plugins/nunjucks/filters/field.js +0 -28
  216. package/src/server/plugins/nunjucks/filters/field.test.js +0 -75
  217. package/src/server/plugins/nunjucks/filters/highlight.js +0 -11
  218. package/src/server/plugins/nunjucks/filters/href.js +0 -30
  219. package/src/server/plugins/nunjucks/filters/href.test.js +0 -80
  220. package/src/server/plugins/nunjucks/filters/index.js +0 -8
  221. package/src/server/plugins/nunjucks/filters/inspect.js +0 -15
  222. package/src/server/plugins/nunjucks/filters/page.js +0 -24
  223. package/src/server/plugins/nunjucks/filters/page.test.js +0 -65
  224. package/src/server/plugins/nunjucks/index.js +0 -3
  225. package/src/server/plugins/nunjucks/plugin.js +0 -40
  226. package/src/server/plugins/nunjucks/render.js +0 -42
  227. package/src/server/plugins/nunjucks/types.js +0 -40
  228. package/src/server/plugins/pulse.ts +0 -11
  229. package/src/server/plugins/router.ts +0 -201
  230. package/src/server/plugins/session.ts +0 -28
  231. package/src/server/routes/health.js +0 -13
  232. package/src/server/routes/health.test.js +0 -35
  233. package/src/server/routes/index.test.ts +0 -125
  234. package/src/server/routes/index.ts +0 -2
  235. package/src/server/routes/public.ts +0 -47
  236. package/src/server/routes/types.ts +0 -48
  237. package/src/server/schemas/index.ts +0 -34
  238. package/src/server/secure-context.js +0 -43
  239. package/src/server/services/cacheService.test.ts +0 -276
  240. package/src/server/services/cacheService.ts +0 -131
  241. package/src/server/services/httpService.test.js +0 -491
  242. package/src/server/services/httpService.ts +0 -50
  243. package/src/server/services/index.ts +0 -1
  244. package/src/server/types.ts +0 -54
  245. package/src/server/utils/notify.test.ts +0 -37
  246. package/src/server/utils/notify.ts +0 -50
  247. package/src/server/utils/secure-context/get-trust-store-certs.js +0 -11
  248. package/src/server/utils/secure-context/get-trust-store-certs.test.js +0 -19
  249. package/src/server/utils/utils.js +0 -24
  250. package/src/server/utils/utils.test.js +0 -54
  251. package/src/server/views/404.html +0 -16
  252. package/src/server/views/500.html +0 -19
  253. package/src/server/views/components/debug/macro.njk +0 -3
  254. package/src/server/views/components/debug/template.njk +0 -13
  255. package/src/server/views/components/service-banner/macro.njk +0 -3
  256. package/src/server/views/components/service-banner/template.njk +0 -20
  257. package/src/server/views/components/service-banner/template.test.js +0 -43
  258. package/src/server/views/components/tag-env/macro.njk +0 -3
  259. package/src/server/views/components/tag-env/template.njk +0 -30
  260. package/src/server/views/components/tag-env/template.test.js +0 -66
  261. package/src/server/views/confirmation.html +0 -19
  262. package/src/server/views/help/accessibility-statement.html +0 -58
  263. package/src/server/views/help/cookie-preferences.html +0 -57
  264. package/src/server/views/help/cookies.html +0 -71
  265. package/src/server/views/help/get-support.html +0 -37
  266. package/src/server/views/help/privacy-notice.html +0 -68
  267. package/src/server/views/help/terms-and-conditions.html +0 -83
  268. package/src/server/views/layout.html +0 -199
  269. package/src/server/views/summary.html +0 -50
  270. package/src/typings/hapi/index.d.ts +0 -95
  271. package/src/typings/hapi-tracing/index.d.ts +0 -6
  272. package/src/typings/index.d.ts +0 -3
  273. package/src/typings/joi/index.d.ts +0 -22
  274. package/stylelint.config.js +0 -10
  275. package/test/client/javascripts/file-upload.test.js +0 -1197
  276. package/test/condition/checkboxes.test.js +0 -112
  277. package/test/condition/radios.test.js +0 -112
  278. package/test/condition/text.test.js +0 -103
  279. package/test/fixtures/assets-manifest.json +0 -4
  280. package/test/fixtures/form.js +0 -86
  281. package/test/fixtures/index.js +0 -2
  282. package/test/fixtures/list.js +0 -92
  283. package/test/form/cookies.test.js +0 -338
  284. package/test/form/csrf.test.js +0 -87
  285. package/test/form/definitions/basic.js +0 -101
  286. package/test/form/definitions/blank.js +0 -10
  287. package/test/form/definitions/checkboxes.json +0 -88
  288. package/test/form/definitions/components.json +0 -452
  289. package/test/form/definitions/conditional-reveal.js +0 -140
  290. package/test/form/definitions/conditions-basic.js +0 -187
  291. package/test/form/definitions/conditions-complex.js +0 -338
  292. package/test/form/definitions/conditions-dates.js +0 -78
  293. package/test/form/definitions/conditions-escaping.js +0 -143
  294. package/test/form/definitions/demo-cph-number.js +0 -3099
  295. package/test/form/definitions/feedback.json +0 -45
  296. package/test/form/definitions/fields-optional.js +0 -402
  297. package/test/form/definitions/fields-required.js +0 -402
  298. package/test/form/definitions/file-upload-basic.js +0 -44
  299. package/test/form/definitions/file-upload.js +0 -66
  300. package/test/form/definitions/minimal.js +0 -39
  301. package/test/form/definitions/phase-alpha.json +0 -33
  302. package/test/form/definitions/phase-default.json +0 -26
  303. package/test/form/definitions/radios.json +0 -88
  304. package/test/form/definitions/repeat-mixed.js +0 -54
  305. package/test/form/definitions/repeat.js +0 -70
  306. package/test/form/definitions/status.json +0 -126
  307. package/test/form/definitions/templates.js +0 -183
  308. package/test/form/definitions/test.json +0 -581
  309. package/test/form/definitions/text.json +0 -75
  310. package/test/form/definitions/titles.json +0 -170
  311. package/test/form/definitions.test.js +0 -47
  312. package/test/form/exit-page.test.js +0 -210
  313. package/test/form/feedback.test.js +0 -68
  314. package/test/form/fields-optional.test.js +0 -237
  315. package/test/form/fields-required.test.js +0 -294
  316. package/test/form/file-upload.test.js +0 -313
  317. package/test/form/govuk-notify.test.js +0 -449
  318. package/test/form/journey-basic.test.js +0 -444
  319. package/test/form/persist-files.test.js +0 -227
  320. package/test/form/phase-banner.test.js +0 -71
  321. package/test/form/repeat.test.js +0 -628
  322. package/test/form/summary-submission-email.test.js +0 -95
  323. package/test/form/template.test.js +0 -288
  324. package/test/form/titles.test.js +0 -204
  325. package/test/helpers/component-helpers.js +0 -74
  326. package/test/utils/get-cookie.js +0 -42
  327. package/test/utils/get-form-definitions.js +0 -18
  328. package/tmp.pdf +0 -1
  329. package/tsconfig.json +0 -28
  330. package/webpack.config.js +0 -208
@@ -1,791 +0,0 @@
1
- import Boom from '@hapi/boom'
2
- import { type ResponseObject, type ResponseToolkit } from '@hapi/hapi'
3
- import { StatusCodes } from 'http-status-codes'
4
- import { ValidationError } from 'joi'
5
-
6
- import { PREVIEW_PATH_PREFIX } from '~/src/server/constants.js'
7
- import {
8
- checkEmailAddressForLiveFormSubmission,
9
- checkFormStatus,
10
- encodeUrl,
11
- engine,
12
- evaluateTemplate,
13
- getErrors,
14
- getExponentialBackoffDelay,
15
- getPageHref,
16
- proceed,
17
- safeGenerateCrumb,
18
- type GlobalScope
19
- } from '~/src/server/plugins/engine/helpers.js'
20
- import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
21
- import {
22
- createPage,
23
- type PageControllerClass
24
- } from '~/src/server/plugins/engine/pageControllers/helpers.js'
25
- import {
26
- type FormContext,
27
- type FormContextRequest
28
- } from '~/src/server/plugins/engine/types.js'
29
- import {
30
- FormAction,
31
- FormStatus,
32
- type FormRequest
33
- } from '~/src/server/routes/types.js'
34
- import definition from '~/test/form/definitions/basic.js'
35
- import templateDefinition from '~/test/form/definitions/templates.js'
36
-
37
- interface NunjucksContext {
38
- context: {
39
- globals: GlobalScope
40
- }
41
- }
42
-
43
- type EvaluateFilter = (this: NunjucksContext, template: unknown) => unknown
44
- type HrefFilter = (this: NunjucksContext, path: string) => string | undefined
45
-
46
- describe('Helpers', () => {
47
- let page: PageControllerClass
48
- let request: FormContextRequest
49
- let h: Pick<ResponseToolkit, 'redirect' | 'view'>
50
-
51
- beforeEach(() => {
52
- const model = new FormModel(definition, {
53
- basePath: 'test'
54
- })
55
-
56
- page = createPage(model, definition.pages[0])
57
- const pageUrl = new URL(page.href, 'http://example.com')
58
-
59
- request = {
60
- method: 'get',
61
- url: pageUrl,
62
- path: pageUrl.pathname,
63
- params: {
64
- path: 'licence',
65
- slug: 'test'
66
- },
67
- query: {},
68
- app: { model }
69
- }
70
-
71
- const response = {
72
- code: jest.fn().mockImplementation(() => response)
73
- }
74
-
75
- h = {
76
- redirect: jest.fn().mockImplementation(() => response),
77
- view: jest.fn()
78
- }
79
- })
80
-
81
- describe('proceed', () => {
82
- it.each([
83
- {
84
- href: 'https://www.gov.uk/help/privacy-notice',
85
-
86
- request: {
87
- method: 'get'
88
- } satisfies Partial<FormContextRequest>,
89
-
90
- redirect: {
91
- statusCode: StatusCodes.MOVED_TEMPORARILY
92
- } satisfies Partial<ResponseObject>
93
- },
94
- {
95
- href: '/test/full-name',
96
-
97
- request: {
98
- method: 'get'
99
- } satisfies Partial<FormContextRequest>,
100
-
101
- redirect: {
102
- statusCode: StatusCodes.MOVED_TEMPORARILY
103
- } satisfies Partial<ResponseObject>
104
- },
105
- {
106
- href: '/test/full-name',
107
-
108
- request: {
109
- method: 'post',
110
- payload: {
111
- action: FormAction.Validate
112
- }
113
- } satisfies Partial<FormContextRequest>,
114
-
115
- redirect: {
116
- statusCode: StatusCodes.SEE_OTHER
117
- } satisfies Partial<ResponseObject>
118
- }
119
- ])(
120
- 'should redirect to the path provided',
121
- ({ href, redirect, ...options }) => {
122
- request = { ...request, ...options.request }
123
-
124
- const response = proceed(request, h, href)
125
-
126
- expect(h.view).not.toHaveBeenCalled()
127
- expect(h.redirect).toHaveBeenCalledWith(href)
128
- expect(response.code).toHaveBeenCalledWith(redirect.statusCode)
129
- }
130
- )
131
-
132
- it.each([
133
- {
134
- href: '/test/full-name',
135
-
136
- request: {
137
- method: 'post',
138
- payload: {
139
- action: FormAction.Validate
140
- },
141
- query: {
142
- myParam1: 'myValue1',
143
- myParam2: 'myValue2',
144
- returnUrl: '/test/summary'
145
- }
146
- } satisfies Partial<FormContextRequest>,
147
-
148
- redirect: {
149
- statusCode: StatusCodes.SEE_OTHER
150
- } satisfies Partial<ResponseObject>
151
- }
152
- ])(
153
- "should redirect to the 'returnUrl' query param provided (relative paths)",
154
- ({ href, redirect, ...options }) => {
155
- request = { ...request, ...options.request }
156
-
157
- const response = proceed(request, h, href)
158
-
159
- expect(h.view).not.toHaveBeenCalled()
160
- expect(h.redirect).toHaveBeenCalledWith(request.query.returnUrl)
161
- expect(response.code).toHaveBeenCalledWith(redirect.statusCode)
162
- }
163
- )
164
-
165
- it.each([
166
- {
167
- href: '/test/full-name',
168
-
169
- request: {
170
- method: 'get',
171
- query: { returnUrl: 'slash-missing' }
172
- } satisfies Partial<FormContextRequest>,
173
-
174
- redirect: {
175
- statusCode: StatusCodes.MOVED_TEMPORARILY
176
- } satisfies Partial<ResponseObject>
177
- },
178
- {
179
- href: '/test/full-name',
180
-
181
- request: {
182
- method: 'post',
183
- payload: {
184
- action: FormAction.Validate
185
- },
186
- query: { returnUrl: 'https://www.gov.uk/help/privacy-notice' }
187
- } satisfies Partial<FormContextRequest>,
188
-
189
- redirect: {
190
- statusCode: StatusCodes.SEE_OTHER
191
- } satisfies Partial<ResponseObject>
192
- },
193
- {
194
- href: '/test/repeater/example',
195
-
196
- request: {
197
- method: 'post',
198
- query: {
199
- myParam1: 'myValue1',
200
- myParam2: 'myValue2',
201
- returnUrl: '/test/repeater/summary'
202
- },
203
- payload: {
204
- action: FormAction.AddAnother
205
- }
206
- } satisfies Partial<FormContextRequest>,
207
-
208
- redirect: {
209
- statusCode: StatusCodes.MOVED_TEMPORARILY
210
- } satisfies Partial<ResponseObject>
211
- }
212
- ])(
213
- "should not redirect to the 'returnUrl' query param provided (other paths)",
214
- ({ href, ...options }) => {
215
- request = { ...request, ...options.request }
216
-
217
- proceed(request, h, href)
218
- expect(h.redirect).not.toHaveBeenCalledWith(request.query.returnUrl)
219
- }
220
- )
221
- })
222
-
223
- describe('encodeUrl', () => {
224
- it.each([
225
- {
226
- input: 'http://example.com?myParam=has spaces&more£',
227
- output: 'http://example.com/?myParam=has%20spaces&more%C2%A3'
228
- },
229
- {
230
- input: 'mailto:hello@example.com?subject=has spaces&body=more£',
231
- output: 'mailto:hello@example.com?subject=has%20spaces&body=more%C2%A3'
232
- }
233
- ])('should percent encode parameters', ({ input, output }) => {
234
- const returned = encodeUrl(input)
235
- expect(returned).toBe(output)
236
- })
237
-
238
- it('should return undefined when no url is provided', () => {
239
- const returned = encodeUrl()
240
- expect(returned).toBeUndefined()
241
- })
242
-
243
- it('should throw when invalid url is provided', () => {
244
- expect(() => encodeUrl('not a url')).toThrow()
245
- })
246
- })
247
-
248
- describe('getPageHref', () => {
249
- it('should return page href', () => {
250
- const returned = getPageHref(page)
251
- expect(returned).toEqual(page.href)
252
- })
253
-
254
- it('should return page href (path override)', () => {
255
- const nextPath = '/badgers/monkeys'
256
- const nextHref = '/test/badgers/monkeys'
257
-
258
- const returned = getPageHref(page, nextPath)
259
- expect(returned).toEqual(nextHref)
260
- })
261
-
262
- it('should return page href without query params', () => {
263
- request.query.myParam = 'myValue'
264
- request.query.myParam2 = 'myValue2'
265
-
266
- const returned = getPageHref(page)
267
- expect(returned).toEqual(page.href)
268
- })
269
-
270
- it('should return page href (path override) without query params', () => {
271
- request.query.myParam = 'myValue'
272
- request.query.myParam2 = 'myValue2'
273
-
274
- const nextPath = '/badgers/monkeys'
275
- const nextHref = '/test/badgers/monkeys'
276
-
277
- const returned = getPageHref(page, nextPath)
278
- expect(returned).toEqual(nextHref)
279
- })
280
-
281
- it('should return page href with new query params', () => {
282
- const returned = getPageHref(page, {
283
- returnUrl: page.getSummaryPath(),
284
- badger: 'monkeys'
285
- })
286
-
287
- expect(returned).toBe(
288
- `${page.href}?returnUrl=${encodeURIComponent('/summary')}&badger=monkeys`
289
- )
290
- })
291
-
292
- it('should return page href (path override) with new query params', () => {
293
- const nextPath = '/badgers/monkeys'
294
- const nextHref = '/test/badgers/monkeys'
295
-
296
- const returned = getPageHref(page, nextPath, {
297
- returnUrl: page.getSummaryPath(),
298
- badger: 'monkeys'
299
- })
300
-
301
- expect(returned).toBe(
302
- `${nextHref}?returnUrl=${encodeURIComponent('/summary')}&badger=monkeys`
303
- )
304
- })
305
-
306
- it('should throw when absolute URL is provided', () => {
307
- expect(() =>
308
- getPageHref(page, 'https://www.gov.uk/help/privacy-notice')
309
- ).toThrow('Only relative URLs are allowed')
310
- })
311
- })
312
-
313
- describe('checkFormStatus', () => {
314
- it('should return true/live for paths starting with PREVIEW_PATH_PREFIX and form is live', () => {
315
- const path = `${PREVIEW_PATH_PREFIX}/live/another/segment`
316
- expect(checkFormStatus(path)).toStrictEqual({
317
- state: FormStatus.Live,
318
- isPreview: true
319
- })
320
- })
321
-
322
- it('should return false for paths not starting with PREVIEW_PATH_PREFIX', () => {
323
- const path = '/some/other/path'
324
- expect(checkFormStatus(path)).toStrictEqual({
325
- state: FormStatus.Live,
326
- isPreview: false
327
- })
328
- })
329
-
330
- it('should be case insensitive and return draft when form is draft', () => {
331
- const path = `${PREVIEW_PATH_PREFIX.toUpperCase()}/draft/path`
332
- expect(checkFormStatus(path)).toStrictEqual({
333
- state: FormStatus.Draft,
334
- isPreview: true
335
- })
336
- })
337
-
338
- it('should throw an error for invalid form state', () => {
339
- const path = `${PREVIEW_PATH_PREFIX}/invalid-state`
340
- expect(() => checkFormStatus(path)).toThrow(
341
- 'Invalid form state: invalid-state'
342
- )
343
- })
344
- })
345
-
346
- describe('checkEmailAddressForLiveFormSubmission', () => {
347
- it('should throw an error if emailAddress is undefined and isPreview is false', () => {
348
- expect(() =>
349
- checkEmailAddressForLiveFormSubmission(undefined, false)
350
- ).toThrow(
351
- Boom.internal(
352
- 'An email address is required to complete the form submission'
353
- )
354
- )
355
- })
356
-
357
- it('should not throw an error if emailAddress is defined and isPreview is false', () => {
358
- expect(() =>
359
- checkEmailAddressForLiveFormSubmission('test@example.com', false)
360
- ).not.toThrow()
361
- })
362
-
363
- it('should not throw an error if emailAddress is undefined and isPreview is true', () => {
364
- expect(() =>
365
- checkEmailAddressForLiveFormSubmission(undefined, true)
366
- ).not.toThrow()
367
- })
368
-
369
- it('should not throw an error if emailAddress is defined and isPreview is true', () => {
370
- expect(() =>
371
- checkEmailAddressForLiveFormSubmission('test@example.com', true)
372
- ).not.toThrow()
373
- })
374
- })
375
-
376
- describe('getErrors', () => {
377
- it('formats dates with ISO strings', () => {
378
- const { details } = new ValidationError(
379
- 'Date of marriage example',
380
- [
381
- {
382
- message:
383
- 'Date of marriage must be on or before 2021-12-25T00:00:00.000Z',
384
- path: ['dateField'],
385
- type: 'date.max',
386
- context: {
387
- key: 'dateField',
388
- title: 'date of marriage'
389
- }
390
- }
391
- ],
392
- undefined
393
- )
394
-
395
- expect(getErrors(details)).toEqual([
396
- {
397
- path: ['dateField'],
398
- href: '#dateField',
399
- name: 'dateField',
400
- text: 'Date of marriage must be on or before 25 December 2021',
401
- context: {
402
- key: 'dateField',
403
- title: 'date of marriage'
404
- }
405
- }
406
- ])
407
- })
408
-
409
- it('does not format the first letter to uppercase', () => {
410
- const { details } = new ValidationError(
411
- 'Date of marriage example',
412
- [
413
- {
414
- message: 'something invalid',
415
- path: ['yesNoField'],
416
- type: 'string.pattern.base',
417
- context: {
418
- key: 'yesNoField'
419
- }
420
- }
421
- ],
422
- undefined
423
- )
424
-
425
- expect(getErrors(details)).toEqual([
426
- {
427
- path: ['yesNoField'],
428
- href: '#yesNoField',
429
- name: 'yesNoField',
430
- text: 'something invalid',
431
- context: {
432
- key: 'yesNoField'
433
- }
434
- }
435
- ])
436
- })
437
- })
438
-
439
- describe('safeGenerateCrumb', () => {
440
- it('should return undefined when request.state is missing (malformed request)', () => {
441
- const malformedRequest = {
442
- server: {
443
- plugins: {
444
- crumb: {
445
- generate: jest.fn()
446
- }
447
- }
448
- },
449
- plugins: {},
450
- route: { settings: { plugins: {} } },
451
- path: '/test',
452
- url: { search: '' }
453
- // state intentionally omitted
454
- } as unknown as FormRequest
455
-
456
- const crumbToken = safeGenerateCrumb(malformedRequest)
457
- expect(crumbToken).toBeUndefined()
458
- expect(
459
- malformedRequest.server.plugins.crumb.generate
460
- ).not.toHaveBeenCalled()
461
- })
462
-
463
- it('should return undefined if crumb is disabled in route settings', () => {
464
- const requestWithDisabledCrumb = {
465
- server: {
466
- plugins: {
467
- crumb: {
468
- generate: jest.fn().mockReturnValue('test-token')
469
- }
470
- }
471
- },
472
- plugins: {},
473
- route: { settings: { plugins: { crumb: false } } },
474
- path: '/test',
475
- url: { search: '' },
476
- state: {}
477
- } as unknown as FormRequest
478
-
479
- const crumbToken = safeGenerateCrumb(requestWithDisabledCrumb)
480
- expect(crumbToken).toBeUndefined()
481
- expect(
482
- requestWithDisabledCrumb.server.plugins.crumb.generate
483
- ).not.toHaveBeenCalled()
484
- })
485
-
486
- it('should generate crumb when state exists and crumb plugin is available', () => {
487
- const mockCrumb = 'generated-crumb-value'
488
- const validRequest = {
489
- server: {
490
- plugins: {
491
- crumb: {
492
- generate: jest.fn().mockReturnValue(mockCrumb)
493
- }
494
- }
495
- },
496
- plugins: {},
497
- route: { settings: { plugins: {} } },
498
- path: '/test',
499
- url: { search: '' },
500
- state: {}
501
- } as unknown as FormRequest
502
-
503
- const crumbToken = safeGenerateCrumb(validRequest)
504
- expect(crumbToken).toBe(mockCrumb)
505
- expect(validRequest.server.plugins.crumb.generate).toHaveBeenCalledWith(
506
- validRequest
507
- )
508
- })
509
- })
510
-
511
- describe('getExponentialBackoffDelay', () => {
512
- it.each([
513
- { depth: 1, expected: 2000 },
514
- { depth: 2, expected: 4000 },
515
- { depth: 3, expected: 8000 },
516
- { depth: 4, expected: 16000 },
517
- { depth: 5, expected: 25000 },
518
- { depth: 6, expected: 25000 },
519
- { depth: 7, expected: 25000 }
520
- ])(
521
- 'should calculate correct delay for depth $depth',
522
- ({ depth, expected }) => {
523
- expect(getExponentialBackoffDelay(depth)).toBe(expected)
524
- }
525
- )
526
-
527
- it('should handle depth of 0', () => {
528
- expect(getExponentialBackoffDelay(0)).toBe(1000)
529
- })
530
-
531
- it('should handle negative depth', () => {
532
- expect(getExponentialBackoffDelay(-1)).toBe(500)
533
- })
534
-
535
- it('should cap at 25 seconds (25000ms) even for large depths', () => {
536
- // For depth 10: 2000 * 2^(9) would be too high, so it should be capped
537
- expect(getExponentialBackoffDelay(10)).toBe(25000)
538
- expect(getExponentialBackoffDelay(20)).toBe(25000)
539
- })
540
- })
541
-
542
- describe('evaluateTemplate', () => {
543
- let model: FormModel
544
- let formContext: FormContext
545
-
546
- beforeEach(() => {
547
- model = new FormModel(templateDefinition, {
548
- basePath: 'template'
549
- })
550
-
551
- formContext = {
552
- evaluationState: {},
553
- relevantState: {},
554
- relevantPages: [],
555
- payload: {},
556
- state: {},
557
- paths: [],
558
- isForceAccess: false,
559
- data: {},
560
- pageDefMap: model.pageDefMap,
561
- listDefMap: model.listDefMap,
562
- componentDefMap: model.componentDefMap,
563
- pageMap: model.pageMap,
564
- componentMap: model.componentMap
565
- }
566
- })
567
-
568
- it('should replace placeholders with values from form context relevantState', () => {
569
- Object.assign(formContext.relevantState, {
570
- WmHfSb: 'Enrique Chase'
571
- })
572
-
573
- const areYouInEngland = templateDefinition.pages[2]
574
- expect(areYouInEngland.title).toBe('Are you in England, {{ WmHfSb }}?')
575
-
576
- const result = evaluateTemplate(areYouInEngland.title, formContext)
577
- expect(result).toBe('Are you in England, Enrique Chase?')
578
- })
579
-
580
- it('should replace placeholders with values from form context data', () => {
581
- Object.assign(formContext.data, {
582
- score: 'Low'
583
- })
584
-
585
- const result = evaluateTemplate(
586
- 'Your score is: {{ context.data.score }}',
587
- formContext
588
- )
589
-
590
- expect(result).toBe('Your score is: Low')
591
- })
592
-
593
- it('evaluate filter should evaluate a liquid template', () => {
594
- Object.assign(formContext.relevantState, {
595
- WmHfSb: 'Enrique Chase'
596
- })
597
-
598
- const result = evaluateTemplate(
599
- '{{ "Hello, {{ WmHfSb }}!" | evaluate }}',
600
- formContext
601
- )
602
-
603
- expect(result).toBe('Hello, Enrique Chase!')
604
- })
605
-
606
- it('page filter should return the page definition', () => {
607
- // @ts-expect-error - spyOn type issue
608
- const filterSpy = jest.spyOn(engine.filters, 'page')
609
- const result = evaluateTemplate(
610
- '{%- assign startPageDef = "/start" | page -%}{{ startPageDef.title }}',
611
- formContext
612
- )
613
-
614
- expect(filterSpy).toHaveBeenCalledWith('/start')
615
- expect(result).toBe('Start page')
616
- })
617
-
618
- it('page filter should return empty when anything but a string is passed', () => {
619
- // @ts-expect-error - spyOn type issue
620
- const pageFilterSpy = jest.spyOn(engine.filters, 'page')
621
-
622
- let result = evaluateTemplate('{{ 0 | page }}', formContext)
623
- expect(pageFilterSpy).toHaveBeenLastCalledWith(0)
624
- expect(result).toBe('')
625
-
626
- result = evaluateTemplate('{{ undefined | page }}', formContext)
627
- expect(pageFilterSpy).toHaveBeenLastCalledWith(undefined)
628
- expect(result).toBe('')
629
-
630
- result = evaluateTemplate('{{ null | page }}', formContext)
631
- expect(result).toBe('')
632
-
633
- result = evaluateTemplate('{{ false | page }}', formContext)
634
- expect(pageFilterSpy).toHaveBeenLastCalledWith(false)
635
- expect(result).toBe('')
636
-
637
- result = evaluateTemplate('{{ [] | page }}', formContext)
638
- expect(result).toBe('')
639
- })
640
-
641
- it('href filter should return the page href', () => {
642
- // @ts-expect-error - spyOn type issue
643
- const filterSpy = jest.spyOn(engine.filters, 'href')
644
- const result = evaluateTemplate('{{ "/full-name" | href }}', formContext)
645
-
646
- expect(filterSpy).toHaveBeenCalledWith('/full-name')
647
- expect(result).toBe('/template/full-name')
648
- })
649
-
650
- it('href filter should return empty when no page passed', () => {
651
- // @ts-expect-error - spyOn type issue
652
- const pageFilterSpy = jest.spyOn(engine.filters, 'href')
653
-
654
- const result = evaluateTemplate('{{ undefined | href }}', formContext)
655
- expect(pageFilterSpy).toHaveBeenLastCalledWith(undefined)
656
- expect(result).toBe('')
657
- })
658
-
659
- it('field filter should return the component definition', () => {
660
- // @ts-expect-error - spyOn type issue
661
- const filterSpy = jest.spyOn(engine.filters, 'field')
662
- const result = evaluateTemplate(
663
- '{%- assign fullNameComponentDef = "WmHfSb" | field -%}{{ fullNameComponentDef.title }}',
664
- formContext
665
- )
666
-
667
- expect(filterSpy).toHaveBeenCalledWith('WmHfSb')
668
- expect(result).toBe('What&#39;s your full name?')
669
- })
670
-
671
- it('field filter should return empty when anything but a string is passed', () => {
672
- // @ts-expect-error - spyOn type issue
673
- const pageFilterSpy = jest.spyOn(engine.filters, 'field')
674
-
675
- let result = evaluateTemplate('{{ 0 | field }}', formContext)
676
- expect(pageFilterSpy).toHaveBeenLastCalledWith(0)
677
- expect(result).toBe('')
678
-
679
- result = evaluateTemplate('{{ undefined | field }}', formContext)
680
- expect(pageFilterSpy).toHaveBeenLastCalledWith(undefined)
681
- expect(result).toBe('')
682
-
683
- result = evaluateTemplate('{{ null | field }}', formContext)
684
- expect(result).toBe('')
685
-
686
- result = evaluateTemplate('{{ false | field }}', formContext)
687
- expect(pageFilterSpy).toHaveBeenLastCalledWith(false)
688
- expect(result).toBe('')
689
-
690
- result = evaluateTemplate('{{ [] | field }}', formContext)
691
- expect(result).toBe('')
692
- })
693
-
694
- it('answer filter should return the formatted submitted answer', () => {
695
- Object.assign(formContext.relevantState, {
696
- TKsWbP: true,
697
- WmHfSb: 'Enrique Chase'
698
- })
699
-
700
- // @ts-expect-error - spyOn type issue
701
- const filterSpy = jest.spyOn(engine.filters, 'answer')
702
-
703
- let result = evaluateTemplate("{{ 'TKsWbP' | answer }}", formContext)
704
- expect(filterSpy).toHaveBeenCalledWith('TKsWbP')
705
- expect(result).toBe('Yes')
706
-
707
- result = evaluateTemplate("{{ 'WmHfSb' | answer }}", formContext)
708
- expect(filterSpy).toHaveBeenCalledWith('WmHfSb')
709
- expect(result).toBe('Enrique Chase')
710
- })
711
-
712
- it('answer filter should return empty when anything but a string is passed', () => {
713
- // @ts-expect-error - spyOn type issue
714
- const pageFilterSpy = jest.spyOn(engine.filters, 'answer')
715
-
716
- let result = evaluateTemplate('{{ 0 | answer }}', formContext)
717
- expect(pageFilterSpy).toHaveBeenLastCalledWith(0)
718
- expect(result).toBe('')
719
-
720
- result = evaluateTemplate('{{ undefined | answer }}', formContext)
721
- expect(pageFilterSpy).toHaveBeenLastCalledWith(undefined)
722
- expect(result).toBe('')
723
-
724
- result = evaluateTemplate('{{ null | answer }}', formContext)
725
- expect(result).toBe('')
726
-
727
- result = evaluateTemplate('{{ false | answer }}', formContext)
728
- expect(pageFilterSpy).toHaveBeenLastCalledWith(false)
729
- expect(result).toBe('')
730
-
731
- result = evaluateTemplate('{{ [] | answer }}', formContext)
732
- expect(result).toBe('')
733
- })
734
-
735
- it('answer filter should return empty when non-form component name is passed', () => {
736
- // @ts-expect-error - spyOn type issue
737
- const pageFilterSpy = jest.spyOn(engine.filters, 'answer')
738
-
739
- const result = evaluateTemplate('{{ "FGyiLS" | answer }}', formContext)
740
- expect(pageFilterSpy).toHaveBeenLastCalledWith('FGyiLS')
741
- expect(result).toBe('')
742
- })
743
- })
744
-
745
- describe('Nunjucks filters', () => {
746
- describe('evaluate filter', () => {
747
- it('returns non-string values unchanged', () => {
748
- const mockContext: NunjucksContext = {
749
- context: {
750
- globals: {
751
- context: { pageMap: new Map() } as FormContext,
752
- pages: new Map(),
753
- components: new Map()
754
- }
755
- }
756
- }
757
-
758
- const numResult = (
759
- engine.filters.evaluate as unknown as EvaluateFilter
760
- ).call(mockContext, 123)
761
- expect(numResult).toBe(123)
762
-
763
- const objResult = (
764
- engine.filters.evaluate as unknown as EvaluateFilter
765
- ).call(mockContext, { foo: 'bar' })
766
- expect(objResult).toEqual({ foo: 'bar' })
767
- })
768
- })
769
-
770
- describe('href filter', () => {
771
- it('returns undefined when page is undefined', () => {
772
- const mockContext: NunjucksContext = {
773
- context: {
774
- globals: {
775
- context: { pageMap: new Map() } as FormContext,
776
- pages: new Map(),
777
- components: new Map()
778
- }
779
- }
780
- }
781
-
782
- const result = (engine.filters.href as unknown as HrefFilter).call(
783
- mockContext,
784
- '/some-page'
785
- )
786
-
787
- expect(result).toBeUndefined()
788
- })
789
- })
790
- })
791
- })