UNPKG

mongoose-regexp

Version:

Adds RegExp storage support to Mongoose

225 lines (194 loc) 6.26 kB
var assert = require('assert') var Mod = require('../') var mongoose = require('mongoose') var Schema = mongoose.Schema; var RegExpSchema; var MongooseRegExp; describe('MongooseRegExp', function(){ before(function(){ RegExpSchema = Mod(mongoose) MongooseRegExp = mongoose.Types.RegExp }) it('has a version', function(){ assert.equal(require('../package').version, Mod.version); }) it('is a function', function(){ assert.equal('function', typeof RegExpSchema); }) it('extends mongoose.Schema.Types', function(){ assert.ok(Schema.Types.RegExp); assert.equal(RegExpSchema, Schema.Types.RegExp); }) it('extends mongoose.Types', function(){ assert.ok(mongoose.Types.RegExp); }) it('can be used in schemas', function(){ var s = new Schema({ reg: RegExpSchema }); var reg = s.path('reg') assert.ok(reg instanceof mongoose.SchemaType); assert.equal('function', typeof reg.get); var s = new Schema({ reg: 'RegExp' }); var reg = s.path('reg') assert.ok(reg instanceof mongoose.SchemaType); assert.equal('function', typeof reg.get); var s = new Schema({ reg: RegExp }); var reg = s.path('reg') assert.ok(reg instanceof mongoose.SchemaType); assert.equal('function', typeof reg.get); }) describe('integration', function(){ var db, S, schema, id; before(function(done){ db = mongoose.createConnection('localhost', 'mongoose_regexp') db.once('open', function () { schema = new Schema({ reg: RegExpSchema , docs: [{ reg: RegExp }] }); S = db.model('MRegExp', schema); done(); }); }) after(function(done){ db.db.dropDatabase(function () { db.close(done); }); }) describe('casts', function(){ it('null', function(done){ var s = new S({ reg: null }); assert.equal(s.reg, null); done(); }) it('strings', function(done){ var s = new S({ reg: 'mongodb' }); assert.ok(s.reg instanceof RegExp); assert.equal(s.reg.source, 'mongodb'); done(); }) describe('instanceof RegExp', function(){ it('retains flags', function(done){ var s = new S({ reg: new RegExp('mongodb', 'img') }); assert.ok(s.reg instanceof RegExp); assert.equal(s.reg.source, 'mongodb'); assert.ok(s.reg.ignoreCase); assert.ok(s.reg.global); assert.ok(s.reg.multiline); done(); }) }) describe('RegExp literals', function(){ it('retains flags', function(done){ var s = new S({ reg: /mongodb/img }); assert.ok(s.reg instanceof RegExp); assert.equal(s.reg.source, 'mongodb'); assert.ok(s.reg.ignoreCase); assert.ok(s.reg.global); assert.ok(s.reg.multiline); done(); }) }) it('non-castables produce _saveErrors', function(done){ var schema = new Schema({ reg: 'RegExp' }, { strict: 'throw' }); var M = db.model('throws', schema); var m = new M({ reg: [] }); m.save(function (err) { assert.ok(err); assert.equal('RegExp', err.type); assert.equal('CastError', err.name); done(); }); }) }) describe('with db', function(){ it('save', function(done){ var s = new S({ reg: /mongodb/i , docs: [null, { reg: RegExp('10gen') } ] }); id = s.id; s.save(function (err) { assert.ifError(err); done(); }) }) it('findById', function(done){ S.findById(id, function (err, doc) { assert.ifError(err); assert.ok(doc.reg instanceof RegExp); assert.ok(doc.reg.test('Mongodb')); assert.equal(null, doc.docs[0]); assert.ok(doc.docs[1].reg instanceof RegExp); assert.ok(doc.docs[1].reg.test(' 10gen ')); done(); }); }) it('find with RegExp literal', function(done){ S.find({ reg: /mongodb/i }, function (err, docs) { assert.ifError(err); assert.equal(1, docs.length); var doc = docs[0]; assert.equal(id, doc.id); done(); }); }) it('findOne matching null', function(done){ S.create({ reg: null }, function (err, doc_) { assert.ifError(err); S.findOne({ reg: null }, function (err, doc) { assert.ifError(err); assert.equal(doc_.id, doc.id); done(); }) }) }) it('find with instanceof RegExp', function(done){ S.find({ 'docs.reg': new RegExp('10gen') }, function (err, docs) { assert.ifError(err); assert.equal(1, docs.length); var doc = docs[0]; assert.equal(id, doc.id); done(); }); }) it('find with string', function(done){ S.find({ 'docs.reg': '10gen' }, function (err, docs) { assert.ifError(err); assert.equal(1, docs.length); var doc = docs[0]; assert.equal(id, doc.id); done(); }); }) it('find with string $in', function(done){ S.find({ 'docs.reg': { $in: ['10gen', '11gen', '12gen'] }}, function (err, docs) { assert.ifError(err); assert.equal(1, docs.length); var doc = docs[0]; assert.equal(id, doc.id); done(); }); }) describe('is updateable', function(){ it('in general', function(done){ S.findById(id, function (err, doc) { assert.ifError(err); doc.reg = /mongodb/i assert.ok(!doc.isModified('reg')); doc.reg = new RegExp('mongodb', 'i'); assert.ok(!doc.isModified('reg')); doc.reg = /^changed$/; doc.save(function (err) { assert.ifError(err); S.findById(id, function (err, doc) { assert.ifError(err); assert.ok(doc.reg.test('changed')); done(); }); }) }) }) }) }); }); });