'use strict';
const assert = require('assert');
const start = require('../common');
describe('Cast Tutorial', function() {
let Character;
const mongoose = new start.mongoose.Mongoose();
before(async function() {
const schema = new mongoose.Schema({ name: String, age: Number });
Character = mongoose.model('Character', schema);
await mongoose.connect(start.uri);
await Character.deleteMany({});
await Character.create({
_id: '5cdc267dd56b5662b7b7cc0c',
name: 'Jean-Luc Picard',
age: 59
});
});
after(async() => {
await mongoose.disconnect();
});
it('get and set', async function() {
const query = Character.find({ name: 'Jean-Luc Picard' });
query.getFilter();
assert.deepStrictEqual(query.getFilter(), { name: 'Jean-Luc Picard' });
query.find({ age: { $gt: 50 } });
query.getFilter();
assert.deepStrictEqual(query.getFilter(), {
name: 'Jean-Luc Picard',
age: { $gt: 50 }
});
});
it('cast values', async function() {
const query = Character.findOne({
_id: '5cdc267dd56b5662b7b7cc0c',
age: { $gt: '50' }
});
query.getFilter();
assert.deepStrictEqual(query.getFilter(), {
_id: '5cdc267dd56b5662b7b7cc0c',
age: { $gt: '50' }
});
const doc = await query.exec();
doc.name;
assert.equal(doc.name, 'Jean-Luc Picard');
query.getFilter()._id instanceof mongoose.Types.ObjectId;
typeof query.getFilter().age.$gt === 'number';
assert.ok(query.getFilter()._id instanceof mongoose.Types.ObjectId);
assert.equal(typeof query.getFilter().age.$gt, 'number');
});
it('cast error', async function() {
const query = Character.findOne({ age: { $lt: 'not a number' } });
const err = await query.exec().then(() => null, err => err);
err instanceof mongoose.CastError;
err.message;
assert.ok(err instanceof mongoose.CastError);
assert.equal(err.message, 'Cast to Number failed for value "not a ' +
'number" (type string) at path "age" for model "Character"');
});
it('not in schema', async function() {
const query = Character.findOne({ notInSchema: { $lt: 'not a number' } });
await query.exec();
});
it('strictQuery true', async function() {
mongoose.deleteModel('Character');
const schema = new mongoose.Schema({ name: String, age: Number }, {
strictQuery: true
});
Character = mongoose.model('Character', schema);
const query = Character.findOne({ notInSchema: { $lt: 'not a number' } });
await query.exec();
query.getFilter();
assert.deepEqual(query.getFilter(), {});
});
it('strictQuery throw', async function() {
mongoose.deleteModel('Character');
const schema = new mongoose.Schema({ name: String, age: Number }, {
strictQuery: 'throw'
});
Character = mongoose.model('Character', schema);
const query = Character.findOne({ notInSchema: { $lt: 'not a number' } });
const err = await query.exec().then(() => null, err => err);
err.name;
err.message;
assert.equal(err.name, 'StrictModeError');
assert.equal(err.message, 'Path "notInSchema" is not in schema and ' +
'strictQuery is \'throw\'.');
});
it('strictQuery removes casted empty objects', async function() {
mongoose.deleteModel('Character');
const schema = new mongoose.Schema({ name: String, age: Number }, {
strictQuery: true
});
Character = mongoose.model('Character', schema);
const query = Character.findOne({
$or: [{ notInSchema: { $lt: 'not a number' } }],
$and: [{ name: 'abc' }, { age: { $gt: 18 } }, { notInSchema: { $lt: 'not a number' } }],
$nor: [{}]
});
await query.exec();
query.getFilter();
assert.deepEqual(query.getFilter(), { $and: [{ name: 'abc' }, { age: { $gt: 18 } }], $nor: [{}] });
});
it('implicit in', async function() {
const query = Character.findOne({ name: ['Jean-Luc Picard', 'Will Riker'] });
const doc = await query.exec();
doc.name;
query.getFilter();
assert.equal(doc.name, 'Jean-Luc Picard');
assert.deepEqual(query.getFilter(), {
name: { $in: ['Jean-Luc Picard', 'Will Riker'] }
});
});
});