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