mongoose
Version:
Mongoose MongoDB ODM
203 lines (169 loc) • 5.73 kB
JavaScript
/**
* Test dependencies.
*/
var start = require('./common')
, assert = require('assert')
, mongoose = start.mongoose
, 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
, MongooseArray = mongoose.Types.Array
, MongooseError = mongoose.Error;
describe('model', function(){
describe('indexes', function(){
it('are created when model is compiled', function(done){
var Indexed = new Schema({
name : { type: String, index: true }
, last : String
, email : String
, date : Date
});
Indexed.index({ last: 1, email: 1 }, { unique: true });
Indexed.index({ date: 1 }, { expires: 10 });
var db = start()
, IndexedModel = db.model('IndexedModel', Indexed, 'indexedmodel' + random())
, assertions = 0;
IndexedModel.on('index', function(){
IndexedModel.collection.getIndexes({full:true}, function(err, indexes){
assert.ifError(err);
indexes.forEach(function (index) {
switch (index.name) {
case '_id_':
case 'name_1':
case 'last_1_email_1':
assertions++;
break;
case 'date_1':
assertions++;
assert.equal(index.expiresAfterSeconds, 10);
break;
}
});
db.close();
assert.equal(4, assertions);
done();
});
});
});
it('of embedded documents', function(done){
var BlogPosts = new Schema({
_id : { type: ObjectId, index: true }
, title : { type: String, index: true }
, desc : String
});
var User = new Schema({
name : { type: String, index: true }
, blogposts : [BlogPosts]
});
var db = start()
, UserModel = db.model('DeepIndexedModel', User, 'deepindexedmodel' + random())
, assertions = 0;
UserModel.on('index', function () {
UserModel.collection.getIndexes(function (err, indexes) {
assert.ifError(err);
for (var i in indexes) {
indexes[i].forEach(function(index){
if (index[0] == 'name')
assertions++;
if (index[0] == 'blogposts._id')
assertions++;
if (index[0] == 'blogposts.title')
assertions++;
});
}
db.close();
assert.equal(3, assertions);
done();
});
});
});
it('compound: on embedded docs', function(done){
var BlogPosts = new Schema({
title : String
, desc : String
});
BlogPosts.index({ title: 1, desc: 1 });
var User = new Schema({
name : { type: String, index: true }
, blogposts : [BlogPosts]
});
var db = start()
, UserModel = db.model('DeepCompoundIndexModel', User, 'deepcompoundindexmodel' + random())
, found = 0;
UserModel.on('index', function () {
UserModel.collection.getIndexes(function (err, indexes) {
assert.ifError(err);
for (var index in indexes) {
switch (index) {
case 'name_1':
case 'blogposts.title_1_blogposts.desc_1':
++found;
break;
}
}
db.close();
assert.equal(2, found);
done();
});
});
});
it('error should emit on the model', function(done){
var db = start();
var schema = new Schema({ name: { type: String } })
, Test = db.model('IndexError', schema, "x"+random());
Test.on('index', function (err) {
db.close();
assert.ok(/^E11000 duplicate key error index:/.test(err.message), err);
done();
});
Test.create({ name: 'hi' }, { name: 'hi' }, function (err) {
assert.strictEqual(err, null);
Test.schema.index({ name: 1 }, { unique: true });
Test.schema.index({ other: 1 });
Test.init();
});
});
describe('auto creation', function(){
it('can be disabled', function(done){
var db = start();
var schema = new Schema({ name: { type: String, index: true }})
schema.set('autoIndex', false);
var Test = db.model('AutoIndexing', schema, "x"+random());
Test.on('index', function(err){
assert.ok(false, 'Model.ensureIndexes() was called');
});
setTimeout(function () {
Test.collection.getIndexes(function(err, indexes){
assert.ifError(err);
assert.equal(0, Object.keys(indexes).length);
done();
});
}, 100);
})
})
it('can be manually triggered', function(done){
var db = start();
var schema = new Schema({ name: { type: String } })
, Test = db.model('ManualIndexing', schema, "x"+random());
assert.equal('function', typeof Test.ensureIndexes);
Test.schema.index({ name: 1 }, { sparse: true });
var called = false;
Test.on('index', function(err){
called= true;
});
Test.ensureIndexes(function (err) {
assert.ifError(err);
assert.ok(called);
done();
});
})
});
});