mongoose
Version:
Mongoose MongoDB ODM
344 lines (278 loc) • 9.66 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
, MongooseArray = mongoose.Types.Array
, MongooseError = mongoose.Error;
/**
* Setup.
*/
var Comments = new Schema;
Comments.add({
title : String
, date : Date
, body : String
, comments : [Comments]
});
var BlogPost = new Schema({
title : String
, author : String
, slug : String
, date : Date
, meta : {
date : Date
, visitors : Number
}
, published : Boolean
, mixed : {}
, numbers : [Number]
, owners : [ObjectId]
, comments : [Comments]
});
BlogPost.virtual('titleWithAuthor')
.get(function () {
return this.get('title') + ' by ' + this.get('author');
})
.set(function (val) {
var split = val.split(' by ');
this.set('title', split[0]);
this.set('author', split[1]);
});
BlogPost.method('cool', function(){
return this;
});
BlogPost.static('woot', function(){
return this;
});
var modelname = 'UpdateOneBlogPost'
mongoose.model(modelname, BlogPost);
var collection = 'updateoneblogposts_' + random();
var strictSchema = new Schema({ name: String }, { strict: true });
mongoose.model('UpdateOneStrictSchema', strictSchema);
describe('model: findAndRemoveOne:', function(){
it('returns the original document', function(done){
var db = start()
, M = db.model(modelname, collection)
, title = 'remove muah'
var post = new M({ title: title });
post.save(function (err) {
assert.ifError(err);
M.findOneAndRemove({ title: title }, function (err, doc) {
assert.ifError(err);
assert.equal(doc.id, post.id);
M.findById(post.id, function (err, gone) {
db.close();
assert.ifError(err);
assert.equal(null, gone);
done();
});
});
});
})
it('options/conditions/doc are merged when no callback is passed', function(){
var db = start()
, M = db.model(modelname, collection)
db.close();
var now = new Date
, query;
// Model.findOneAndRemove
query = M.findOneAndRemove({ author: 'aaron' }, { select: 'author' });
assert.equal(1, query._fields.author);
assert.equal('aaron', query._conditions.author);
query = M.findOneAndRemove({ author: 'aaron' });
assert.equal(undefined, query._fields);
assert.equal('aaron', query._conditions.author);
query = M.findOneAndRemove();
assert.equal(undefined, query.options.new);
assert.equal(undefined, query._fields);
assert.equal(undefined, query._conditions.author);
// Query.findOneAndRemove
query = M.where('author', 'aaron').findOneAndRemove({ date: now });
assert.equal(undefined, query._fields);
assert.equal(now, query._conditions.date);
assert.equal('aaron', query._conditions.author);
query = M.find().findOneAndRemove({ author: 'aaron' }, { select: 'author' });
assert.equal(1, query._fields.author);
assert.equal('aaron', query._conditions.author);
query = M.find().findOneAndRemove();
assert.equal(undefined, query._fields);
assert.equal(undefined, query._conditions.author);
});
it('executes when a callback is passed', function(done){
var db = start()
, M = db.model(modelname, collection + random())
, pending = 5
M.findOneAndRemove({ name: 'aaron1' }, { select: 'name' }, cb);
M.findOneAndRemove({ name: 'aaron1' }, cb);
M.where().findOneAndRemove({ name: 'aaron1' }, { select: 'name' }, cb);
M.where().findOneAndRemove({ name: 'aaron1' }, cb);
M.where('name', 'aaron1').findOneAndRemove(cb);
function cb (err, doc) {
assert.ifError(err);
assert.equal(null, doc); // no previously existing doc
if (--pending) return;
db.close();
done();
}
});
it('executed with only a callback throws', function(){
var db = start()
, M = db.model(modelname, collection)
, err
try {
M.findOneAndRemove(function(){});
} catch (e) {
err = e;
}
db.close();
assert.ok(/First argument must not be a function/.test(err));
});
})
describe('model: findByIdAndRemove:', function(){
it('executed with only a callback throws', function(){
var db = start()
, M = db.model(modelname, collection)
, err
try {
M.findByIdAndRemove(function(){});
} catch (e) {
err = e;
}
db.close();
assert.ok(/First argument must not be a function/.test(err));
});
it('executes when a callback is passed', function(done){
var db = start()
, M = db.model(modelname, collection + random())
, _id = new DocumentObjectId
, pending = 2
M.findByIdAndRemove(_id, { select: 'name' }, cb);
M.findByIdAndRemove(_id, cb);
function cb (err, doc) {
assert.ifError(err);
assert.equal(null, doc); // no previously existing doc
if (--pending) return;
db.close();
done();
}
});
it('returns the original document', function(done){
var db = start()
, M = db.model(modelname, collection)
, title = 'remove muah pleez'
var post = new M({ title: title });
post.save(function (err) {
assert.ifError(err);
M.findByIdAndRemove(post.id, function (err, doc) {
assert.ifError(err);
assert.equal(doc.id, post.id);
M.findById(post.id, function (err, gone) {
db.close();
assert.ifError(err);
assert.equal(null, gone);
done();
});
});
});
});
it('options/conditions/doc are merged when no callback is passed', function(){
var db = start()
, M = db.model(modelname, collection)
, _id = new DocumentObjectId
db.close();
var now = new Date
, query;
// Model.findByIdAndRemove
query = M.findByIdAndRemove(_id, { select: 'author' });
assert.equal(1, query._fields.author);
assert.equal(_id.toString(), query._conditions._id.toString());
query = M.findByIdAndRemove(_id.toString());
assert.equal(undefined, query._fields);
assert.equal(_id.toString(), query._conditions._id);
query = M.findByIdAndRemove();
assert.equal(undefined, query.options.new);
assert.equal(undefined, query._fields);
assert.equal(undefined, query._conditions._id);
})
it('supports v3 select string syntax', function(){
var db = start()
, M = db.model(modelname, collection)
, _id = new DocumentObjectId
db.close();
var now = new Date
, query;
query = M.findByIdAndRemove(_id, { select: 'author -title' });
assert.strictEqual(1, query._fields.author);
assert.strictEqual(0, query._fields.title);
query = M.findOneAndRemove({}, { select: 'author -title' });
assert.strictEqual(1, query._fields.author);
assert.strictEqual(0, query._fields.title);
})
it('supports v3 select object syntax', function(){
var db = start()
, M = db.model(modelname, collection)
, _id = new DocumentObjectId
db.close();
var now = new Date
, query;
query = M.findByIdAndRemove(_id, { select: { author: 1, title: 0 }});
assert.strictEqual(1, query._fields.author);
assert.strictEqual(0, query._fields.title);
query = M.findOneAndRemove({}, { select: { author: 1, title: 0 }});
assert.strictEqual(1, query._fields.author);
assert.strictEqual(0, query._fields.title);
})
it('supports v3 sort string syntax', function(){
var db = start()
, M = db.model(modelname, collection)
, _id = new DocumentObjectId
db.close();
var now = new Date
, query;
query = M.findByIdAndRemove(_id, { sort: 'author -title' });
assert.equal(2, query.options.sort.length);
assert.equal('author', query.options.sort[0][0]);
assert.equal(1, query.options.sort[0][1]);
assert.equal('title', query.options.sort[1][0]);
assert.equal(-1, query.options.sort[1][1]);
query = M.findOneAndRemove({}, { sort: 'author -title' });
assert.equal(2, query.options.sort.length);
assert.equal('author', query.options.sort[0][0]);
assert.equal(1, query.options.sort[0][1]);
assert.equal('title', query.options.sort[1][0]);
assert.equal(-1, query.options.sort[1][1]);
})
it('supports v3 sort object syntax', function(){
var db = start()
, M = db.model(modelname, collection)
, _id = new DocumentObjectId
db.close();
var now = new Date
, query;
query = M.findByIdAndRemove(_id, { sort: { author: 1, title: -1 }});
assert.equal(2, query.options.sort.length);
assert.equal('author', query.options.sort[0][0]);
assert.equal(1, query.options.sort[0][1]);
assert.equal('title', query.options.sort[1][0]);
assert.equal(-1, query.options.sort[1][1]);
query = M.findOneAndRemove(_id, { sort: { author: 1, title: -1 }});
assert.equal(2, query.options.sort.length);
assert.equal('author', query.options.sort[0][0]);
assert.equal(1, query.options.sort[0][1]);
assert.equal('title', query.options.sort[1][0]);
assert.equal(-1, query.options.sort[1][1]);
});
})