mongoose
Version:
Mongoose MongoDB ODM
215 lines (179 loc) • 5.98 kB
JavaScript
/**
* Test dependencies.
*/
var start = require('./common')
, mongoose = start.mongoose
, assert = require('assert')
, random = require('../lib/utils').random
, Query = require('../lib/query')
, Schema = mongoose.Schema
, SchemaType = mongoose.SchemaType
, CastError = SchemaType.CastError
, ValidatorError = SchemaType.ValidatorError
, ValidationError = mongoose.Document.ValidationError
, ObjectId = Schema.ObjectId
, DocumentObjectId = mongoose.Types.ObjectId
, DocumentArray = mongoose.Types.DocumentArray
, EmbeddedDocument = mongoose.Types.Embedded
, MongooseNumber = mongoose.Types.Number
, MongooseArray = mongoose.Types.Array
, MongooseError = mongoose.Error;
describe('document: strict mode:', function(){
it('should work', function(done){
var db = start();
var lax = new Schema({
ts : { type: Date, default: Date.now }
, content: String
}, { strict: false });
var strict = new Schema({
ts : { type: Date, default: Date.now }
, content: String
});
var Lax = db.model('Lax', lax);
var Strict = db.model('Strict', strict);
var l = new Lax({content: 'sample', rouge: 'data'});
assert.equal(false, l._strictMode);
l = l.toObject();
assert.equal('sample', l.content);
assert.equal('data', l.rouge);
var s = new Strict({content: 'sample', rouge: 'data'});
assert.equal(true, s._strictMode);
s = s.toObject();
assert.ok('ts' in s);
assert.equal('sample', s.content);
assert.ok(!('rouge' in s));
assert.ok(!s.rouge);
// instance override
var instance = new Lax({content: 'sample', rouge: 'data'}, true);
assert.ok(instance._strictMode);
instance = instance.toObject();
assert.equal('sample', instance.content);
assert.ok(!instance.rouge);
assert.ok('ts' in instance);
// hydrate works as normal, but supports the schema level flag.
var s2 = new Strict({content: 'sample', rouge: 'data'}, false);
assert.equal(false, s2._strictMode);
s2 = s2.toObject();
assert.ok('ts' in s2);
assert.equal('sample', s2.content);
assert.ok('rouge' in s2);
// testing init
var s3 = new Strict();
s3.init({content: 'sample', rouge: 'data'});
var s3obj = s3.toObject();
assert.equal('sample', s3.content);
assert.ok(!('rouge' in s3));
assert.ok(!s3.rouge);
// strict on create
Strict.create({content: 'sample2', rouge: 'data'}, function(err, doc){
db.close();
assert.equal('sample2', doc.content);
assert.ok(!('rouge' in doc));
assert.ok(!doc.rouge);
done();
});
})
it('nested doc', function(){
var db = start();
var lax = new Schema({
name: { last: String }
}, { strict: false });
var strict = new Schema({
name: { last: String }
});
var Lax = db.model('NestedLax', lax, 'nestdoc'+random());
var Strict = db.model('NestedStrict', strict, 'nestdoc'+random());
db.close();
var l = new Lax;
l.set('name', { last: 'goose', hack: 'xx' });
l = l.toObject();
assert.equal('goose', l.name.last);
assert.equal('xx', l.name.hack);
var s = new Strict;
s.set({ name: { last: 'goose', hack: 'xx' }});
s = s.toObject();
assert.equal('goose', s.name.last);
assert.ok(!('hack' in s.name));
assert.ok(!s.name.hack);
s = new Strict;
s.set('name', { last: 'goose', hack: 'xx' });
s.set('shouldnt.exist', ':(');
s = s.toObject();
assert.equal('goose', s.name.last);
assert.ok(!('hack' in s.name));
assert.ok(!s.name.hack);
assert.ok(!s.shouldnt);
})
it('sub doc', function(done){
var db = start();
var lax = new Schema({
ts : { type: Date, default: Date.now }
, content: String
}, { strict: false });
var strict = new Schema({
ts : { type: Date, default: Date.now }
, content: String
});
var Lax = db.model('EmbeddedLax', new Schema({ dox: [lax] }, { strict: false }), 'embdoc'+random());
var Strict = db.model('EmbeddedStrict', new Schema({ dox: [strict] }, { strict: false }), 'embdoc'+random());
var l = new Lax({ dox: [{content: 'sample', rouge: 'data'}] });
assert.equal(false, l.dox[0]._strictMode);
l = l.dox[0].toObject();
assert.equal('sample', l.content);
assert.equal('data', l.rouge);
assert.ok(l.rouge);
var s = new Strict({ dox: [{content: 'sample', rouge: 'data'}] });
assert.equal(true, s.dox[0]._strictMode);
s = s.dox[0].toObject();
assert.ok('ts' in s);
assert.equal('sample', s.content);
assert.ok(!('rouge' in s));
assert.ok(!s.rouge);
// testing init
var s3 = new Strict();
s3.init({dox: [{content: 'sample', rouge: 'data'}]});
var s3obj = s3.toObject();
assert.equal('sample', s3.dox[0].content);
assert.ok(!('rouge' in s3.dox[0]));
assert.ok(!s3.dox[0].rouge);
// strict on create
Strict.create({dox:[{content: 'sample2', rouge: 'data'}]}, function(err, doc){
db.close();
assert.equal('sample2', doc.dox[0].content);
assert.ok(!('rouge' in doc.dox[0]));
assert.ok(!doc.dox[0].rouge);
done();
});
})
it('virtuals', function(){
var db = start();
var getCount = 0
, setCount = 0;
var strictSchema = new Schema({
email: String
, prop: String
});
strictSchema
.virtual('myvirtual')
.get(function() {
getCount++;
return 'ok';
})
.set(function(v) {
setCount++;
this.prop = v;
});
var StrictModel = db.model('StrictVirtual', strictSchema);
var strictInstance = new StrictModel({
email: 'hunter@skookum.com'
, myvirtual: 'test'
});
db.close();
assert.equal(0, getCount);
assert.equal(1, setCount);
strictInstance.myvirtual = 'anotherone';
var myvirtual = strictInstance.myvirtual;
assert.equal(1, getCount);
assert.equal(2, setCount);
})
})