UNPKG

26.2 kBJavaScriptView Raw
1var assert = require("assert"),
2 form = require("../index"),
3 validate = form.validate;
4
5module.exports = {
6 'validate : isDate': function() {
7 // Skip validating empty values
8 var request = { body: {} };
9 form(validate("field").isDate())(request, {});
10 assert.equal(request.form.errors.length, 0);
11
12 // Failure.
13 var request = { body: { field: "fail" }};
14 form(validate("field").isDate())(request, {});
15 assert.equal(request.form.errors.length, 1);
16 assert.equal(request.form.errors[0], "field is not a date");
17
18 // Failure w/ custom message.
19 var request = { body: { field: "fail" }};
20 form(validate("field").isDate("!!! %s !!!"))(request, {});
21 assert.equal(request.form.errors.length, 1);
22 assert.equal(request.form.errors[0], "!!! field !!!");
23
24 // Success
25 var request = { body: { field: "01/29/2012" }};
26 form(validate("field").isDate())(request, {});
27 assert.equal(request.form.errors.length, 0);
28 },
29
30 'validate : isEmail': function() {
31 // Skip validating empty values
32 var request = { body: {} };
33 form(validate("field").isEmail())(request, {});
34 assert.equal(request.form.errors.length, 0);
35
36 // Failure.
37 var request = { body: { field: "fail" }};
38 form(validate("field").isEmail())(request, {});
39 assert.equal(request.form.errors.length, 1);
40 assert.equal(request.form.errors[0], "field is not an email address");
41
42 // Failure w/ custom message.
43 var request = { body: { field: "fail" }};
44 form(validate("field").isEmail("!!! %s !!!"))(request, {});
45 assert.equal(request.form.errors.length, 1);
46 assert.equal(request.form.errors[0], "!!! field !!!");
47
48 // Success
49 var request = { body: { field: "me@dandean.com" }};
50 form(validate("field").isEmail())(request, {});
51 assert.equal(request.form.errors.length, 0);
52
53 var validEmails = [
54 "user@host.com",
55 "user@host.info",
56 "user@host.co.uk",
57 "user+service@host.co.uk",
58 "user-ok.yes+tag@host.k12.mi.us",
59 "FirstNameLastName2000@hotmail.com"
60 ];
61
62 for (var i in validEmails) {
63 var request = { body: { field: validEmails[i] }};
64 form(validate("field").isEmail())(request, {});
65 assert.equal(request.form.errors.length, 0, 'failed to validate email: ' + validEmails[i]);
66 }
67
68 var badEmails = [
69 "dontvalidateme",
70 "nope@",
71 "someUser",
72 "<script@host.com",
73 "userawesome*@host.com",
74 "userawesom@ok.com?&vl=1"
75 ];
76
77 for (var i in badEmails) {
78 var request = { body: { field: badEmails[i] }};
79 form(validate("field").isEmail())(request, {});
80 assert.equal(request.form.errors.length, 1, 'should not validate email: ' + badEmails[i]);
81 }
82
83 },
84
85 'validate : isUrl': function() {
86 // Failure.
87 var request = { body: { field: "fail" }};
88 form(validate("field").isUrl())(request, {});
89 assert.equal(request.form.errors.length, 1);
90 assert.equal(request.form.errors[0], "field is not a URL");
91
92 // Failure w/ custom message.
93 var request = { body: { field: "fail" }};
94 form(validate("field").isUrl("!!! %s !!!"))(request, {});
95 assert.equal(request.form.errors.length, 1);
96 assert.equal(request.form.errors[0], "!!! field !!!");
97
98 // Success
99 var request = { body: { field: "http://www.google.com" }};
100 form(validate("field").isUrl())(request, {});
101 assert.equal(request.form.errors.length, 0);
102 },
103
104 'validate : isIP': function() {
105 // Failure.
106 var request = { body: { field: "fail" }};
107 form(validate("field").isIP())(request, {});
108 assert.equal(request.form.errors.length, 1);
109 assert.equal(request.form.errors[0], "field is not an IP address");
110
111 // Failure w/ custom message.
112 var request = { body: { field: "fail" }};
113 form(validate("field").isIP("!!! %s !!!"))(request, {});
114 assert.equal(request.form.errors.length, 1);
115 assert.equal(request.form.errors[0], "!!! field !!!");
116
117 // Success
118 var request = { body: { field: "0.0.0.0" }};
119 form(validate("field").isIP())(request, {});
120 assert.equal(request.form.errors.length, 0);
121 },
122
123 'validate : isAlpha': function() {
124 // Failure.
125 var request = { body: { field: "123456" }};
126 form(validate("field").isAlpha())(request, {});
127 assert.equal(request.form.errors.length, 1);
128 assert.equal(request.form.errors[0], "field contains non-letter characters");
129
130 // Failure w/ custom message.
131 var request = { body: { field: "123456" }};
132 form(validate("field").isAlpha("!!! %s !!!"))(request, {});
133 assert.equal(request.form.errors.length, 1);
134 assert.equal(request.form.errors[0], "!!! field !!!");
135
136 // Success
137 var request = { body: { field: "abcde" }};
138 form(validate("field").isAlpha())(request, {});
139 assert.equal(request.form.errors.length, 0);
140 },
141
142 'validate : isAlphanumeric': function() {
143 // Failure.
144 var request = { body: { field: "------" }};
145 form(validate("field").isAlphanumeric())(request, {});
146 assert.equal(request.form.errors.length, 1);
147 assert.equal(request.form.errors[0], "field contains non alpha-numeric characters");
148
149 // Failure w/ custom message.
150 var request = { body: { field: "------" }};
151 form(validate("field").isAlphanumeric("!!! %s !!!"))(request, {});
152 assert.equal(request.form.errors.length, 1);
153 assert.equal(request.form.errors[0], "!!! field !!!");
154
155 // Success
156 var request = { body: { field: "abc123" }};
157 form(validate("field").isAlphanumeric())(request, {});
158 assert.equal(request.form.errors.length, 0);
159 },
160
161 'validate : isNumeric': function() {
162 // Failure.
163 var request = { body: { field: "------" }};
164 form(validate("field").isNumeric())(request, {});
165 assert.equal(request.form.errors.length, 1);
166 assert.equal(request.form.errors[0], "field is not a number");
167
168 // Failure w/ custom message.
169 var request = { body: { field: "------" }};
170 form(validate("field").isNumeric("!!! %s !!!"))(request, {});
171 assert.equal(request.form.errors.length, 1);
172 assert.equal(request.form.errors[0], "!!! field !!!");
173
174 // Success Int
175 var request = { body: {
176 integer: "123456",
177 floating: "123456.45",
178 negative: "-123456.45",
179 positive: "+123456.45",
180 padded: "000045.343"
181 }};
182 form(
183 validate("integer").isNumeric(),
184 validate("floating").isNumeric(),
185 validate("negative").isNumeric(),
186 validate("positive").isNumeric(),
187 validate("padded").isNumeric()
188 )(request, {});
189 assert.equal(request.form.errors.length, 0);
190 },
191
192 'validate : isInt': function() {
193 // Failure.
194 var request = { body: { field: "------" }};
195 form(validate("field").isInt())(request, {});
196 assert.equal(request.form.errors.length, 1);
197 assert.equal(request.form.errors[0], "field is not an integer");
198
199 // Failure w/ custom message.
200 var request = { body: { field: "------" }};
201 form(validate("field").isInt("!!! %s !!!"))(request, {});
202 assert.equal(request.form.errors.length, 1);
203 assert.equal(request.form.errors[0], "!!! field !!!");
204
205 // Success
206 var request = { body: { field: "50" }};
207 form(validate("field").isInt())(request, {});
208 assert.equal(request.form.errors.length, 0);
209 },
210
211 'validate : isLowercase': function() {
212 // Failure.
213 var request = { body: { field: "FAIL" }};
214 form(validate("field").isLowercase())(request, {});
215 assert.equal(request.form.errors.length, 1);
216 assert.equal(request.form.errors[0], "field contains uppercase letters");
217
218 // Failure w/ custom message.
219 var request = { body: { field: "FAIL" }};
220 form(validate("field").isInt("!!! %s !!!"))(request, {});
221 assert.equal(request.form.errors.length, 1);
222 assert.equal(request.form.errors[0], "!!! field !!!");
223
224 // Success
225 var request = { body: { field: "win" }};
226 form(validate("field").isLowercase())(request, {});
227 assert.equal(request.form.errors.length, 0);
228 },
229
230 'validate : isUppercase': function() {
231 // Failure.
232 var request = { body: { field: "fail" }};
233 form(validate("field").isUppercase())(request, {});
234 assert.equal(request.form.errors.length, 1);
235 assert.equal(request.form.errors[0], "field contains lowercase letters");
236
237 // Failure w/ custom message.
238 var request = { body: { field: "fail" }};
239 form(validate("field").isUppercase("!!! %s !!!"))(request, {});
240 assert.equal(request.form.errors.length, 1);
241 assert.equal(request.form.errors[0], "!!! field !!!");
242
243 // Success
244 var request = { body: { field: "WIN" }};
245 form(validate("field").isUppercase())(request, {});
246 assert.equal(request.form.errors.length, 0);
247 },
248
249 'validate : isFloat': function() {
250 // Failure.
251 var request = { body: { field: "5000" }};
252 form(validate("field").isFloat())(request, {});
253 assert.equal(request.form.errors.length, 1);
254 assert.equal(request.form.errors[0], "field is not a decimal");
255
256 // Failure w/ custom message.
257 var request = { body: { field: "5000" }};
258 form(validate("field").isFloat("!!! %s !!!"))(request, {});
259 assert.equal(request.form.errors.length, 1);
260 assert.equal(request.form.errors[0], "!!! field !!!");
261
262 // Success
263 var request = { body: { field: "5000.00" }};
264 form(validate("field").isFloat())(request, {});
265 assert.equal(request.form.errors.length, 0);
266 },
267
268 'validate : notEmpty': function() {
269 // Failure.
270 var request = { body: { field: " \t" }};
271 form(validate("field").notEmpty())(request, {});
272 assert.equal(request.form.errors.length, 1);
273 assert.equal(request.form.errors[0], "field has no value or is only whitespace");
274
275 // Failure w/ custom message.
276 var request = { body: { field: " \t" }};
277 form(validate("field").notEmpty("!!! %s !!!"))(request, {});
278 assert.equal(request.form.errors.length, 1);
279 assert.equal(request.form.errors[0], "!!! field !!!");
280
281 // Success
282 var request = { body: { field: "win" }};
283 form(validate("field").notEmpty())(request, {});
284 assert.equal(request.form.errors.length, 0);
285 },
286
287 'validate : equals': function() {
288 // Failure.
289 var request = { body: { field: "value" }};
290 form(validate("field").equals("other"))(request, {});
291 assert.equal(request.form.errors.length, 1);
292 assert.equal(request.form.errors[0], "field does not equal other");
293
294 // Failure w/ custom message.
295 var request = { body: { field: "value" }};
296 form(validate("field").equals("other", "!!! %s !!!"))(request, {});
297 assert.equal(request.form.errors.length, 1);
298 assert.equal(request.form.errors[0], "!!! field !!!");
299
300 // Success
301 var request = { body: { field: "value" }};
302 form(validate("field").equals("value"))(request, {});
303 assert.equal(request.form.errors.length, 0);
304
305
306 // Failure
307 var request = {
308 body: {
309 field1: "value1",
310 field2: "value2"
311 }
312 };
313 form(validate("field1").equals("field::field2"))(request, {});
314 assert.equal(request.form.errors.length, 1);
315 assert.equal(request.form.errors[0], "field1 does not equal value2");
316
317 // Success
318 var request = {
319 body: {
320 field1: "value",
321 field2: "value"
322 }
323 };
324 form(validate("field1").equals("field::field2"))(request, {});
325 assert.equal(request.form.errors.length, 0);
326
327 // Failure with nested values
328 var request = {
329 body: {
330 field1: { deep: "value1"},
331 field2: { deeper: "value2"}
332 }
333 };
334 form(validate("field1.deep").equals("field::field2[deeper]"))(request, {});
335 assert.equal(request.form.errors.length, 1);
336 assert.equal(request.form.errors[0], "field1.deep does not equal value2");
337
338 // Success with nested values
339 var request = {
340 body: {
341 field1: { deep: "value"},
342 field2: { deeper: "value"}
343 }
344 };
345 form(validate("field1[deep]").equals("field::field2.deeper"))(request, {});
346 assert.equal(request.form.errors.length, 0);
347 },
348
349 'validate : contains': function() {
350 // Failure.
351 var request = { body: { field: "value" }};
352 form(validate("field").contains("other"))(request, {});
353 assert.equal(request.form.errors.length, 1);
354 assert.equal(request.form.errors[0], "field does not contain required characters");
355
356 // Failure w/ custom message.
357 var request = { body: { field: "value" }};
358 form(validate("field").contains("other", "!!! %s !!!"))(request, {});
359 assert.equal(request.form.errors.length, 1);
360 assert.equal(request.form.errors[0], "!!! field !!!");
361
362 // Success
363 var request = { body: { field: "value" }};
364 form(validate("field").contains("alu"))(request, {});
365 assert.equal(request.form.errors.length, 0);
366 },
367
368 'validate : notContains': function() {
369 // Failure.
370 var request = { body: { field: "value" }};
371 form(validate("field").notContains("alu"))(request, {});
372 assert.equal(request.form.errors.length, 1);
373 assert.equal(request.form.errors[0], "field contains invalid characters");
374
375 // Failure w/ custom message.
376 var request = { body: { field: "value" }};
377 form(validate("field").notContains("alu", "!!! %s !!!"))(request, {});
378 assert.equal(request.form.errors.length, 1);
379 assert.equal(request.form.errors[0], "!!! field !!!");
380
381 // Success
382 var request = { body: { field: "value" }};
383 form(validate("field").notContains("win"))(request, {});
384 assert.equal(request.form.errors.length, 0);
385 },
386
387 'validate : regex/is': function() {
388 // regex(/pattern/)
389 // regex(/pattern/, "message")
390 // regex("pattern")
391 // regex("pattern", "modifiers")
392 // regex("pattern", "message")
393 // regex("pattern", "modifiers", "message")
394
395 // Failure: RegExp with default args
396 var request = { body: { field: "value" }};
397 form(validate("field").regex(/^\d+$/))(request, {});
398 assert.equal(request.form.errors.length, 1);
399 assert.equal(request.form.errors[0], "field has invalid characters");
400
401 // Failure: RegExp with custom message.
402 var request = { body: { field: "value" }};
403 form(validate("field").regex(/^\d+$/, "!!! %s !!!"))(request, {});
404 assert.equal(request.form.errors.length, 1);
405 assert.equal(request.form.errors[0], "!!! field !!!");
406
407 // Failure: String with default args.
408 var request = { body: { field: "value" }};
409 form(validate("field").regex("^\d+$"))(request, {});
410 assert.equal(request.form.errors.length, 1);
411 assert.equal(request.form.errors[0], "field has invalid characters");
412
413 // Success: String with modifiers
414 var request = { body: { field: "value" }};
415 form(validate("field").regex("^VALUE$", "i"))(request, {});
416 assert.equal(request.form.errors.length, 0);
417
418 // Failure: String with custom message
419 var request = { body: { field: "value" }};
420 form(validate("field").regex("^\d+$", "!!! %s !!!"))(request, {});
421 assert.equal(request.form.errors.length, 1);
422 assert.equal(request.form.errors[0], "!!! field !!!");
423
424 // Failure: String with modifiers and custom message
425 var request = { body: { field: "value" }};
426 form(validate("field").regex("^\d+$", "i", "!!! %s !!!"))(request, {});
427 assert.equal(request.form.errors.length, 1);
428 assert.equal(request.form.errors[0], "!!! field !!!");
429
430
431 // Success
432 var request = { body: { field: "value" }};
433 form(validate("field").regex(/^value$/))(request, {});
434 assert.equal(request.form.errors.length, 0);
435 },
436
437 'validate : notRegex/not': function() {
438 // notRegex(/pattern/)
439 // notRegex(/pattern/, "message")
440 // notRegex("pattern")
441 // notRegex("pattern", "modifiers")
442 // notRegex("pattern", "message")
443 // notRegex("pattern", "modifiers", "message")
444
445 // Failure: RegExp with default args
446 var request = { body: { field: "value" }};
447 form(validate("field").notRegex(/^value$/))(request, {});
448 assert.equal(request.form.errors.length, 1);
449 assert.equal(request.form.errors[0], "field has invalid characters");
450
451 // Failure: RegExp with custom message.
452 var request = { body: { field: "value" }};
453 form(validate("field").notRegex(/^value$/, "!!! %s !!!"))(request, {});
454 assert.equal(request.form.errors.length, 1);
455 assert.equal(request.form.errors[0], "!!! field !!!");
456
457 // Failure: String with default args.
458 var request = { body: { field: "value" }};
459 form(validate("field").notRegex("^value$"))(request, {});
460 assert.equal(request.form.errors.length, 1);
461 assert.equal(request.form.errors[0], "field has invalid characters");
462
463 // Success: String with modifiers
464 var request = { body: { field: "value" }};
465 form(validate("field").notRegex("^win$", "i"))(request, {});
466 assert.equal(request.form.errors.length, 0);
467
468 // Failure: String with custom message
469 var request = { body: { field: "value" }};
470 form(validate("field").notRegex("^value$", "!!! %s !!!"))(request, {});
471 assert.equal(request.form.errors.length, 1);
472 assert.equal(request.form.errors[0], "!!! field !!!");
473
474 // Failure: String with modifiers and custom message
475 var request = { body: { field: "value" }};
476 form(validate("field").notRegex("^value$", "i", "!!! %s !!!"))(request, {});
477 assert.equal(request.form.errors.length, 1);
478 assert.equal(request.form.errors[0], "!!! field !!!");
479
480 // Success
481 var request = { body: { field: "value" }};
482 form(validate("field").notRegex(/^win$/))(request, {});
483 assert.equal(request.form.errors.length, 0);
484 },
485
486 'validation : minLength': function() {
487 // Failure.
488 var request = { body: { field: "value" }};
489 form(validate("field").minLength(10))(request, {});
490 assert.equal(request.form.errors.length, 1);
491 assert.equal(request.form.errors[0], "field is too short");
492
493 // Failure w/ custom message.
494 var request = { body: { field: "value" }};
495 form(validate("field").minLength(10, "!!! %s !!!"))(request, {});
496 assert.equal(request.form.errors.length, 1);
497 assert.equal(request.form.errors[0], "!!! field !!!");
498
499 // Success
500 var request = { body: { field: "value" }};
501 form(validate("field").minLength(1))(request, {});
502 assert.equal(request.form.errors.length, 0);
503 },
504
505 'validation : isString()': function() {
506 var request = { body: { username: 'adasds@example.com', password: { 'somevalue': '1' } }};
507 form(validate('password', 'Password')
508 .required()
509 .isString()
510 .minLength(10, '%s must be a minimum of 10 characters')
511 .maxLength(256, '%s must be a maximum of 256 characters'))(request, {});
512 assert.ok(!request.form.isValid);
513 assert.strictEqual(request.form.errors[0], 'Password is not a string');
514 },
515
516 'validation : maxLength': function() {
517 // Failure.
518 var request = { body: { field: "value" }};
519 form(validate("field").maxLength(1))(request, {});
520 assert.equal(request.form.errors.length, 1);
521 assert.equal(request.form.errors[0], "field is too long");
522
523 // Failure w/ custom message.
524 var request = { body: { field: "value" }};
525 form(validate("field").maxLength(1, "!!! %s !!!"))(request, {});
526 assert.equal(request.form.errors.length, 1);
527 assert.equal(request.form.errors[0], "!!! field !!!");
528
529 // Success
530 var request = { body: { field: "value" }};
531 form(validate("field").maxLength(5))(request, {});
532 assert.equal(request.form.errors.length, 0);
533 },
534
535 'validation : required': function() {
536 // Failure.
537 var request = { body: {} };
538 form(validate("field").required())(request, {});
539 assert.equal(request.form.errors.length, 1);
540 assert.equal(request.form.errors[0], "field is required");
541
542 // Failure w/ placeholder value and custom message.
543 var request = { body: { field: "value" }};
544 form(validate("field").required("value", "!!! %s !!!"))(request, {});
545 assert.equal(request.form.errors.length, 1);
546 assert.equal(request.form.errors[0], "!!! field !!!");
547
548 // Success
549 var request = { body: { field: "5000.00" }};
550 form(validate("field").required())(request, {});
551 assert.equal(request.form.errors.length, 0);
552
553 // Non-required fields with no value should not trigger errors
554 // Success
555 var request = { body: {
556 fieldEmpty: "",
557 fieldUndefined: undefined,
558 fieldNull: null
559 }};
560 form(
561 validate("fieldEmpty").is(/whatever/),
562 validate("fieldUndefined").is(/whatever/),
563 validate("fieldNull").is(/whatever/),
564 validate("fieldMissing").is(/whatever/)
565 )(request, {});
566 assert.equal(request.form.errors.length, 0);
567 },
568
569 'validation : custom': function() {
570 var request;
571
572 // Failure.
573 request = { body: { field: "value" }};
574 form(validate("field").custom(function(value) {
575 throw new Error();
576 }))(request, {});
577 assert.equal(request.form.errors.length, 1);
578 assert.equal(request.form.errors[0], "field is invalid");
579
580 // Failure w/ custom message.
581 request = { body: { field: "value" }};
582 form(validate("field").custom(function(value) {
583 throw new Error();
584 }, "!!! %s !!!"))(request, {});
585 assert.equal(request.form.errors.length, 1);
586 assert.equal(request.form.errors[0], "!!! field !!!");
587
588 // Failure w/ custom message from internal error.
589 request = { body: { field: "value" }};
590 form(validate("field").custom(function(value) {
591 throw new Error("Radical %s");
592 }))(request, {});
593 assert.equal(request.form.errors.length, 1);
594 assert.equal(request.form.errors[0], "Radical field");
595
596 // Success
597 request = { body: { field: "value" }};
598 form(validate("field").custom(function(value) {}))(request, {});
599 assert.equal(request.form.errors.length, 0);
600
601 // Pass form data as 2nd argument to custom validators
602 request = { body: { field1: "value1", field2: "value2" }};
603 form(validate("field1").custom(function(value, formData) {
604 assert.equal("value1", value);
605 assert.ok(formData);
606 assert.equal("value1", formData.field1);
607 assert.equal("value2", formData.field2);
608 throw new Error("This is a custom error thrown for %s.");
609 }))(request, {});
610 assert.equal(request.form.errors.length, 1);
611 },
612
613 "validation: custom : async": function(done) {
614 var request = { body: { field1: "value1", field2: "value2" }};
615 var next = function next() {
616 assert.strictEqual(request.form.isValid, false);
617 assert.strictEqual(request.form.errors.length, 1);
618 assert.strictEqual(request.form.errors[0], 'Invalid field1');
619 done();
620 };
621
622 form(validate("field1").custom(function(value, source, callback) {
623 process.nextTick(function() {
624 assert.strictEqual(value, 'value1');
625 callback(new Error("Invalid %s"));
626 });
627 }))(request, {}, next);
628 },
629
630 "validation : custom : async : success": function(done) {
631 var request = { body: { field1: "value1", field2: "value2" }};
632 var callbackCalled = false;
633 var next = function next() {
634 assert.strictEqual(callbackCalled, true);
635 assert.strictEqual(request.form.isValid, true);
636 assert.strictEqual(request.form.errors.length, 0);
637 done();
638 };
639 form(validate("field1").custom(function(value, source, callback) {
640 process.nextTick(function() {
641 assert.strictEqual(value, 'value1');
642 callbackCalled = true;
643 callback(null);
644 });
645 }))(request, {}, next);
646 },
647
648 "validation : custom : async : chaining": function(done) {
649 var request = { body: { field1: "value1", field2: "value2" }};
650 var callbackCalled = 0;
651 var next = function next() {
652 assert.strictEqual(callbackCalled, 2);
653 assert.strictEqual(request.form.isValid, false);
654 assert.strictEqual(request.form.errors.length, 2);
655 assert.strictEqual(request.form.errors[0], 'Fail! field1');
656 assert.strictEqual(request.form.errors[1], 'yes sync custom funcs still work !! field1');
657 done();
658 };
659
660 form(validate("field1")
661 .custom(function(value, source, callback) {
662 process.nextTick(function() {
663 ++callbackCalled;
664 callback(null);
665 });
666 })
667 .custom(function(value, source, callback) {
668 process.nextTick(function() {
669 ++callbackCalled;
670 callback(new Error('Fail! %s'));
671 });
672 })
673 .custom(function(value, source) {
674 throw new Error('yes sync custom funcs still work !! %s');
675 })
676 )(request, {}, next);
677 },
678
679 "validation : custom : async : multiple fields": function(done) {
680 var request = { body: { field1: "value1", field2: "value2" }};
681 var callbackCalled = 0;
682 var next = function next() {
683 assert.strictEqual(callbackCalled, 2);
684 assert.strictEqual(request.form.isValid, false);
685 assert.strictEqual(request.form.errors.length, 2);
686 assert.strictEqual(request.form.errors[0], 'field1 error');
687 assert.strictEqual(request.form.errors[1], 'field2 error');
688 done();
689 };
690 form(
691 validate("field1").custom(function(value, source, callback) {
692 process.nextTick(function() {
693 ++callbackCalled;
694 assert.strictEqual(value, 'value1')
695 callback(new Error('%s error'));
696 });
697 }),
698 validate("field2").custom(function(value, source, callback) {
699 process.nextTick(function() {
700 ++callbackCalled;
701 assert.strictEqual(value, 'value2');
702 callback(new Error('%s error'));
703 });
704 })
705 )(request, {}, next);
706 },
707
708 "validation : request.form property-pollution": function() {
709 var request = { body: { }};
710 form()(request, {});
711 assert.equal(request.form.errors.length, 0);
712 assert.equal('{}', JSON.stringify(request.form));
713 },
714
715 "validation : complex properties": function() {
716 var request = { body: { field: { inner: "value", even: { more: { inner: "value" }}}}};
717 form(
718 validate("field[inner]").required().equals("value"),
719 validate("field[inner]").required().equals("fail"),
720 validate("field[even][more][inner]").required().equals("value"),
721 validate("field[even][more][inner]").required().equals("fail")
722 )(request, {});
723 assert.equal(request.form.errors.length, 2);
724 }
725};