monastery 1.28.3 → 1.30.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/.eslintrc.json +30 -4
- package/docs/Gemfile +8 -18
- package/docs/_config.yml +1 -4
- package/docs/errors.md +0 -0
- package/docs/image-plugin.md +0 -0
- package/docs/manager/model.md +0 -0
- package/docs/manager/models.md +0 -0
- package/docs/model/findOne.md +0 -0
- package/docs/model/index.md +0 -0
- package/docs/model/remove.md +0 -0
- package/docs/readme.md +1 -1
- package/docs/rules.md +0 -0
- package/lib/index.js +0 -1
- package/lib/model-crud.js +33 -17
- package/lib/model-validate.js +25 -25
- package/lib/model.js +23 -12
- package/lib/rules.js +26 -31
- package/lib/util.js +13 -7
- package/package.json +17 -16
- package/plugins/images/index.js +4 -4
- package/test/assets/bad.svg +0 -0
- package/test/assets/image.ico +0 -0
- package/test/assets/image.webp +0 -0
- package/test/assets/lion1.png +0 -0
- package/test/assets/lion2.jpg +0 -0
- package/test/assets/logo.png +0 -0
- package/test/assets/logo2.png +0 -0
- package/test/blacklisting.js +4 -8
- package/test/crud.js +28 -31
- package/test/model.js +114 -28
- package/test/monk.js +4 -4
- package/test/plugin-images.js +400 -390
- package/test/populate.js +15 -18
- package/test/util.js +8 -8
- package/test/validate.js +227 -108
- package/test/virtuals.js +2 -4
package/test/validate.js
CHANGED
|
@@ -19,7 +19,7 @@ module.exports = function(monastery, opendb) {
|
|
|
19
19
|
detail: 'This field is required.',
|
|
20
20
|
meta: { rule: 'required', model: 'user', field: 'name' }
|
|
21
21
|
})
|
|
22
|
-
await expect(user.validate({ name : '' }, {
|
|
22
|
+
await expect(user.validate({ name : '' }, { validateUndefined: false })).rejects.toContainEqual({
|
|
23
23
|
status: '400',
|
|
24
24
|
title: 'name',
|
|
25
25
|
detail: 'This field is required.',
|
|
@@ -27,8 +27,8 @@ module.exports = function(monastery, opendb) {
|
|
|
27
27
|
})
|
|
28
28
|
|
|
29
29
|
// Required error (insert, and with ignoreRequired)
|
|
30
|
-
await expect(user.validate({}, {
|
|
31
|
-
await expect(user.validate({}, {
|
|
30
|
+
await expect(user.validate({}, { validateUndefined: false })).resolves.toEqual({})
|
|
31
|
+
await expect(user.validate({}, { validateUndefined: false, update: true })).resolves.toEqual({})
|
|
32
32
|
|
|
33
33
|
// No required error (update)
|
|
34
34
|
await expect(user.validate({}, { update: true })).resolves.toEqual({})
|
|
@@ -87,77 +87,121 @@ module.exports = function(monastery, opendb) {
|
|
|
87
87
|
let db = (await opendb(false)).db
|
|
88
88
|
let user = db.model('user', { fields: {
|
|
89
89
|
animals: {
|
|
90
|
-
cat: { type: 'string', required: true },
|
|
90
|
+
cat: { type: 'string', required: true }, // {} = required on insert
|
|
91
91
|
dog: {
|
|
92
92
|
name: { type: 'string' },
|
|
93
|
-
color: { type: 'string', required: true }
|
|
93
|
+
color: { type: 'string', required: true } // {} = required on insert
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
}})
|
|
97
97
|
|
|
98
|
-
//
|
|
99
|
-
await expect(user.validate({
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
98
|
+
// Insert: Required subdocument properties
|
|
99
|
+
await expect(user.validate({})).rejects.toEqual(
|
|
100
|
+
expect.arrayContaining([
|
|
101
|
+
expect.objectContaining({
|
|
102
|
+
status: '400',
|
|
103
|
+
title: 'animals.cat',
|
|
104
|
+
detail: 'This field is required.',
|
|
105
|
+
meta: { rule: 'required', model: 'user', field: 'cat' }
|
|
106
|
+
}),
|
|
107
|
+
expect.objectContaining({
|
|
108
|
+
status: '400',
|
|
109
|
+
title: 'animals.dog.color',
|
|
110
|
+
detail: 'This field is required.',
|
|
111
|
+
meta: { rule: 'required', model: 'user', field: 'color' }
|
|
112
|
+
}),
|
|
113
|
+
])
|
|
114
|
+
)
|
|
105
115
|
|
|
106
|
-
// Required subdocument
|
|
107
|
-
await expect(user.validate({})).rejects.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
116
|
+
// Insert: Required subdocument properties
|
|
117
|
+
await expect(user.validate({ animals: {} })).rejects.toEqual(
|
|
118
|
+
expect.arrayContaining([
|
|
119
|
+
expect.objectContaining({
|
|
120
|
+
status: '400',
|
|
121
|
+
title: 'animals.cat',
|
|
122
|
+
detail: 'This field is required.',
|
|
123
|
+
meta: { rule: 'required', model: 'user', field: 'cat' }
|
|
124
|
+
}),
|
|
125
|
+
expect.objectContaining({
|
|
126
|
+
status: '400',
|
|
127
|
+
title: 'animals.dog.color',
|
|
128
|
+
detail: 'This field is required.',
|
|
129
|
+
meta: { rule: 'required', model: 'user', field: 'color' }
|
|
130
|
+
}),
|
|
131
|
+
])
|
|
132
|
+
)
|
|
113
133
|
|
|
114
|
-
//
|
|
115
|
-
await expect(user.validate({})).rejects.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
134
|
+
// Insert: Invalid subdocument type
|
|
135
|
+
await expect(user.validate({ animals: { dog: 1 }})).rejects.toEqual(
|
|
136
|
+
expect.arrayContaining([
|
|
137
|
+
expect.objectContaining({
|
|
138
|
+
status: '400',
|
|
139
|
+
title: 'animals.cat',
|
|
140
|
+
detail: 'This field is required.',
|
|
141
|
+
meta: { rule: 'required', model: 'user', field: 'cat' }
|
|
142
|
+
}),
|
|
143
|
+
expect.objectContaining({
|
|
144
|
+
status: '400',
|
|
145
|
+
title: 'animals.dog',
|
|
146
|
+
detail: 'Value was not an object.',
|
|
147
|
+
meta: { rule: 'isObject', model: 'user', field: 'dog' }
|
|
148
|
+
}),
|
|
149
|
+
])
|
|
150
|
+
)
|
|
121
151
|
|
|
122
|
-
//
|
|
123
|
-
await expect(user.validate({ animals: {} }, {
|
|
124
|
-
|
|
125
|
-
title: 'animals.cat',
|
|
126
|
-
detail: 'This field is required.',
|
|
127
|
-
meta: { rule: 'required', model: 'user', field: 'cat' }
|
|
152
|
+
// Insert: Ignore required subdocument property with a defined parent
|
|
153
|
+
await expect(user.validate({ animals: {} }, { validateUndefined: false })).resolves.toEqual({
|
|
154
|
+
animals: {}
|
|
128
155
|
})
|
|
129
156
|
|
|
130
|
-
// Required subdocument property
|
|
131
|
-
await expect(user.validate({ animals: {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
157
|
+
// Update: Required subdocument property when a parent/grandparent is specified
|
|
158
|
+
await expect(user.validate({ animals: {} }, { update: true })).rejects.toEqual(
|
|
159
|
+
expect.arrayContaining([
|
|
160
|
+
expect.objectContaining({
|
|
161
|
+
status: '400',
|
|
162
|
+
title: 'animals.cat',
|
|
163
|
+
detail: 'This field is required.',
|
|
164
|
+
meta: { rule: 'required', model: 'user', field: 'cat' }
|
|
165
|
+
}),
|
|
166
|
+
expect.objectContaining({
|
|
167
|
+
status: '400',
|
|
168
|
+
title: 'animals.dog.color',
|
|
169
|
+
detail: 'This field is required.',
|
|
170
|
+
meta: { rule: 'required', model: 'user', field: 'color' }
|
|
171
|
+
}),
|
|
172
|
+
])
|
|
173
|
+
)
|
|
137
174
|
|
|
138
|
-
// Required subdocument property
|
|
139
|
-
await expect(user.validate({ animals: {} }, { update: true })).rejects.
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
175
|
+
// Update: Required subdocument property when a parent is specified
|
|
176
|
+
await expect(user.validate({ animals: { dog: {}} }, { update: true })).rejects.toEqual(
|
|
177
|
+
expect.arrayContaining([
|
|
178
|
+
expect.objectContaining({
|
|
179
|
+
status: '400',
|
|
180
|
+
title: 'animals.cat',
|
|
181
|
+
detail: 'This field is required.',
|
|
182
|
+
meta: { rule: 'required', model: 'user', field: 'cat' }
|
|
183
|
+
}),
|
|
184
|
+
expect.objectContaining({
|
|
185
|
+
status: '400',
|
|
186
|
+
title: 'animals.dog.color',
|
|
187
|
+
detail: 'This field is required.',
|
|
188
|
+
meta: { rule: 'required', model: 'user', field: 'color' }
|
|
189
|
+
}),
|
|
190
|
+
])
|
|
191
|
+
)
|
|
145
192
|
|
|
146
|
-
// Ignore required subdocument property
|
|
193
|
+
// Update: Ignore required subdocument property when root parent is undefined
|
|
147
194
|
await expect(user.validate({}, { update: true })).resolves.toEqual({})
|
|
148
195
|
|
|
149
|
-
// Ignore required subdocument property with a defined parent (update) (not required if ignoreUndefined set)
|
|
150
|
-
await expect(user.validate({ animals: {} }, { ignoreUndefined: true })).resolves.toEqual({
|
|
151
|
-
animals: {}
|
|
152
|
-
})
|
|
153
196
|
|
|
154
|
-
// Ignore required subdocument property with a defined parent
|
|
155
|
-
await expect(user.validate({ animals: {} }, { update: true,
|
|
197
|
+
// Update: Ignore required subdocument property with a defined parent when validateUndefined = false
|
|
198
|
+
await expect(user.validate({ animals: {} }, { update: true, validateUndefined: false })).resolves.toEqual({
|
|
156
199
|
animals: {}
|
|
157
200
|
})
|
|
158
201
|
|
|
159
|
-
// Required subdocument property
|
|
160
|
-
await expect(user.validate({ animals: { cat: '' }}, { update: true,
|
|
202
|
+
// Update: Required defined subdocument property when validateUndefined = false
|
|
203
|
+
await expect(user.validate({ animals: { cat: '' }}, { update: true, validateUndefined: false }))
|
|
204
|
+
.rejects.toContainEqual({
|
|
161
205
|
status: '400',
|
|
162
206
|
title: 'animals.cat',
|
|
163
207
|
detail: 'This field is required.',
|
|
@@ -214,17 +258,17 @@ module.exports = function(monastery, opendb) {
|
|
|
214
258
|
await expect(user.validate({ animals: { dogs: [] }}))
|
|
215
259
|
.resolves.toEqual({ animals: { dogs: [] }})
|
|
216
260
|
|
|
217
|
-
// No undefined item errors with
|
|
261
|
+
// No undefined item errors with validateUndefined=false
|
|
218
262
|
await expect(user.validate(
|
|
219
263
|
{ animals: { dogs: [{ name: 'sparky' }] }},
|
|
220
|
-
{ update: true,
|
|
264
|
+
{ update: true, validateUndefined: false }
|
|
221
265
|
))
|
|
222
266
|
.resolves.toEqual({ animals: { dogs: [{ name: 'sparky' }] }})
|
|
223
267
|
|
|
224
|
-
// Requried error within an array subdocument (even during update when parent defined &&
|
|
268
|
+
// Requried error within an array subdocument (even during update when parent defined && validateUndefined = false)
|
|
225
269
|
await expect(user.validate(
|
|
226
270
|
{ animals: { dogs: [{ name: 'sparky', color: '' }] }},
|
|
227
|
-
{ update: true,
|
|
271
|
+
{ update: true, validateUndefined: false }
|
|
228
272
|
))
|
|
229
273
|
.rejects.toContainEqual(error)
|
|
230
274
|
})
|
|
@@ -233,7 +277,6 @@ module.exports = function(monastery, opendb) {
|
|
|
233
277
|
let fn = validate._getMostSpecificKeyMatchingPath
|
|
234
278
|
let mock = {
|
|
235
279
|
'cats.name': true,
|
|
236
|
-
'cats.name': true,
|
|
237
280
|
|
|
238
281
|
'dogs.name': true,
|
|
239
282
|
'dogs.$.name': true,
|
|
@@ -318,7 +361,7 @@ module.exports = function(monastery, opendb) {
|
|
|
318
361
|
// Setup
|
|
319
362
|
// Todo: Setup testing for array array subdocument field messages
|
|
320
363
|
let db = (await opendb(false)).db
|
|
321
|
-
let arrayWithSchema = (array, schema) => { array.schema = schema; return array }
|
|
364
|
+
// let arrayWithSchema = (array, schema) => { array.schema = schema; return array }
|
|
322
365
|
let user = db.model('user', {
|
|
323
366
|
fields: {
|
|
324
367
|
name: { type: 'string', minLength: 4 },
|
|
@@ -415,14 +458,16 @@ module.exports = function(monastery, opendb) {
|
|
|
415
458
|
meta: { rule: 'minLength', model: 'user', field: 'name' }
|
|
416
459
|
})
|
|
417
460
|
// array-subdocument-1-field error
|
|
418
|
-
await expect(user.validate({ catNames: [{ name: 'carla' }, { name: 'ben' }] }))
|
|
461
|
+
await expect(user.validate({ catNames: [{ name: 'carla' }, { name: 'ben' }] }))
|
|
462
|
+
.rejects.toContainEqual({
|
|
419
463
|
status: '400',
|
|
420
464
|
title: 'catNames.1.name',
|
|
421
465
|
detail: 'min length error (1)',
|
|
422
466
|
meta: { rule: 'minLength', model: 'user', field: 'name' }
|
|
423
467
|
})
|
|
424
468
|
// array-subdocument-2-field error
|
|
425
|
-
await expect(user.validate({ catNames: [{ name: 'carla' }, { name: 'carla' }, { name: 'ben' }] }))
|
|
469
|
+
await expect(user.validate({ catNames: [{ name: 'carla' }, { name: 'carla' }, { name: 'ben' }] }))
|
|
470
|
+
.rejects.toContainEqual({
|
|
426
471
|
status: '400',
|
|
427
472
|
title: 'catNames.2.name',
|
|
428
473
|
detail: 'min length error (2)',
|
|
@@ -431,28 +476,32 @@ module.exports = function(monastery, opendb) {
|
|
|
431
476
|
|
|
432
477
|
|
|
433
478
|
// array-subdocument-field error (loose $ match)
|
|
434
|
-
await expect(user.validate({ pigNames: [[{ name: 'ben' }]] }))
|
|
479
|
+
await expect(user.validate({ pigNames: [[{ name: 'ben' }]] }))
|
|
480
|
+
.rejects.toContainEqual({
|
|
435
481
|
status: '400',
|
|
436
482
|
title: 'pigNames.0.0.name',
|
|
437
483
|
detail: 'min length error ($)',
|
|
438
484
|
meta: { rule: 'minLength', model: 'user', field: 'name' }
|
|
439
485
|
})
|
|
440
486
|
// array-subdocument-1-field error
|
|
441
|
-
await expect(user.validate({ pigNames: [[{ name: 'carla' }, { name: 'ben' }]] }))
|
|
487
|
+
await expect(user.validate({ pigNames: [[{ name: 'carla' }, { name: 'ben' }]] }))
|
|
488
|
+
.rejects.toContainEqual({
|
|
442
489
|
status: '400',
|
|
443
490
|
title: 'pigNames.0.1.name',
|
|
444
491
|
detail: 'min length error (1)',
|
|
445
492
|
meta: { rule: 'minLength', model: 'user', field: 'name' }
|
|
446
493
|
})
|
|
447
494
|
// array-subdocument-0-2-field error
|
|
448
|
-
await expect(user.validate({ pigNames: [[{ name: 'carla' }, { name: 'carla' }, { name: 'ben' }]] }))
|
|
495
|
+
await expect(user.validate({ pigNames: [[{ name: 'carla' }, { name: 'carla' }, { name: 'ben' }]] }))
|
|
496
|
+
.rejects.toContainEqual({
|
|
449
497
|
status: '400',
|
|
450
498
|
title: 'pigNames.0.2.name',
|
|
451
499
|
detail: 'min length error (deep 0 2)',
|
|
452
500
|
meta: { rule: 'minLength', model: 'user', field: 'name' }
|
|
453
501
|
})
|
|
454
502
|
// array-subdocument-2-0-field error (fallback)
|
|
455
|
-
await expect(user.validate({ pigNames: [[],[],[{ name: 'carla' },{ name: 'carla' },{ name: 'ben' }]] }))
|
|
503
|
+
await expect(user.validate({ pigNames: [[],[],[{ name: 'carla' },{ name: 'carla' },{ name: 'ben' }]] }))
|
|
504
|
+
.rejects.toContainEqual({
|
|
456
505
|
status: '400',
|
|
457
506
|
title: 'pigNames.2.2.name',
|
|
458
507
|
detail: 'min length error (deep $ 2)',
|
|
@@ -475,7 +524,7 @@ module.exports = function(monastery, opendb) {
|
|
|
475
524
|
name: { type: 'string', bigName: 8 },
|
|
476
525
|
animals: [{
|
|
477
526
|
name: { type: 'string', bigName: 8 }
|
|
478
|
-
}]
|
|
527
|
+
}],
|
|
479
528
|
},
|
|
480
529
|
rules: {
|
|
481
530
|
bigName: function(value, ruleArg) {
|
|
@@ -483,6 +532,21 @@ module.exports = function(monastery, opendb) {
|
|
|
483
532
|
}
|
|
484
533
|
}
|
|
485
534
|
})
|
|
535
|
+
let user2 = db.model('user2', {
|
|
536
|
+
fields: {
|
|
537
|
+
name: { type: 'string' },
|
|
538
|
+
nickname: { type: 'string', requiredIfNoName: true },
|
|
539
|
+
age: { type: 'number', required: true },
|
|
540
|
+
},
|
|
541
|
+
rules: {
|
|
542
|
+
requiredIfNoName: {
|
|
543
|
+
validateUndefined: true,
|
|
544
|
+
fn: function(value, ruleArg) {
|
|
545
|
+
return value || this.name
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
})
|
|
486
550
|
|
|
487
551
|
// Basic field
|
|
488
552
|
await expect(user.validate({ name: 'benjamin' })).resolves.toEqual({ name: 'benjamin' })
|
|
@@ -494,13 +558,48 @@ module.exports = function(monastery, opendb) {
|
|
|
494
558
|
})
|
|
495
559
|
|
|
496
560
|
// subdocument in an array
|
|
497
|
-
await expect(user.validate({ animals: [{ name: 'benjamin' }] })).resolves.toEqual({
|
|
561
|
+
await expect(user.validate({ animals: [{ name: 'benjamin' }] })).resolves.toEqual({
|
|
562
|
+
animals: [{ name: 'benjamin' }]
|
|
563
|
+
})
|
|
498
564
|
await expect(user.validate({ animals: [{ name: 'ben' }] })).rejects.toContainEqual({
|
|
499
565
|
status: '400',
|
|
500
566
|
title: 'animals.0.name',
|
|
501
567
|
detail: 'Invalid data property for rule "bigName".',
|
|
502
568
|
meta: { rule: 'bigName', model: 'user', field: 'name' }
|
|
503
569
|
})
|
|
570
|
+
|
|
571
|
+
// Required rule based off another field (create)
|
|
572
|
+
await expect(user2.validate({ name: 'benjamin', age: 12 })).resolves.toEqual({
|
|
573
|
+
name: 'benjamin',
|
|
574
|
+
age: 12
|
|
575
|
+
})
|
|
576
|
+
await expect(user2.validate({ nickname: 'benny', age: 12 })).resolves.toEqual({
|
|
577
|
+
nickname: 'benny',
|
|
578
|
+
age: 12
|
|
579
|
+
})
|
|
580
|
+
await expect(user2.validate({ })).rejects.toEqual([
|
|
581
|
+
{
|
|
582
|
+
'detail': 'Invalid data property for rule "requiredIfNoName".',
|
|
583
|
+
'meta': { 'field': 'nickname', 'model': 'user2', 'rule': 'requiredIfNoName'},
|
|
584
|
+
'status': '400',
|
|
585
|
+
'title': 'nickname'
|
|
586
|
+
}, {
|
|
587
|
+
'detail': 'This field is required.',
|
|
588
|
+
'meta': { 'field': 'age', 'model': 'user2', 'rule': 'required'},
|
|
589
|
+
'status': '400',
|
|
590
|
+
'title': 'age'
|
|
591
|
+
}
|
|
592
|
+
])
|
|
593
|
+
await expect(user2.validate({ }, { validateUndefined: false })).resolves.toEqual({})
|
|
594
|
+
|
|
595
|
+
// Required rule based off another field (update)
|
|
596
|
+
await expect(user2.validate({ }, { update: true })).resolves.toEqual({})
|
|
597
|
+
await expect(user2.validate({ nickname: '' }, { update: true })).rejects.toEqual([{
|
|
598
|
+
'detail': 'Invalid data property for rule "requiredIfNoName".',
|
|
599
|
+
'meta': { 'field': 'nickname', 'model': 'user2', 'rule': 'requiredIfNoName'},
|
|
600
|
+
'status': '400',
|
|
601
|
+
'title': 'nickname'
|
|
602
|
+
}])
|
|
504
603
|
})
|
|
505
604
|
|
|
506
605
|
test('Validated data', async () => {
|
|
@@ -524,8 +623,13 @@ module.exports = function(monastery, opendb) {
|
|
|
524
623
|
// Ignores invalid data
|
|
525
624
|
await expect(user.validate({ badprop: true, schema: {} })).resolves.toEqual({})
|
|
526
625
|
|
|
527
|
-
//
|
|
528
|
-
await expect(user.validate({ name: null })).
|
|
626
|
+
// Rejects null for non object/array fields
|
|
627
|
+
await expect(user.validate({ name: null })).rejects.toEqual([{
|
|
628
|
+
'detail': 'Value was not a string.',
|
|
629
|
+
'meta': {'detailLong': undefined, 'field': 'name', 'model': 'user', 'rule': 'isString'},
|
|
630
|
+
'status':'400',
|
|
631
|
+
'title': 'name'
|
|
632
|
+
}])
|
|
529
633
|
|
|
530
634
|
// String data
|
|
531
635
|
await expect(user.validate({ name: 'Martin Luther' })).resolves.toEqual({ name: 'Martin Luther' })
|
|
@@ -548,9 +652,14 @@ module.exports = function(monastery, opendb) {
|
|
|
548
652
|
|
|
549
653
|
// Subdocument property data (null)
|
|
550
654
|
await expect(user.validate({ animals: { dog: null }}))
|
|
551
|
-
.
|
|
552
|
-
|
|
553
|
-
|
|
655
|
+
.rejects.toEqual([{
|
|
656
|
+
'detail': 'Value was not a string.',
|
|
657
|
+
'meta': {'detailLong': undefined, 'field': 'dog', 'model': 'user', 'rule': 'isString'},
|
|
658
|
+
'status': '400',
|
|
659
|
+
'title': 'animals.dog',
|
|
660
|
+
}])
|
|
661
|
+
|
|
662
|
+
// Subdocument property data (unknown data)
|
|
554
663
|
await expect(user.validate({ animals: { dog: 'sparky', cat: 'grumpy' } }))
|
|
555
664
|
.resolves.toEqual({ animals: { dog: 'sparky' } })
|
|
556
665
|
|
|
@@ -588,11 +697,11 @@ module.exports = function(monastery, opendb) {
|
|
|
588
697
|
|
|
589
698
|
// Index, mongodb connection error
|
|
590
699
|
await expect(user3._setupIndexes({ name: { type: 'string', index: 'text' }})).rejects
|
|
591
|
-
.toEqual({ type:
|
|
700
|
+
.toEqual({ type: 'info', detail: 'Skipping createIndex on the \'user3\' model, no mongodb connection found.' })
|
|
592
701
|
|
|
593
702
|
// Model id (Monk ObjectId)
|
|
594
|
-
let data = await user4.validate({ name:
|
|
595
|
-
await expect(data.name.toString()).toEqual(db.id(
|
|
703
|
+
let data = await user4.validate({ name: '5d4356299d0f010017602f6b' })
|
|
704
|
+
await expect(data.name.toString()).toEqual(db.id('5d4356299d0f010017602f6b').toString())
|
|
596
705
|
await expect(data.name).toEqual(expect.any(Object))
|
|
597
706
|
|
|
598
707
|
// Bad model id (Monk ObjectId)
|
|
@@ -617,7 +726,6 @@ module.exports = function(monastery, opendb) {
|
|
|
617
726
|
amount: { type: 'number', required: true },
|
|
618
727
|
}})
|
|
619
728
|
|
|
620
|
-
|
|
621
729
|
// MinLength
|
|
622
730
|
await expect(user.validate({ name: 'Martin Luther' })).resolves.toEqual({name: 'Martin Luther'})
|
|
623
731
|
await expect(user.validate({ name: 'Carl' })).rejects.toContainEqual({
|
|
@@ -661,7 +769,12 @@ module.exports = function(monastery, opendb) {
|
|
|
661
769
|
await expect(user2.validate({ amount: 0 })).resolves.toEqual({ amount: 0 }) // required
|
|
662
770
|
await expect(user.validate({ amount: '0' })).resolves.toEqual({ amount: 0 }) // required
|
|
663
771
|
await expect(user.validate({ amount: undefined })).resolves.toEqual({}) // not required
|
|
664
|
-
await expect(user.validate({ amount: null })).
|
|
772
|
+
await expect(user.validate({ amount: null })).rejects.toEqual([{ // type error
|
|
773
|
+
'detail': 'Value was not a number.',
|
|
774
|
+
'meta': { 'field': 'amount', 'model': 'user', 'rule': 'isNumber'},
|
|
775
|
+
'status': '400',
|
|
776
|
+
'title': 'amount'
|
|
777
|
+
}])
|
|
665
778
|
|
|
666
779
|
// Number required
|
|
667
780
|
let mock1 = {
|
|
@@ -686,14 +799,14 @@ module.exports = function(monastery, opendb) {
|
|
|
686
799
|
await expect(user.validate({ amount: 'bad' })).rejects.toContainEqual(mock2)
|
|
687
800
|
})
|
|
688
801
|
|
|
689
|
-
test('Schema default objects', async (
|
|
802
|
+
test('Schema default objects', async () => {
|
|
690
803
|
let db = (await opendb(null, {
|
|
691
804
|
timestamps: false,
|
|
692
805
|
defaultObjects: true,
|
|
693
806
|
serverSelectionTimeoutMS: 2000
|
|
694
807
|
})).db
|
|
695
808
|
|
|
696
|
-
let base = { names: [], animals: { dogs: [] }}
|
|
809
|
+
// let base = { names: [], animals: { dogs: [] }}
|
|
697
810
|
let user = db.model('user', { fields: {
|
|
698
811
|
name: { type: 'string' },
|
|
699
812
|
names: [{ type: 'string' }],
|
|
@@ -710,10 +823,9 @@ module.exports = function(monastery, opendb) {
|
|
|
710
823
|
})
|
|
711
824
|
|
|
712
825
|
db.close()
|
|
713
|
-
done()
|
|
714
826
|
})
|
|
715
827
|
|
|
716
|
-
test('Schema nullObjects', async (
|
|
828
|
+
test('Schema nullObjects', async () => {
|
|
717
829
|
let db = (await opendb(null, {
|
|
718
830
|
timestamps: false,
|
|
719
831
|
nullObjects: true,
|
|
@@ -728,10 +840,15 @@ module.exports = function(monastery, opendb) {
|
|
|
728
840
|
}})
|
|
729
841
|
|
|
730
842
|
// Subdocument data (null/string)
|
|
843
|
+
await expect(user.validate({ animals: 'notAnObject' })).rejects.toEqual([{
|
|
844
|
+
'detail': 'Value was not an object.',
|
|
845
|
+
'meta': {'detailLong': undefined, 'field': 'animals', 'model': 'user', 'rule': 'isObject'},
|
|
846
|
+
'status': '400',
|
|
847
|
+
'title': 'animals'
|
|
848
|
+
}])
|
|
731
849
|
await expect(user.validate({ animals: '', names: null })).resolves.toEqual({ animals: null, names: null })
|
|
732
850
|
|
|
733
851
|
db.close()
|
|
734
|
-
done()
|
|
735
852
|
})
|
|
736
853
|
|
|
737
854
|
test('Validation options', async () => {
|
|
@@ -788,13 +905,13 @@ module.exports = function(monastery, opendb) {
|
|
|
788
905
|
{ people2: [{ people3: [{}, {}] }] },
|
|
789
906
|
{ skipValidation: ['people2.$.people3.0.name'] }
|
|
790
907
|
)).rejects.toContainEqual({
|
|
791
|
-
detail:
|
|
792
|
-
status:
|
|
793
|
-
title:
|
|
908
|
+
detail: 'This field is required.',
|
|
909
|
+
status: '400',
|
|
910
|
+
title: 'people2.0.people3.1.name',
|
|
794
911
|
meta: {
|
|
795
|
-
field:
|
|
796
|
-
model:
|
|
797
|
-
rule:
|
|
912
|
+
field: 'name',
|
|
913
|
+
model: 'user3',
|
|
914
|
+
rule: 'required'
|
|
798
915
|
}
|
|
799
916
|
})
|
|
800
917
|
|
|
@@ -808,18 +925,18 @@ module.exports = function(monastery, opendb) {
|
|
|
808
925
|
|
|
809
926
|
// Non existing validation field entries
|
|
810
927
|
await expect(user3.validate({ people: [{}] }, { skipValidation: ['people.badField'] })).rejects.toContainEqual({
|
|
811
|
-
detail:
|
|
812
|
-
status:
|
|
813
|
-
title:
|
|
928
|
+
detail: 'This field is required.',
|
|
929
|
+
status: '400',
|
|
930
|
+
title: 'people.0.name',
|
|
814
931
|
meta: {
|
|
815
|
-
model:
|
|
816
|
-
field:
|
|
817
|
-
rule:
|
|
932
|
+
model: 'user3',
|
|
933
|
+
field: 'name',
|
|
934
|
+
rule: 'required'
|
|
818
935
|
}
|
|
819
936
|
})
|
|
820
937
|
})
|
|
821
938
|
|
|
822
|
-
test('Validation hooks', async (
|
|
939
|
+
test('Validation hooks', async () => {
|
|
823
940
|
let db = (await opendb(null)).db
|
|
824
941
|
let user = db.model('user', {
|
|
825
942
|
fields: {
|
|
@@ -841,16 +958,16 @@ module.exports = function(monastery, opendb) {
|
|
|
841
958
|
let userDoc = await user.insert({ data: { first: 'Martin', last: 'Luther' }})
|
|
842
959
|
|
|
843
960
|
// Catch validate (a)synchronous errors thrown in function or through `next(err)`
|
|
844
|
-
await expect(user.validate({ first: '' })).rejects.toThrow(
|
|
845
|
-
await expect(user.validate({ first: 'Martin' })).rejects.toThrow(
|
|
961
|
+
await expect(user.validate({ first: '' })).rejects.toThrow('beforeValidate error 1..')
|
|
962
|
+
await expect(user.validate({ first: 'Martin' })).rejects.toThrow('beforeValidate error 2..')
|
|
846
963
|
await expect(user.validate({ first: 'Martin', last: 'Luther' })).resolves.toEqual({
|
|
847
964
|
first: 'Martin',
|
|
848
965
|
last: 'Luther'
|
|
849
966
|
})
|
|
850
967
|
|
|
851
968
|
// Catch insert (a)synchronous errors thrown in function or through `next(err)`
|
|
852
|
-
await expect(user.insert({ data: { first: '' } })).rejects.toThrow(
|
|
853
|
-
await expect(user.insert({ data: { first: 'Martin' } })).rejects.toThrow(
|
|
969
|
+
await expect(user.insert({ data: { first: '' } })).rejects.toThrow('beforeValidate error 1..')
|
|
970
|
+
await expect(user.insert({ data: { first: 'Martin' } })).rejects.toThrow('beforeValidate error 2..')
|
|
854
971
|
await expect(user.insert({ data: { first: 'Martin', last: 'Luther' } })).resolves.toEqual({
|
|
855
972
|
_id: expect.any(Object),
|
|
856
973
|
first: 'Martin',
|
|
@@ -858,15 +975,17 @@ module.exports = function(monastery, opendb) {
|
|
|
858
975
|
})
|
|
859
976
|
|
|
860
977
|
// Catch update (a)synchronous errors thrown in function or through `next(err)`
|
|
861
|
-
await expect(user.update({ query: userDoc._id, data: { first: '' } }))
|
|
862
|
-
|
|
863
|
-
await expect(user.update({ query: userDoc._id, data: { first: 'Martin'
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
978
|
+
await expect(user.update({ query: userDoc._id, data: { first: '' } }))
|
|
979
|
+
.rejects.toThrow('beforeValidate error 1..')
|
|
980
|
+
await expect(user.update({ query: userDoc._id, data: { first: 'Martin' } }))
|
|
981
|
+
.rejects.toThrow('beforeValidate error 2..')
|
|
982
|
+
await expect(user.update({ query: userDoc._id, data: { first: 'Martin', last: 'Luther' } }))
|
|
983
|
+
.resolves.toEqual({
|
|
984
|
+
first: 'Martin',
|
|
985
|
+
last: 'Luther'
|
|
986
|
+
})
|
|
867
987
|
|
|
868
988
|
db.close()
|
|
869
|
-
done()
|
|
870
989
|
})
|
|
871
990
|
|
|
872
991
|
}
|
package/test/virtuals.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module.exports = function(monastery, opendb) {
|
|
2
2
|
|
|
3
|
-
test('Virtuals', async (
|
|
3
|
+
test('Virtuals', async () => {
|
|
4
4
|
// Setup
|
|
5
5
|
let db = (await opendb(null)).db
|
|
6
6
|
// Test model setup
|
|
@@ -145,10 +145,9 @@ module.exports = function(monastery, opendb) {
|
|
|
145
145
|
})
|
|
146
146
|
|
|
147
147
|
db.close()
|
|
148
|
-
done()
|
|
149
148
|
})
|
|
150
149
|
|
|
151
|
-
test('Insert/update virtuals (validate)', async (
|
|
150
|
+
test('Insert/update virtuals (validate)', async () => {
|
|
152
151
|
// Setup
|
|
153
152
|
let db = (await opendb(null)).db
|
|
154
153
|
let user = db.model('user', {
|
|
@@ -246,7 +245,6 @@ module.exports = function(monastery, opendb) {
|
|
|
246
245
|
}
|
|
247
246
|
})
|
|
248
247
|
db.close()
|
|
249
|
-
done()
|
|
250
248
|
})
|
|
251
249
|
|
|
252
250
|
}
|