@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
|
@@ -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
|
-
|
|
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
|
});
|