deno.land / x / mongoose@6.7.5 / test / model.query.casting.test.js
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212'use strict';
/** * Test dependencies. */
const start = require('./common');
const assert = require('assert');const random = require('./util').random;
const mongoose = start.mongoose;
const CastError = mongoose.SchemaType.CastError;const DocumentObjectId = mongoose.Types.ObjectId;const ObjectId = mongoose.Schema.Types.ObjectId;const Schema = mongoose.Schema;
describe('model query casting', function() { let Comments; let BlogPostB; let geoSchemaArray; let geoSchemaObject; let db;
before(function() { db = start(); });
after(async function() { await db.close(); });
beforeEach(() => db.deleteModel(/.*/)); afterEach(() => require('./util').clearTestData(db)); afterEach(() => require('./util').stopRemainingOps(db));
beforeEach(function() { Comments = new Schema();
Comments.add({ title: String, date: Date, body: String, comments: [Comments] });
const BlogPostSchema = new Schema({ title: { $type: String }, author: String, slug: String, date: Date, meta: { date: Date, visitors: Number }, published: Boolean, mixed: {}, numbers: [{ $type: Number }], tags: [String], sigs: [Buffer], owners: [ObjectId], comments: [Comments], def: { $type: String, default: 'kandinsky' } }, { typeKey: '$type' });
BlogPostB = db.model('BlogPost', BlogPostSchema);
geoSchemaArray = new Schema({ loc: { type: [Number], index: '2d' } }); geoSchemaObject = new Schema({ loc: { long: Number, lat: Number } }); geoSchemaObject.index({ loc: '2d' }); });
it('works', function(done) { const title = 'Loki ' + random();
const post = new BlogPostB(); const id = post.get('_id').toString();
post.set('title', title);
post.save(function(err) { assert.ifError(err);
BlogPostB.findOne({ _id: id }, function(err, doc) { assert.ifError(err); assert.equal(doc.get('title'), title); done(); }); }); });
it('returns cast errors', function(done) { BlogPostB.find({ date: 'invalid date' }, function(err) { assert.ok(err instanceof Error); assert.ok(err instanceof CastError); done(); }); });
it('casts $modifiers', function(done) { const post = new BlogPostB({ meta: { visitors: -75 } });
post.save(function(err) { assert.ifError(err);
BlogPostB.find({ 'meta.visitors': { $gt: '-100', $lt: -50 } }, function(err, found) { assert.ifError(err);
assert.ok(found); assert.equal(found.length, 1); assert.equal(found[0].get('_id').toString(), post.get('_id')); assert.equal(found[0].get('meta.visitors').valueOf(), post.get('meta.visitors').valueOf()); done(); }); }); });
it('casts $in values of arrays (gh-199)', function(done) { const post = new BlogPostB(); const id = post._id.toString();
post.save(function(err) { assert.ifError(err);
BlogPostB.findOne({ _id: { $in: [id] } }, function(err, doc) { assert.ifError(err);
assert.equal(doc._id.toString(), id); done(); }); }); });
it('casts $in values of arrays with single item instead of array (jrl-3238)', function(done) { const post = new BlogPostB(); const id = post._id.toString();
post.save(function(err) { assert.ifError(err);
BlogPostB.findOne({ _id: { $in: id } }, function(err, doc) { assert.ifError(err);
assert.equal(doc._id.toString(), id); done(); }); }); });
it('casts $nin values of arrays (gh-232)', function(done) { const NinSchema = new Schema({ num: Number });
const Nin = db.model('Test', NinSchema);
Nin.create({ num: 1 }, function(err) { assert.ifError(err); Nin.create({ num: 2 }, function(err) { assert.ifError(err); Nin.create({ num: 3 }, function(err) { assert.ifError(err); Nin.find({ num: { $nin: [2] } }, function(err, found) { assert.ifError(err); assert.equal(found.length, 2); done(); }); }); }); }); });
it('works when finding by Date (gh-204)', function(done) { const P = BlogPostB;
const post = new P();
post.meta.date = new Date();
post.save(function(err) { assert.ifError(err);
P.findOne({ _id: post._id, 'meta.date': { $lte: Date.now() } }, function(err, doc) { assert.ifError(err);
assert.equal(doc._id.toString(), post._id.toString()); doc.meta.date = null; doc.save(function(err) { assert.ifError(err); P.findById(doc._id, function(err, doc) { assert.ifError(err); assert.strictEqual(doc.meta.date, null); done(); }); }); }); }); });
it('works with $type matching', async function() { const B = BlogPostB;
await B.deleteMany({});
await B.collection.insertMany([{ title: 'test' }, { title: 1 }]);
const err = await B.find({ title: { $type: { x: 1 } } }).then(() => null, err => err); assert.equal(err.message, '$type parameter must be number, string, or array of numbers and strings');
let posts = await B.find({ title: { $type: 2 } }); assert.equal(posts.length, 1); assert.equal(posts[0].title, 'test');
posts = await B.find({ title: { $type: ['string', 'number'] } }); assert.equal(posts.length, 2); });
it('works when finding Boolean with $in (gh-998)', function(done) { const B = BlogPostB;
const b = new B({ published: true }); b.save(function(err) { assert.ifError(err); B.find({ _id: b._id, boolean: { $in: [null, true] } }, function(err, doc) { assert.ifError(err); assert.ok(doc); assert.equal(doc[0].id, b.id); done(); }); }); });
it('works when finding Boolean with $ne (gh-1093)', function(done) { const B = BlogPostB;
const b = new B({ published: false }); b.save(function(err) { assert.ifError(err); B.find().ne('published', true).exec(function(err, doc) { assert.ifError(err); assert.ok(doc); assert.equal(doc[0].id, b.id); done(); }); }); });
it('properly casts $and (gh-1180)', function(done) { const B = BlogPostB; const result = B.find({}).cast(B, { $and: [{ date: '1987-03-17T20:00:00.000Z' }, { _id: '000000000000000000000000' }] }); assert.ok(result.$and[0].date instanceof Date); assert.ok(result.$and[1]._id instanceof DocumentObjectId); done(); });
describe('$near', function() { this.slow(60);
it('with arrays', function(done) { const Test = db.model('Test', geoSchemaArray);
Test.once('index', complete); Test.create({ loc: [10, 20] }, { loc: [40, 90] }, complete);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.ran = err); } --pending || test(); }
function test() { Test.find({ loc: { $near: ['30', '40'] } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); } });
it('with objects', function(done) { const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.ran = err); } --pending || test(); }
function test() { Test.find({ loc: { $near: ['30', '40'], $maxDistance: 51 } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); }
Test.create({ loc: { long: 10, lat: 20 } }, { loc: { long: 40, lat: 90 } }, complete); Test.once('index', complete); });
it('with nested objects', function(done) { const geoSchemaObject = new Schema({ loc: { nested: { long: Number, lat: Number } } }); geoSchemaObject.index({ 'loc.nested': '2d' });
const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.ran = err); } --pending || test(); }
function test() { Test.find({ 'loc.nested': { $near: ['30', '40'], $maxDistance: '50' } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 1); done(); }); }
Test.once('index', complete); Test.create( { loc: { nested: { long: 10, lat: 20 } } }, { loc: { nested: { long: 40, lat: 90 } } }, complete); }); });
describe('$nearSphere', function() { this.slow(70);
it('with arrays', function(done) { const Test = db.model('Test', geoSchemaArray);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: [10, 20] }, { loc: [40, 90] }, complete);
function test() { Test.find({ loc: { $nearSphere: ['30', '40'] } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); } });
it('with objects', function(done) { const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: { long: 10, lat: 20 } }, { loc: { long: 40, lat: 90 } }, complete);
function test() { Test.find({ loc: { $nearSphere: ['30', '40'], $maxDistance: 1 } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); } });
it('with nested objects', function(done) { const geoSchemaObject = new Schema({ loc: { nested: { long: Number, lat: Number } } }); geoSchemaObject.index({ 'loc.nested': '2d' });
const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: { nested: { long: 10, lat: 20 } } }, { loc: { nested: { long: 40, lat: 90 } } }, complete);
function test() { Test.find({ 'loc.nested': { $nearSphere: ['30', '40'], $maxDistance: 1 } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); } }); });
describe('$within', function() { this.slow(60);
describe('$centerSphere', function() { it('with arrays', function(done) { const Test = db.model('Test', geoSchemaArray);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: [10, 20] }, { loc: [40, 90] }, complete);
function test() { Test.find({ loc: { $within: { $centerSphere: [['11', '20'], '0.4'] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 1); done(); }); } });
it('with objects', function(done) { const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: { long: 10, lat: 20 } }, { loc: { long: 40, lat: 90 } }, complete);
function test() { Test.find({ loc: { $within: { $centerSphere: [['11', '20'], '0.4'] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 1); done(); }); } });
it('with nested objects', function(done) { const geoSchemaObject = new Schema({ loc: { nested: { long: Number, lat: Number } } }); geoSchemaObject.index({ 'loc.nested': '2d' });
const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: { nested: { long: 10, lat: 20 } } }, { loc: { nested: { long: 40, lat: 90 } } }, complete);
function test() { Test.find({ 'loc.nested': { $within: { $centerSphere: [['11', '20'], '0.4'] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 1); done(); }); } }); });
describe('$center', function() { it('with arrays', function(done) { const Test = db.model('Test', geoSchemaArray);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: [10, 20] }, { loc: [40, 90] }, complete);
function test() { Test.find({ loc: { $within: { $center: [['11', '20'], '1'] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 1); done(); }); } });
it('with objects', function(done) { const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: { long: 10, lat: 20 } }, { loc: { long: 40, lat: 90 } }, complete);
function test() { Test.find({ loc: { $within: { $center: [['11', '20'], '1'] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 1); done(); }); } });
it('with nested objects', function(done) { const geoSchemaObject = new Schema({ loc: { nested: { long: Number, lat: Number } } }); geoSchemaObject.index({ 'loc.nested': '2d' });
const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: { nested: { long: 10, lat: 20 } } }, { loc: { nested: { long: 40, lat: 90 } } }, complete);
function test() { Test.find({ 'loc.nested': { $within: { $center: [['11', '20'], '1'] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 1); done(); }); } }); });
describe('$polygon', function() { it('with arrays', function(done) { const Test = db.model('Test', geoSchemaArray);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: [10, 20] }, { loc: [40, 90] }, complete);
function test() { Test.find({ loc: { $within: { $polygon: [['8', '1'], ['8', '100'], ['50', '100'], ['50', '1']] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); } });
it('with objects', function(done) { const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: { long: 10, lat: 20 } }, { loc: { long: 40, lat: 90 } }, complete);
function test() { Test.find({ loc: { $within: { $polygon: [['8', '1'], ['8', '100'], ['50', '100'], ['50', '1']] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); } });
it('with nested objects', function(done) { const geoSchemaObject = new Schema({ loc: { nested: { long: Number, lat: Number } } }); geoSchemaObject.index({ 'loc.nested': '2d' });
const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: { nested: { long: 10, lat: 20 } } }, { loc: { nested: { long: 40, lat: 90 } } }, complete);
function test() { Test.find({ 'loc.nested': { $within: { $polygon: [['8', '1'], ['8', '100'], ['50', '100'], ['50', '1']] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); } }); });
describe('$box', function() { it('with arrays', function(done) { const Test = db.model('Test', geoSchemaArray);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: [10, 20] }, { loc: [40, 90] }, complete);
function test() { Test.find({ loc: { $within: { $box: [['8', '1'], ['50', '100']] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); } });
it('with objects', function(done) { const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: { long: 10, lat: 20 } }, { loc: { long: 40, lat: 90 } }, complete);
function test() { Test.find({ loc: { $within: { $box: [['8', '1'], ['50', '100']] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); } });
it('with nested objects', function(done) { const geoSchemaObject = new Schema({ loc: { nested: { long: Number, lat: Number } } }); geoSchemaObject.index({ 'loc.nested': '2d' });
const Test = db.model('Test', geoSchemaObject);
let pending = 2;
function complete(err) { if (complete.ran) { return; } if (err) { return done(complete.err = err); } --pending || test(); }
Test.on('index', complete); Test.create({ loc: { nested: { long: 10, lat: 20 } } }, { loc: { nested: { long: 40, lat: 90 } } }, complete);
function test() { Test.find({ 'loc.nested': { $within: { $box: [['8', '1'], ['50', '100']] } } }, function(err, docs) { assert.ifError(err); assert.equal(docs.length, 2); done(); }); } }); }); });
describe('$options', function() { it('works on arrays gh-1462', function(done) { const opts = {}; opts.toString = function() { return 'img'; };
const B = BlogPostB; const result = B.find({}).cast(B, { tags: { $regex: /a/, $options: opts } });
assert.equal(result.tags.$options, 'img'); done(); }); it('does not cast with uppercase (gh-7800)', function(done) { const testSchema = new Schema({ name: { type: String, uppercase: true } });
const Model = db.model('Test', testSchema); const result = Model.find({}).cast(Model, { name: { $regex: /a/, $options: 'i' } });
assert.equal(result.name.$options, 'i'); done(); }); });
describe('$elemMatch', function() { it('should cast String to ObjectId in $elemMatch', function(done) { const commentId = new mongoose.Types.ObjectId(111);
const post = new BlogPostB({ comments: [{ _id: commentId }] }); const id = post._id.toString();
post.save(function(err) { assert.ifError(err);
BlogPostB.findOne({ _id: id, comments: { $elemMatch: { _id: commentId.toString() } } }, function(err, doc) { assert.ifError(err);
assert.equal(doc._id.toString(), id); done(); }); }); });
it('should cast String to ObjectId in $elemMatch inside $not', function(done) { const commentId = new mongoose.Types.ObjectId(111);
const post = new BlogPostB({ comments: [{ _id: commentId }] }); const id = post._id.toString();
post.save(function(err) { assert.ifError(err);
BlogPostB.findOne({ _id: id, comments: { $not: { $elemMatch: { _id: commentId.toString() } } } }, function(err, doc) { assert.ifError(err);
assert.equal(doc, null); done(); }); }); });
it('should cast subdoc _id typed as String to String in $elemMatch gh3719', function(done) { const child = new Schema({ _id: { type: String } }, { _id: false });
const parent = new Schema({ children: [child] });
const Parent = db.model('Parent', parent);
Parent.create({ children: [{ _id: 'foobar' }] }, function(error) { assert.ifError(error); test(); });
function test() { Parent.find({ $and: [{ children: { $elemMatch: { _id: 'foobar' } } }] }, function(error, docs) { assert.ifError(error);
assert.equal(docs.length, 1); done(); }); } });
it('should cast subdoc _id typed as String to String in $elemMatch inside $not gh3719', function(done) { const child = new Schema({ _id: { type: String } }, { _id: false });
const parent = new Schema({ children: [child] });
const Parent = db.model('Parent', parent);
Parent.create({ children: [{ _id: 'foobar' }] }, function(error) { assert.ifError(error); test(); });
function test() { Parent.find({ $and: [{ children: { $not: { $elemMatch: { _id: 'foobar' } } } }] }, function(error, docs) { assert.ifError(error);
assert.equal(docs.length, 0); done(); }); } });
it('casts $nor within $elemMatch (gh-9479)', async function() { const Test = db.model('Test', Schema({ arr: [{ x: Number, y: Number }] }));
const _doc = await Test.create({ arr: [{ x: 1 }, { y: 3 }, { x: 2 }] });
const doc = await Test.findOne({ arr: { $elemMatch: { $nor: [{ x: 1 }, { y: 3 }] } } });
assert.equal(_doc._id.toString(), doc._id.toString()); }); });
it('works with $all (gh-3394)', function(done) { const MyModel = db.model('Test', { tags: [ObjectId] });
const doc = { tags: ['00000000000000000000000a', '00000000000000000000000b'] };
MyModel.create(doc, function(error, savedDoc) { assert.ifError(error); assert.equal(typeof savedDoc.tags[0], 'object'); MyModel.findOne({ tags: { $all: doc.tags } }, function(error, doc) { assert.ifError(error); assert.ok(doc); done(); }); }); });
it('date with $not + $type (gh-4632)', function(done) { const MyModel = db.model('Test', { test: Date });
MyModel.find({ test: { $not: { $type: 9 } } }, function(error) { assert.ifError(error); done(); }); });
it('setOnInsert with custom type (gh-5126)', function(done) { function Point(key, options) { mongoose.SchemaType.call(this, key, options, 'Point'); }
mongoose.Schema.Types.Point = Point; Point.prototype = Object.create(mongoose.SchemaType.prototype);
let called = 0; Point.prototype.cast = function(point) { ++called; if (point.type !== 'Point') { throw new Error('Woops'); }
return point; };
const testSchema = new mongoose.Schema({ name: String, test: Point }); const Test = db.model('Test', testSchema);
const u = { $setOnInsert: { name: 'a', test: { type: 'Point' } } }; Test.findOneAndUpdate({ name: 'a' }, u). exec(function(error) { assert.ifError(error); assert.equal(called, 1); done(); }); });
it('lowercase in query (gh-4569)', function(done) { const contexts = [];
const testSchema = new Schema({ name: { type: String, lowercase: true }, num: { type: Number, set: function(v) { contexts.push(this); return Math.floor(v); } } });
const Test = db.model('Test', testSchema); Test.create({ name: 'val', num: 2.02 }). then(function() { assert.equal(contexts.length, 1); assert.equal(contexts[0].constructor.name, 'model'); return Test.findOne({ name: 'VAL' }); }). then(function(doc) { assert.ok(doc); assert.equal(doc.name, 'val'); assert.equal(doc.num, 2); }). then(function() { return Test.findOneAndUpdate({}, { num: 3.14 }, { new: true }); }). then(function(doc) { assert.ok(doc); assert.equal(doc.name, 'val'); assert.equal(doc.num, 3); assert.equal(contexts.length, 2); assert.equal(contexts[1].constructor.name, 'Query'); }). then(function() { done(); }). catch(done); });
it('runSettersOnQuery only once on find (gh-5434)', function(done) { let vs = []; const UserSchema = new mongoose.Schema({ name: String, foo: { type: Number, get: function(val) { return val.toString(); }, set: function(val) { vs.push(val); return val; } } });
const Test = db.model('Test', UserSchema);
Test.find({ foo: '123' }).exec(function(error) { assert.ifError(error); assert.equal(vs.length, 1); assert.strictEqual(vs[0], '123');
vs = []; Test.find({ foo: '123' }, function(error) { assert.ifError(error); assert.equal(vs.length, 1); assert.strictEqual(vs[0], '123'); done(); }); }); });
it('setters run only once on findOne (gh-6157)', function(done) { let vs = []; const UserSchema = new mongoose.Schema({ name: String, foo: { type: Number, get: function(val) { return val.toString(); }, set: function(val) { vs.push(val); return val; } } });
const Test = db.model('Test', UserSchema);
Test.findOne({ foo: '123' }).exec(function(error) { assert.ifError(error); assert.equal(vs.length, 1); assert.strictEqual(vs[0], '123');
vs = []; Test.findOne({ foo: '123' }, function(error) { assert.ifError(error); assert.equal(vs.length, 1); assert.strictEqual(vs[0], '123'); done(); }); }); });
it('runSettersOnQuery as query option (gh-5350)', function(done) { const contexts = [];
const testSchema = new Schema({ name: { type: String, lowercase: true }, num: { type: Number, set: function(v) { contexts.push(this); return Math.floor(v); } } });
const Test = db.model('Test', testSchema); Test.create({ name: 'val', num: 2.02 }). then(function() { assert.equal(contexts.length, 1); assert.equal(contexts[0].constructor.name, 'model'); return Test.findOne({ name: 'VAL' }, { _id: 0 }); }). then(function(doc) { assert.ok(doc); assert.equal(doc.name, 'val'); assert.equal(doc.num, 2); }). then(function() { done(); }). catch(done); });
it('_id = 0 (gh-4610)', function(done) { const MyModel = db.model('Test', { _id: Number });
MyModel.create({ _id: 0 }, function(error) { assert.ifError(error); MyModel.findById({ _id: 0 }, function(error, doc) { assert.ifError(error); assert.ok(doc); assert.equal(doc._id, 0); done(); }); }); });
it('converts to CastError (gh-6803)', function() { const membershipSchema = new Schema({ tier: String }); const schema = new Schema({ membership: membershipSchema, name: String }); const Model = db.model('Test', schema);
return Model.findOne({ membership: '12345' }). catch(error => { assert.equal(error.name, 'CastError'); assert.equal(error.path, 'membership'); assert.equal(error.reason.name, 'ObjectParameterError'); }); });
it('minDistance (gh-4197)', function(done) { const schema = new Schema({ name: String, loc: { type: { type: String }, coordinates: [Number] } });
schema.index({ loc: '2dsphere' });
const MyModel = db.model('Test', schema);
MyModel.on('index', function(error) { assert.ifError(error); const docs = [ { name: 'San Mateo Caltrain', loc: _geojsonPoint([-122.33, 37.57]) }, { name: 'Squaw Valley', loc: _geojsonPoint([-120.24, 39.21]) }, { name: 'Mammoth Lakes', loc: _geojsonPoint([-118.9, 37.61]) } ]; const RADIUS_OF_EARTH_IN_METERS = 6378100; MyModel.create(docs, function(error) { assert.ifError(error); MyModel. find(). near('loc', { center: [-122.33, 37.57], minDistance: (1000 / RADIUS_OF_EARTH_IN_METERS).toString(), maxDistance: (280000 / RADIUS_OF_EARTH_IN_METERS).toString(), spherical: true }). exec(function(error, results) { assert.ifError(error); assert.equal(results.length, 1); assert.equal(results[0].name, 'Squaw Valley'); done(); }); }); }); }); it('array ops don\'t break with strict:false (gh-6952)', function(done) { const schema = new Schema({}, { strict: false }); const Test = db.model('Test', schema); Test.create({ outerArray: [] }) .then(function(created) { const toBePushedObj = { innerArray: ['onetwothree'] }; const update = { $push: { outerArray: toBePushedObj } }; const opts = { new: true }; return Test.findOneAndUpdate({ _id: created._id }, update, opts); }) .then(function(updated) { const doc = updated.toObject(); assert.strictEqual(doc.outerArray[0].innerArray[0], 'onetwothree'); done(); }); });});
function _geojsonPoint(coordinates) { return { type: 'Point', coordinates: coordinates };}
Version Info