mongoose
Version:
Mongoose MongoDB ODM
109 lines (91 loc) • 3.58 kB
JavaScript
var start = require('./common')
, assert = require('assert')
, mongoose = start.mongoose
, random = require('../lib/utils').random
, Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
/**
* Setup.
*/
var DecoratedSchema = new Schema({
title : String
}, { strict: false });
mongoose.model('Decorated', DecoratedSchema);
var collection = 'decorated_' + random();
describe('schema.onthefly', function(){
it('setting should cache the schema type and cast values appropriately', function () {
var db = start()
, Decorated = db.model('Decorated', collection);
db.close();
var post = new Decorated();
post.set('adhoc', '9', Number);
assert.equal(9, post.get('adhoc').valueOf());
});
it('should be local to the particular document', function () {
var db = start()
, Decorated = db.model('Decorated', collection);
db.close();
var postOne = new Decorated();
postOne.set('adhoc', '9', Number);
assert.notStrictEqual(postOne._path('adhoc'),undefined);
var postTwo = new Decorated();
assert.notStrictEqual(postTwo._path('title'),undefined);
assert.strictEqual(undefined, postTwo._path('adhoc'));
});
it('querying a document that had an on the fly schema should work', function (done) {
var db = start()
, Decorated = db.model('Decorated', collection);
var post = new Decorated({title: 'AD HOC'});
// Interpret adhoc as a Number
post.set('adhoc', '9', Number);
assert.equal(9, post.get('adhoc').valueOf());
post.save(function (err) {
assert.ifError(err);
assert.strictEqual(null, err);
Decorated.findById(post.id, function (err, found) {
db.close();
assert.strictEqual(null, err);
assert.equal(9, found.get('adhoc'));
// Interpret adhoc as a String instead of a Number now
assert.equal('9', found.get('adhoc', String));
assert.equal('9', found.get('adhoc'));
done();
});
});
});
it('on the fly Embedded Array schemas should cast properly', function () {
var db = start()
, Decorated = db.model('Decorated', collection);
db.close();
var post = new Decorated();
post.set('moderators', [{name: 'alex trebek'}], [new Schema({name: String})]);
assert.equal(post.get('moderators')[0].name,'alex trebek');
})
it('on the fly Embedded Array schemas should get from a fresh queried document properly', function (done) {
var db = start()
, Decorated = db.model('Decorated', collection);
var post = new Decorated()
, ModeratorSchema = new Schema({name: String, ranking: Number});
post.set('moderators', [{name: 'alex trebek', ranking: '1'}], [ModeratorSchema]);
assert.equal(post.get('moderators')[0].name,'alex trebek');
post.save(function (err) {
assert.ifError(err);
Decorated.findById(post.id, function (err, found) {
db.close();
assert.ifError(err);
var rankingPreCast = found.get('moderators')[0].ranking;
assert.equal(1, rankingPreCast);
assert.strictEqual(undefined, rankingPreCast.increment);
var rankingPostCast = found.get('moderators', [ModeratorSchema])[0].ranking;
assert.equal(1, rankingPostCast);
var NewModeratorSchema = new Schema({ name: String, ranking: String});
rankingPostCast = found.get('moderators', [NewModeratorSchema])[0].ranking;
assert.equal(1, rankingPostCast);
done();
});
});
})
it('should support on the fly nested documents', function () {
// TODO
});
})