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.
- package/.c9/.nakignore +17 -0
- package/.c9/metadata/tab0 +1 -0
- package/.c9/metadata/workspace/.c9/project.settings +1 -0
- package/.c9/metadata/workspace/.travis.yml +1 -0
- package/.c9/metadata/workspace/Makefile +1 -0
- package/.c9/metadata/workspace/README.md +1 -0
- package/.c9/metadata/workspace/lib/any.js +1 -0
- package/.c9/metadata/workspace/lib/array.js +1 -0
- package/.c9/metadata/workspace/lib/binary.js +1 -0
- package/.c9/metadata/workspace/lib/boolean.js +1 -0
- package/.c9/metadata/workspace/lib/cast.js +1 -0
- package/.c9/metadata/workspace/lib/date.js +1 -0
- package/.c9/metadata/workspace/lib/errors.js +1 -0
- package/.c9/metadata/workspace/lib/function.js +1 -0
- package/.c9/metadata/workspace/lib/index.js +1 -0
- package/.c9/metadata/workspace/lib/language.js +1 -0
- package/.c9/metadata/workspace/lib/number.js +1 -0
- package/.c9/metadata/workspace/lib/object.js +1 -0
- package/.c9/metadata/workspace/lib/string.js +1 -0
- package/.c9/metadata/workspace/package.json +1 -0
- package/.c9/metadata/workspace/test/alternatives.js +1 -0
- package/.c9/metadata/workspace/test/any.js +1 -0
- package/.c9/metadata/workspace/test/array.js +1 -0
- package/.c9/metadata/workspace/test/binary.js +1 -0
- package/.c9/metadata/workspace/test/boolean.js +1 -0
- package/.c9/metadata/workspace/test/date.js +1 -0
- package/.c9/metadata/workspace/test/errors.js +1 -0
- package/.c9/metadata/workspace/test/function.js +1 -0
- package/.c9/metadata/workspace/test/helper.js +1 -0
- package/.c9/metadata/workspace/test/index.js +1 -0
- package/.c9/metadata/workspace/test/number.js +1 -0
- package/.c9/metadata/workspace/test/object.js +1 -0
- package/.c9/metadata/workspace/test/ref.js +1 -0
- package/.c9/metadata/workspace/test/string.js +1 -0
- package/.c9/project.settings +34 -0
- package/.travis.yml +1 -0
- package/Makefile +3 -3
- package/README.md +162 -31
- package/examples/conditionalRequire.js +43 -0
- package/examples/customMessage.js +22 -0
- package/examples/multipleWhen.js +17 -0
- package/lib/any.js +35 -24
- package/lib/array.js +25 -0
- package/lib/date.js +64 -9
- package/lib/errors.js +18 -2
- package/lib/index.js +3 -2
- package/lib/language.js +17 -6
- package/lib/number.js +50 -0
- package/lib/object.js +69 -5
- package/lib/string.js +27 -6
- package/package.json +5 -3
- package/test/alternatives.js +12 -10
- package/test/any.js +64 -15
- package/test/array.js +55 -16
- package/test/binary.js +13 -11
- package/test/boolean.js +9 -7
- package/test/date.js +143 -20
- package/test/errors.js +26 -15
- package/test/function.js +7 -5
- package/test/helper.js +7 -5
- package/test/index.js +116 -73
- package/test/number.js +125 -12
- package/test/object.js +192 -43
- package/test/ref.js +22 -20
- package/test/string.js +255 -106
- 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
|
|
16
|
-
var before =
|
|
17
|
-
var after =
|
|
18
|
-
var describe =
|
|
19
|
-
var it =
|
|
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
|
|
16
|
-
var before =
|
|
17
|
-
var after =
|
|
18
|
-
var describe =
|
|
19
|
-
var it =
|
|
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('
|
|
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.
|
|
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.
|
|
597
|
-
expect(schema.describe()).to.
|
|
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
|
});
|