joi 4.6.2 → 4.9.0

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 (66) hide show
  1. package/.c9/.nakignore +17 -0
  2. package/.c9/metadata/tab0 +1 -0
  3. package/.c9/metadata/workspace/.c9/project.settings +1 -0
  4. package/.c9/metadata/workspace/.travis.yml +1 -0
  5. package/.c9/metadata/workspace/Makefile +1 -0
  6. package/.c9/metadata/workspace/README.md +1 -0
  7. package/.c9/metadata/workspace/lib/any.js +1 -0
  8. package/.c9/metadata/workspace/lib/array.js +1 -0
  9. package/.c9/metadata/workspace/lib/binary.js +1 -0
  10. package/.c9/metadata/workspace/lib/boolean.js +1 -0
  11. package/.c9/metadata/workspace/lib/cast.js +1 -0
  12. package/.c9/metadata/workspace/lib/date.js +1 -0
  13. package/.c9/metadata/workspace/lib/errors.js +1 -0
  14. package/.c9/metadata/workspace/lib/function.js +1 -0
  15. package/.c9/metadata/workspace/lib/index.js +1 -0
  16. package/.c9/metadata/workspace/lib/language.js +1 -0
  17. package/.c9/metadata/workspace/lib/number.js +1 -0
  18. package/.c9/metadata/workspace/lib/object.js +1 -0
  19. package/.c9/metadata/workspace/lib/string.js +1 -0
  20. package/.c9/metadata/workspace/package.json +1 -0
  21. package/.c9/metadata/workspace/test/alternatives.js +1 -0
  22. package/.c9/metadata/workspace/test/any.js +1 -0
  23. package/.c9/metadata/workspace/test/array.js +1 -0
  24. package/.c9/metadata/workspace/test/binary.js +1 -0
  25. package/.c9/metadata/workspace/test/boolean.js +1 -0
  26. package/.c9/metadata/workspace/test/date.js +1 -0
  27. package/.c9/metadata/workspace/test/errors.js +1 -0
  28. package/.c9/metadata/workspace/test/function.js +1 -0
  29. package/.c9/metadata/workspace/test/helper.js +1 -0
  30. package/.c9/metadata/workspace/test/index.js +1 -0
  31. package/.c9/metadata/workspace/test/number.js +1 -0
  32. package/.c9/metadata/workspace/test/object.js +1 -0
  33. package/.c9/metadata/workspace/test/ref.js +1 -0
  34. package/.c9/metadata/workspace/test/string.js +1 -0
  35. package/.c9/project.settings +34 -0
  36. package/.travis.yml +1 -0
  37. package/Makefile +3 -3
  38. package/README.md +162 -31
  39. package/examples/conditionalRequire.js +43 -0
  40. package/examples/customMessage.js +22 -0
  41. package/examples/multipleWhen.js +17 -0
  42. package/lib/any.js +35 -24
  43. package/lib/array.js +25 -0
  44. package/lib/date.js +64 -9
  45. package/lib/errors.js +18 -2
  46. package/lib/index.js +3 -2
  47. package/lib/language.js +17 -6
  48. package/lib/number.js +50 -0
  49. package/lib/object.js +69 -5
  50. package/lib/string.js +27 -6
  51. package/package.json +5 -3
  52. package/test/alternatives.js +12 -10
  53. package/test/any.js +64 -15
  54. package/test/array.js +55 -16
  55. package/test/binary.js +13 -11
  56. package/test/boolean.js +9 -7
  57. package/test/date.js +143 -20
  58. package/test/errors.js +26 -15
  59. package/test/function.js +7 -5
  60. package/test/helper.js +7 -5
  61. package/test/index.js +116 -73
  62. package/test/number.js +125 -12
  63. package/test/object.js +192 -43
  64. package/test/ref.js +22 -20
  65. package/test/string.js +255 -106
  66. package/AUTHORS +0 -3
package/test/number.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // Load modules
2
2
 
3
3
  var Lab = require('lab');
4
+ var Code = require('code');
4
5
  var Joi = require('../lib');
5
6
  var Helper = require('./helper');
6
7
 
@@ -12,11 +13,12 @@ var internals = {};
12
13
 
13
14
  // Test shortcuts
14
15
 
15
- var expect = Lab.expect;
16
- var before = Lab.before;
17
- var after = Lab.after;
18
- var describe = Lab.experiment;
19
- var it = Lab.test;
16
+ var lab = exports.lab = Lab.script();
17
+ var before = lab.before;
18
+ var after = lab.after;
19
+ var describe = lab.describe;
20
+ var it = lab.it;
21
+ var expect = Code.expect;
20
22
 
21
23
 
22
24
  describe('number', function () {
@@ -51,7 +53,7 @@ describe('number', function () {
51
53
  var text = Joi.number().invalid(50);
52
54
  text.validate(50, function (err, value) {
53
55
 
54
- expect(err).to.exist;
56
+ expect(err).to.exist();
55
57
  done();
56
58
  });
57
59
  });
@@ -101,7 +103,7 @@ describe('number', function () {
101
103
 
102
104
  Joi.compile(config).validate(obj, function (err, value) {
103
105
 
104
- expect(err).to.not.exist;
106
+ expect(err).to.not.exist();
105
107
  expect(value.a).to.equal(123);
106
108
  done();
107
109
  });
@@ -111,7 +113,7 @@ describe('number', function () {
111
113
 
112
114
  Joi.number().validate('1', function (err, value) {
113
115
 
114
- expect(err).to.not.exist;
116
+ expect(err).to.not.exist();
115
117
  expect(value).to.equal(1);
116
118
  done();
117
119
  });
@@ -121,7 +123,7 @@ describe('number', function () {
121
123
 
122
124
  Joi.number().validate(null, function (err, value) {
123
125
 
124
- expect(err).to.exist;
126
+ expect(err).to.exist();
125
127
  expect(value).to.equal(null);
126
128
  done();
127
129
  });
@@ -370,6 +372,99 @@ describe('number', function () {
370
372
  [null, true]
371
373
  ], done);
372
374
  });
375
+
376
+ it('should handle limiting the number of decimal places', function (done) {
377
+
378
+ var rule = Joi.number().precision(1);
379
+ Helper.validate(rule, [
380
+ [1, true],
381
+ [9.1, true],
382
+ [9.21, false],
383
+ [9.9999, false],
384
+ [9.999e99, true],
385
+ [9.9e-99, false],
386
+ [9.9e3, true],
387
+ [null, false]
388
+ ], done);
389
+ });
390
+
391
+ it('should handle combination of min, max, integer, allow, invalid, null allowed and precision', function (done) {
392
+
393
+ var rule = Joi.number().min(8).max(10).integer().allow(9.1).invalid(8).allow(null).precision(1);
394
+ Helper.validate(rule, [
395
+ [1, false],
396
+ [11, false],
397
+ [8, false],
398
+ [9, true],
399
+ [9.1, true],
400
+ [9.11, false],
401
+ [9.2, false],
402
+ [9.22, false],
403
+ [null, true]
404
+ ], done);
405
+ });
406
+
407
+ it('should handle combination of greater and less', function (done) {
408
+
409
+ var rule = Joi.number().greater(5).less(10);
410
+ Helper.validate(rule, [
411
+ [0, false],
412
+ [11, false],
413
+ [5, false],
414
+ [10, false],
415
+ [8, true],
416
+ [5.01, true],
417
+ [9.99, true],
418
+ [null, false]
419
+ ], done);
420
+ });
421
+
422
+ it('should handle combination of greater, less, and integer', function (done) {
423
+
424
+ var rule = Joi.number().integer().greater(5).less(10);
425
+ Helper.validate(rule, [
426
+ [0, false],
427
+ [11, false],
428
+ [5, false],
429
+ [10, false],
430
+ [6, true],
431
+ [9, true],
432
+ [5.01, false],
433
+ [9.99, false]
434
+ ], done);
435
+ });
436
+
437
+ it('should handle combination of greater, less, and null allowed', function (done) {
438
+
439
+ var rule = Joi.number().greater(5).less(10).allow(null);
440
+ Helper.validate(rule, [
441
+ [0, false],
442
+ [11, false],
443
+ [5, false],
444
+ [10, false],
445
+ [8, true],
446
+ [5.01, true],
447
+ [9.99, true],
448
+ [null, true]
449
+ ], done);
450
+ });
451
+
452
+ it('should handle combination of greater, less, invalid, and allow', function (done) {
453
+
454
+ var rule = Joi.number().greater(5).less(10).invalid(6).allow(-3);
455
+ Helper.validate(rule, [
456
+ [0, false],
457
+ [11, false],
458
+ [5, false],
459
+ [10, false],
460
+ [6, false],
461
+ [8, true],
462
+ [5.01, true],
463
+ [9.99, true],
464
+ [-3, true],
465
+ [null, false]
466
+ ], done);
467
+ });
373
468
  });
374
469
 
375
470
  it('should instantiate separate copies on invocation', function (done) {
@@ -384,7 +479,7 @@ describe('number', function () {
384
479
  it('should show resulting object with #valueOf', function (done) {
385
480
 
386
481
  var result = Joi.number().min(5);
387
- expect(result.valueOf()).to.exist;
482
+ expect(result.valueOf()).to.exist();
388
483
  done();
389
484
  });
390
485
 
@@ -419,7 +514,7 @@ describe('number', function () {
419
514
 
420
515
  schema.validate(input, function (err, value) {
421
516
 
422
- expect(err).to.not.exist;
517
+ expect(err).to.not.exist();
423
518
  expect(value).to.equal(input);
424
519
  done();
425
520
  });
@@ -437,4 +532,22 @@ describe('number', function () {
437
532
  done();
438
533
  });
439
534
  });
440
- });
535
+
536
+ describe('#describe', function () {
537
+
538
+ it('should describe a minimum of 0', function (done) {
539
+
540
+ var schema = Joi.number().min(0);
541
+ expect(schema.describe()).to.deep.equal({
542
+ "type": "number",
543
+ "rules": [
544
+ {
545
+ "name": "min",
546
+ "arg": 0
547
+ }
548
+ ]
549
+ });
550
+ done();
551
+ });
552
+ });
553
+ });
package/test/object.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // Load modules
2
2
 
3
3
  var Lab = require('lab');
4
+ var Code = require('code');
4
5
  var Joi = require('../lib');
5
6
  var Helper = require('./helper');
6
7
 
@@ -12,11 +13,12 @@ var internals = {};
12
13
 
13
14
  // Test shortcuts
14
15
 
15
- var expect = Lab.expect;
16
- var before = Lab.before;
17
- var after = Lab.after;
18
- var describe = Lab.experiment;
19
- var it = Lab.test;
16
+ var lab = exports.lab = Lab.script();
17
+ var before = lab.before;
18
+ var after = lab.after;
19
+ var describe = lab.describe;
20
+ var it = lab.it;
21
+ var expect = Code.expect;
20
22
 
21
23
 
22
24
  describe('object', function () {
@@ -25,7 +27,7 @@ describe('object', function () {
25
27
 
26
28
  Joi.object().validate('{"hi":true}', function (err, value) {
27
29
 
28
- expect(err).to.not.exist;
30
+ expect(err).to.not.exist();
29
31
  expect(value.hi).to.equal(true);
30
32
  done();
31
33
  });
@@ -35,13 +37,13 @@ describe('object', function () {
35
37
 
36
38
  Joi.object().validate('a string', function (err, value) {
37
39
 
38
- expect(err).to.exist;
40
+ expect(err).to.exist();
39
41
  expect(value).to.equal('a string');
40
42
  done();
41
43
  });
42
44
  });
43
45
 
44
- it('should validate an object', function (done) {
46
+ it('validates an object', function (done) {
45
47
 
46
48
  var schema = Joi.object().required();
47
49
  Helper.validate(schema, [
@@ -51,6 +53,20 @@ describe('object', function () {
51
53
  ], done);
52
54
  });
53
55
 
56
+ it('return object reference when no rules specified', function (done) {
57
+
58
+ var schema = Joi.object({
59
+ a: Joi.object()
60
+ });
61
+
62
+ var item = { x: 5 };
63
+ schema.validate({ a: item }, function (err, value) {
64
+
65
+ expect(value.a).to.equal(item);
66
+ done();
67
+ });
68
+ });
69
+
54
70
  it('retains ignored values', function (done) {
55
71
 
56
72
  var schema = Joi.object();
@@ -76,11 +92,11 @@ describe('object', function () {
76
92
 
77
93
  Joi.object().validate({ a: 4 }, function (err, value) {
78
94
 
79
- expect(err).to.not.exist;
95
+ expect(err).to.not.exist();
80
96
 
81
97
  Joi.object(undefined).validate({ a: 4 }, function (err, value) {
82
98
 
83
- expect(err).to.not.exist;
99
+ expect(err).to.not.exist();
84
100
  done();
85
101
  });
86
102
  });
@@ -90,7 +106,7 @@ describe('object', function () {
90
106
 
91
107
  Joi.object(null).validate({ a: 4 }, function (err, value) {
92
108
 
93
- expect(err).to.not.exist;
109
+ expect(err).to.not.exist();
94
110
  done();
95
111
  });
96
112
  });
@@ -117,8 +133,8 @@ describe('object', function () {
117
133
 
118
134
  Joi.object({ a: Joi.object() }).validate(undefined, function (err, value) {
119
135
 
120
- expect(err).to.not.exist;
121
- expect(value).to.not.exist;
136
+ expect(err).to.not.exist();
137
+ expect(value).to.not.exist();
122
138
  done();
123
139
  });
124
140
  });
@@ -127,7 +143,7 @@ describe('object', function () {
127
143
 
128
144
  Joi.object().validate([1, 2, 3], function (err, value) {
129
145
 
130
- expect(err).to.exist;
146
+ expect(err).to.exist();
131
147
  done();
132
148
  });
133
149
  });
@@ -187,6 +203,18 @@ describe('object', function () {
187
203
  ], done);
188
204
  });
189
205
 
206
+ it('should validate constructor when type is set', function (done) {
207
+
208
+ var schema = Joi.object().type(RegExp);
209
+ Helper.validate(schema, [
210
+ [{ item: 'something' }, false],
211
+ ['', false],
212
+ [new Date(), false],
213
+ [/abcd/, true],
214
+ [new RegExp(), true]
215
+ ], done);
216
+ });
217
+
190
218
  it('should traverse an object and validate all properties in the top level', function (done) {
191
219
 
192
220
  var schema = Joi.object({
@@ -292,7 +320,7 @@ describe('object', function () {
292
320
  var obj = { a: 5, b: 'value' };
293
321
  schema.validate(obj, function (err, value) {
294
322
 
295
- expect(err).to.exist;
323
+ expect(err).to.exist();
296
324
  done();
297
325
  });
298
326
  });
@@ -317,10 +345,10 @@ describe('object', function () {
317
345
  var b = a.keys();
318
346
  a.validate({ b: 3 }, function (err, value) {
319
347
 
320
- expect(err).to.exist;
348
+ expect(err).to.exist();
321
349
  b.validate({ b: 3 }, function (err, value) {
322
350
 
323
- expect(err).to.not.exist;
351
+ expect(err).to.not.exist();
324
352
  done();
325
353
  });
326
354
  });
@@ -332,10 +360,10 @@ describe('object', function () {
332
360
  var b = a.keys({});
333
361
  a.validate({ b: 3 }, function (err, value) {
334
362
 
335
- expect(err).to.not.exist;
363
+ expect(err).to.not.exist();
336
364
  b.validate({ b: 3 }, function (err, value) {
337
365
 
338
- expect(err).to.exist;
366
+ expect(err).to.exist();
339
367
  done();
340
368
  });
341
369
  });
@@ -347,10 +375,10 @@ describe('object', function () {
347
375
  var b = a.keys({ b: 2 });
348
376
  a.validate({ a: 1, b: 2 }, function (err, value) {
349
377
 
350
- expect(err).to.exist;
378
+ expect(err).to.exist();
351
379
  b.validate({ a: 1, b: 2 }, function (err, value) {
352
380
 
353
- expect(err).to.not.exist;
381
+ expect(err).to.not.exist();
354
382
  done();
355
383
  });
356
384
  });
@@ -402,7 +430,7 @@ describe('object', function () {
402
430
 
403
431
  Joi.compile(schema).validate({ test1: 'a', test2: 'b' }, function (err, value) {
404
432
 
405
- expect(err).to.not.exist;
433
+ expect(err).to.not.exist();
406
434
  done();
407
435
  });
408
436
  });
@@ -424,7 +452,7 @@ describe('object', function () {
424
452
 
425
453
  Joi.object().rename('a', 'b').rename('c', 'b').rename('d', 'b').options({ abortEarly: false }).validate({ a: 1, c: 1, d: 1 }, function (err, value) {
426
454
 
427
- expect(err).to.exist;
455
+ expect(err).to.exist();
428
456
  expect(err.message).to.equal('value cannot rename child c because multiple renames are disabled and another key was already renamed to b. value cannot rename child d because multiple renames are disabled and another key was already renamed to b');
429
457
  done();
430
458
  });
@@ -441,7 +469,7 @@ describe('object', function () {
441
469
 
442
470
  Joi.compile(schema).validate(obj, function (err, value) {
443
471
 
444
- expect(err).to.not.exist;
472
+ expect(err).to.not.exist();
445
473
  expect(value.a).to.equal(10);
446
474
  expect(value.b).to.equal(10);
447
475
  done();
@@ -469,7 +497,7 @@ describe('object', function () {
469
497
 
470
498
  schema.validate({ test: 'b', test1: 'a' }, function (err, value) {
471
499
 
472
- expect(err).to.not.exist;
500
+ expect(err).to.not.exist();
473
501
  done();
474
502
  });
475
503
  });
@@ -486,7 +514,7 @@ describe('object', function () {
486
514
  var data = { arr: [{ uno: '1', dos: '2' }] };
487
515
  Joi.object(schema).validate(data, function (err, value) {
488
516
 
489
- expect(err).to.not.exist;
517
+ expect(err).to.not.exist();
490
518
  expect(value.arr[0].one).to.equal('1');
491
519
  expect(value.arr[0].two).to.equal('2');
492
520
  done();
@@ -503,8 +531,8 @@ describe('object', function () {
503
531
 
504
532
  schema1.validate(input1, function (err1, value1) {
505
533
 
506
- expect(err1).to.not.exist;
507
- expect(value1.b).to.not.exist;
534
+ expect(err1).to.not.exist();
535
+ expect(value1.b).to.not.exist();
508
536
  expect(value1.a).to.equal(5);
509
537
 
510
538
  var schema2 = Joi.object({ a: Joi.number(), b: Joi.any() }).rename('b', 'a');
@@ -512,8 +540,8 @@ describe('object', function () {
512
540
 
513
541
  schema2.validate(input2, function (err2, value2) {
514
542
 
515
- expect(err2).to.not.exist;
516
- expect(value2.b).to.not.exist;
543
+ expect(err2).to.not.exist();
544
+ expect(value2.b).to.not.exist();
517
545
  expect(value2.a).to.equal(5);
518
546
 
519
547
  done();
@@ -531,7 +559,7 @@ describe('object', function () {
531
559
 
532
560
  Joi.validate(input, schema, function (err, value) {
533
561
 
534
- expect(err).to.not.exist;
562
+ expect(err).to.not.exist();
535
563
  expect(value.foo2).to.equal('test');
536
564
 
537
565
  done();
@@ -547,8 +575,8 @@ describe('object', function () {
547
575
 
548
576
  schema.validate(input, function (err, value) {
549
577
 
550
- expect(err).to.not.exist;
551
- expect(value['']).to.not.exist;
578
+ expect(err).to.not.exist();
579
+ expect(value['']).to.not.exist();
552
580
  expect(value.notEmpty).to.equal('something');
553
581
  done();
554
582
  });
@@ -564,8 +592,8 @@ describe('object', function () {
564
592
 
565
593
  schema.validate(input, function (err, value) {
566
594
 
567
- expect(err).to.not.exist;
568
- expect(value).to.have.keys(['a']);
595
+ expect(err).to.not.exist();
596
+ expect(Object.keys(value)).to.include('a');
569
597
  expect(value.a).to.equal('something');
570
598
  done();
571
599
  });
@@ -593,8 +621,35 @@ describe('object', function () {
593
621
  })
594
622
  });
595
623
 
596
- expect(schema.describe(true)).to.not.contain.key('children');
597
- expect(schema.describe()).to.contain.key('children');
624
+ expect(Object.keys(schema.describe(true))).to.not.include('children');
625
+ expect(Object.keys(schema.describe())).to.include('children');
626
+
627
+ done();
628
+ });
629
+
630
+ it('describes patterns', function (done) {
631
+
632
+ var schema = Joi.object({
633
+ a: Joi.string()
634
+ }).pattern(/\w\d/i, Joi.boolean());
635
+
636
+ expect(schema.describe()).to.deep.equal({
637
+ type: 'object',
638
+ children: {
639
+ a: {
640
+ type: 'string',
641
+ invalids: ['']
642
+ }
643
+ },
644
+ patterns: [
645
+ {
646
+ regex: '/\\w\\d/i',
647
+ rule: {
648
+ type: 'boolean'
649
+ }
650
+ }
651
+ ]
652
+ });
598
653
 
599
654
  done();
600
655
  });
@@ -646,7 +701,7 @@ describe('object', function () {
646
701
 
647
702
  Joi.validate({ bb: 'y', 5: 'x' }, schema, { abortEarly: false }, function (err, value) {
648
703
 
649
- expect(err).to.exist;
704
+ expect(err).to.exist();
650
705
  expect(err.message).to.equal('5 must be a boolean. bb must be one of x');
651
706
 
652
707
  Helper.validate(schema, [
@@ -671,7 +726,7 @@ describe('object', function () {
671
726
 
672
727
  Joi.validate({ x: { bb: 'y', 5: 'x' } }, schema, { abortEarly: false }, function (err, value) {
673
728
 
674
- expect(err).to.exist;
729
+ expect(err).to.exist();
675
730
  expect(err.message).to.equal('5 must be a boolean. bb must be one of x');
676
731
  done();
677
732
  });
@@ -683,11 +738,22 @@ describe('object', function () {
683
738
 
684
739
  Joi.validate({ a: 5 }, schema, { abortEarly: false }, function (err, value) {
685
740
 
686
- expect(err).to.exist;
741
+ expect(err).to.exist();
687
742
  expect(err.message).to.equal('a is not allowed');
688
743
  done();
689
744
  });
690
745
  });
746
+
747
+ it('removes global flag from patterns', function (done) {
748
+
749
+ var schema = Joi.object().pattern(/a/g, Joi.number());
750
+
751
+ Joi.validate({ a1: 5, a2: 6 }, schema, function (err, value) {
752
+
753
+ expect(err).to.not.exist();
754
+ done();
755
+ });
756
+ });
691
757
  });
692
758
 
693
759
  describe('#with', function () {
@@ -817,7 +883,7 @@ describe('object', function () {
817
883
  }
818
884
  }).validate({ a: { b: { c: 1 } } }, function (err, value) {
819
885
 
820
- expect(err).to.exist;
886
+ expect(err).to.exist();
821
887
  expect(err.message).to.equal('value must contain at least one of x, y');
822
888
  done();
823
889
  });
@@ -840,7 +906,7 @@ describe('object', function () {
840
906
 
841
907
  schema.validate({ a: { b: 'x', c: 5 }, d: { e: 6 } }, function (err, value) {
842
908
 
843
- expect(err).to.exist;
909
+ expect(err).to.exist();
844
910
  expect(err.message).to.equal('value validation failed because d.e failed to equal to a.c');
845
911
 
846
912
  Helper.validate(schema, [
@@ -863,7 +929,7 @@ describe('object', function () {
863
929
 
864
930
  schema.validate({ a: { b: 'x', c: 5 }, d: { e: 6 } }, function (err, value) {
865
931
 
866
- expect(err).to.exist;
932
+ expect(err).to.exist();
867
933
  expect(err.message).to.equal('value validation failed because d.e failed to equal to a.c');
868
934
 
869
935
  Helper.validate(schema, [
@@ -905,5 +971,88 @@ describe('object', function () {
905
971
  }).to.not.throw();
906
972
  done();
907
973
  });
974
+
975
+ it('provides a default message for failed assertions', function (done) {
976
+
977
+ var schema = Joi.object({
978
+ a: {
979
+ b: Joi.string(),
980
+ c: Joi.number()
981
+ },
982
+ d: {
983
+ e: Joi.any()
984
+ }
985
+ }).assert('d.e', Joi.boolean());
986
+
987
+ schema.validate({
988
+ d: {
989
+ e:[]
990
+ }
991
+ }, function (err) {
992
+
993
+ expect(err).to.exist();
994
+ expect(err.message).to.equal('value validation failed because d.e failed to pass the assertion test');
995
+ done();
996
+ });
997
+ });
998
+ });
999
+
1000
+ describe('#type', function () {
1001
+
1002
+ it('uses constructor name for default type name', function (done) {
1003
+
1004
+ function Foo () {}
1005
+
1006
+ var schema = Joi.object().type(Foo);
1007
+ schema.validate({}, function (err) {
1008
+
1009
+ expect(err).to.exist();
1010
+ expect(err.message).to.equal('value must be an instance of Foo');
1011
+ done();
1012
+ });
1013
+ });
1014
+
1015
+ it('uses custom type name if supplied', function (done) {
1016
+
1017
+ var Foo = function () {};
1018
+
1019
+ var schema = Joi.object().type(Foo, 'Bar');
1020
+ schema.validate({}, function (err) {
1021
+
1022
+ expect(err).to.exist();
1023
+ expect(err.message).to.equal('value must be an instance of Bar');
1024
+ done();
1025
+ });
1026
+ });
1027
+
1028
+ it('overrides constructor name with custom name', function (done) {
1029
+
1030
+ function Foo () {}
1031
+
1032
+ var schema = Joi.object().type(Foo, 'Bar');
1033
+ schema.validate({}, function (err) {
1034
+
1035
+ expect(err).to.exist();
1036
+ expect(err.message).to.equal('value must be an instance of Bar');
1037
+ done();
1038
+ });
1039
+ });
1040
+
1041
+ it('throws when constructor is not a function', function (done) {
1042
+
1043
+ expect(function () {
1044
+
1045
+ var schema = Joi.object().type('');
1046
+ }).to.throw('type must be a constructor function');
1047
+ done();
1048
+ });
1049
+
1050
+ it('uses the constructor name in the schema description', function (done) {
1051
+
1052
+ var description = Joi.object().type(RegExp).describe();
1053
+
1054
+ expect(description.rules).to.deep.include({ name: 'type', arg: 'RegExp' });
1055
+ done();
1056
+ });
908
1057
  });
909
1058
  });