UNPKG

mongoose-findorcreate

Version:
218 lines (194 loc) 6.39 kB
/** * @list dependencies **/ var mocha = require('mocha'); var should = require('should'); var mongoose = require('mongoose'); var Schema = mongoose.Schema; var findOrCreate = require('../'); mongoose.connect('mongodb://localhost/findOrCreate'); mongoose.connection.on('error', function (err) { console.error('MongoDB error: ' + err.message); console.error('Make sure a mongoDB server is running and accessible by this application') }); var ClickSchema = new Schema({ ip : {type: String, required: true}, hostname : {type: String, required: false} }) ClickSchema.plugin(findOrCreate); var Click = mongoose.model('Click', ClickSchema); after(function(done){ mongoose.connection.db.dropDatabase().then(function(){ mongoose.connection.close(); done(); }); }) describe('findOrCreate', function() { it("should create the object if it doesn't exist", function(done) { Click.findOrCreate({ip: '127.0.0.1'}, function(err, click) { click.ip.should.eql('127.0.0.1') Click.count({}).exec().then(function(num){ num.should.eql(1); done(); }); // Click.count({}, function(err, num) { // num.should.equal(1) // done(); // }) }) }) it("returns the object if it already exists", function(done) { Click.create({ip: '127.0.0.2'}).then(function(click){ click.ip.should.eql('127.0.0.2') Click.count({ip: '127.0.0.2'}).exec().then(function(num){ num.should.equal(1); done(); }); }); }) it("should pass created as true if the object didn't exist", function(done) { Click.findOrCreate({ip: '127.1.1.1'}, function(err, click, created) { created.should.eql(true); done(); }) }) it("should pass created as false if the object already exists", function(done) { Click.findOrCreate({ip: '127.1.1.1'}, function(err, click, created) { created.should.eql(false); done(); }) }) it("should add values with a $ when creating the object", function(done) { Click.findOrCreate({ ip: '$notAnInternetProtocolAddress' }, function(err, click) { click.ip.should.eql('$notAnInternetProtocolAddress'); done(); }) }) it("should add values with a $ when creating an object different from the find call", function(done) { Click.findOrCreate({ ip: '$notIp' }, { ip: '$expected' }, function(err, click) { click.ip.should.eql('$expected'); done(); }) }) it("should not add properties with a $ when creating the object", function(done) { Click.findOrCreate({ ip: '127.2.2.2', subnet: { $exists: true } }, function(err, click, created) { click.should.be.an.Object; click.ip.should.eql('127.2.2.2'); should.not.exist(click.subnet); created.should.eql(true); done(); }) }) it("should not add properties with a $ when creating an object different from the find call", function(done) { Click.findOrCreate({ ip: '127.3.3.3', subnet: { $exists: true } }, { ip: '127.3.3.3', subnet: { $exists: true }, hostname: 'noplacelikehome' }, function(err, click, created) { click.should.be.an.Object; click.ip.should.eql('127.3.3.3'); should.not.exist(click.subnet); click.hostname.should.eql('noplacelikehome'); created.should.eql(true); done(); }) }) it("should support upsert",function(done){ new Click({ip: '128.0.0.0'}).save().then(function(click){ click.should.be.an.Object; click.ip.should.eql('128.0.0.0'); should.equal(click.hostname, null); Click.findOrCreate({ip: '128.0.0.0'},{ hostname: 'example.org'},{upsert: true}, function (err, click, created) { click.should.be.an.Object; click.ip.should.eql('128.0.0.0'); click.hostname.should.eql('example.org'); created.should.eql(false); // Verify that it actually was updated in the database. Click.findOne({ip: '128.0.0.0'}).exec().then(function(click){ click.should.be.an.Object; click.ip.should.eql('128.0.0.0'); click.hostname.should.eql('example.org'); done(); }); } ); }); }) it("should return updated instance after upserting away from the condition",function(done){ new Click({ip: '128.1.1.1'}).save().then(function(click){ var _id = click._id; click.should.be.an.Object; click.ip.should.eql('128.1.1.1'); Click.findOrCreate({ip: '128.1.1.1'},{ip: '128.1.1.2'},{upsert: true}, function(err, click, created) { // Should have returned upserted object even though it no // longer matches the conditions. click.should.be.an.Object click.ip.should.eql('128.1.1.2'); created.should.eql(false); // Verify that it actually was updated in the database. Click.findById(_id).exec().then(function(click){ click.should.be.an.Object; click.ip.should.eql('128.1.1.2'); done(); }); } ); }); }) it("should return a Promise when passed conditions", function() { var ret = Click.findOrCreate({ ip: '127.4.4.4', }); ret.should.be.a.Promise; return ret.then(function(click) { click.should.be.an.Object; click.doc.should.be.an.Object; click.doc.ip.should.eql('127.4.4.4'); click.created.should.eql(true); }) }) it("should return a Promise when passed conditions, doc", function() { var ret = Click.findOrCreate({ ip: '127.4.4.4', }, { ip: '127.5.5.5', }); ret.should.be.a.Promise; return ret.then(function(result) { result.should.be.an.Object; result.doc.should.be.an.Object; result.doc.ip.should.eql('127.4.4.4'); result.created.should.eql(false); }) }) it("should return a Promise when passed conditions, doc, options", function() { var ret = Click.findOrCreate({ ip: '127.4.4.4', }, { ip: '127.5.5.5', }, { upsert: true, }); ret.should.be.a.Promise; return ret.then(function (result) { result.should.be.an.Object; result.doc.should.be.an.Object; result.doc.ip.should.eql('127.5.5.5'); result.created.should.eql(false); }) }) })