@planning-inspectorate/dynamic-forms 3.15.2 → 3.15.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planning-inspectorate/dynamic-forms",
3
- "version": "3.15.2",
3
+ "version": "3.15.3",
4
4
  "description": "This package is for building GDS forms using a configuration-based approach.",
5
5
  "main": "./src/index.js",
6
6
  "type": "module",
@@ -40,7 +40,11 @@ async function validateQuestion(questionObj, req, journeyResponse = {}) {
40
40
  const validationRules = validation.validate(questionObj, journeyResponse);
41
41
 
42
42
  if (validationRules instanceof Array) {
43
- await Promise.all(validationRules.map((validator) => validator.run(req)));
43
+ // Intentionally run validators sequentially to ensure
44
+ // errors are collected in the same order as the rules array
45
+ for (const validator of validationRules) {
46
+ await validator.run(req);
47
+ }
44
48
 
45
49
  const errors = validationResult(req);
46
50
  const mappedErrors = errors.mapped();
@@ -4,6 +4,7 @@ import validate from './validator.js';
4
4
  import RequiredValidator from './required-validator.js';
5
5
  import ValidOptionValidator from './valid-option-validator.js';
6
6
  import AddressValidator from './address-validator.js';
7
+ import DateValidator from '#src/validator/date-validator.js';
7
8
 
8
9
  describe('./src/dynamic-forms/validator/validator.js', () => {
9
10
  let mockRes;
@@ -242,4 +243,51 @@ describe('./src/dynamic-forms/validator/validator.js', () => {
242
243
  assert.strictEqual(postcode._errors.length, 0);
243
244
  assert.strictEqual(next.mock.callCount(), 1);
244
245
  });
246
+
247
+ it('should display errors from a multi-field array validator in correct order (e.g., day, month, year)', async () => {
248
+ const req = {
249
+ params: {
250
+ section: 1,
251
+ question: 1,
252
+ referenceId: 'abc'
253
+ },
254
+ body: {
255
+ field1_day: '32',
256
+ field1_month: '13',
257
+ field1_year: '99'
258
+ }
259
+ };
260
+
261
+ mockRes.locals.journey = {
262
+ getQuestionByParams: function () {
263
+ return {
264
+ validators: [new DateValidator('the date')],
265
+ fieldName: 'field1'
266
+ };
267
+ }
268
+ };
269
+
270
+ const next = mock.fn();
271
+ await validate(req, mockRes, next);
272
+
273
+ const { validationResult } = await import('express-validator');
274
+ const errors = validationResult(req);
275
+ const mappedErrors = errors.mapped();
276
+ const errorKeys = Object.keys(mappedErrors);
277
+
278
+ // Verify all three errors exist
279
+ assert.strictEqual(errorKeys.includes('field1_day'), true, 'Missing day error');
280
+ assert.strictEqual(errorKeys.includes('field1_month'), true, 'Missing month error');
281
+ assert.strictEqual(errorKeys.includes('field1_year'), true, 'Missing year error');
282
+
283
+ // Verify errors are in the correct order: day, month, year
284
+ const dayIndex = errorKeys.indexOf('field1_day');
285
+ const monthIndex = errorKeys.indexOf('field1_month');
286
+ const yearIndex = errorKeys.indexOf('field1_year');
287
+
288
+ assert.strictEqual(dayIndex < monthIndex, true, 'Day error should come before month error');
289
+ assert.strictEqual(monthIndex < yearIndex, true, 'Month error should come before year error');
290
+
291
+ assert.strictEqual(next.mock.callCount(), 1);
292
+ });
245
293
  });