waterline
Version:
An ORM for Node.js and the Sails framework
190 lines (169 loc) • 6.13 kB
JavaScript
var assert = require('assert');
var _ = require('@sailshq/lodash');
var Waterline = require('../../../lib/waterline');
describe('Collection Query ::', function() {
describe('.find()', function() {
describe('with transformed values', function() {
var modelDef = {
identity: 'user',
datastore: 'foo',
primaryKey: 'id',
attributes: {
id: {
type: 'number'
},
name: {
type: 'string',
columnName: 'login'
}
}
};
it('should transform criteria before sending to adapter', function(done) {
var waterline = new Waterline();
waterline.registerModel(Waterline.Model.extend(_.extend({}, modelDef)));
// Fixture Adapter Def
var adapterDef = {
find: function(con, query, cb) {
assert(query.criteria.where.login);
return cb(null, [{ id: 1, login: 'foo' }]);
}
};
var connections = {
'foo': {
adapter: 'foobar'
}
};
waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
if (err) {
return done(err);
}
orm.collections.user.find({ where: { name: 'foo' }}, done);
});
});
it('should transform values after receiving from adapter', function(done) {
var waterline = new Waterline();
waterline.registerModel(Waterline.Model.extend(_.extend({}, modelDef)));
// Fixture Adapter Def
var adapterDef = {
find: function(con, query, cb) {
assert(query.criteria.where.login);
return cb(null, [{ id: 1, login: 'foo' }]);
}
};
var connections = {
'foo': {
adapter: 'foobar'
}
};
waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
if(err) {
return done(err);
}
orm.collections.user.find({ name: 'foo' }, function(err, values) {
if (err) {
return done(err);
}
assert(values[0].name);
assert(!values[0].login);
return done();
});
});
});//it
it('should include base value for no-op populates', function(done) {
Waterline.start({
defaultModelSettings: {
attributes: {
id: { type: 'number' }
},
primaryKey: 'id',
datastore: 'default'
},
models: {
user: {
attributes: {
name: {
type: 'string',
columnName: '_userName'
},
pets: {
collection: 'pet'
}
}
},
pet: {
attributes: {
name: {
type: 'string',
columnName: '_petName'
}
}
}
},
adapters: {
fake: {
identity: 'fake',
find: function(datastoreName, query, done) {
if (query.using === 'user') {
assert(!query.criteria.where.name);
return done(undefined, [{ id: 1, _userName: query.criteria.where._userName||'someuser' }]);
}
else if (query.using === 'pet') {
// console.log('query.criteria.where', require('util').inspect(query.criteria.where,{depth:null}));
assert(!query.criteria.where.name);
return done(undefined, [{ id: 1, _petName: query.criteria.where._petName||'somepet' }]);
}
else if (query.using === 'pet_pets_pet__user_pets') {
assert(_.contains(query.criteria.select, 'id'));
assert(_.contains(query.criteria.select, 'user_pets'));
assert(_.contains(query.criteria.select, 'pet_pets_pet'));
assert.equal(query.criteria.where.and[0].user_pets.in[0], 1);
return done(undefined, [{ id: 999, user_pets: 1, pet_pets_pet: 1 }]);//eslint-disable-line camelcase
}
else {
return done(new Error('Unexpected result for this test-- what model is this?? (`'+query.using+'`)'));
}
}
}
},
datastores: {
default: { adapter: 'fake' }
}
}, function(err, orm) {
if(err) { return done(err); }
// First, just a quick sanity check.
Waterline.getModel('pet', orm).find({ name: 'fluffy' }, function(err, pets) {
if (err){ return done(err); }
if (pets.length !== 1) { return done(new Error('Expected there to be exactly one record returned!')); }
// Then, let's test the meat of this.
Waterline.getModel('user', orm).find({ name: 'jorahmormont' }, {
// Use a deliberate no-op populate:
pets: {
or: [
{
id: { in: [] }
},
{
and: [
{},
{
id: { nin: [] }
},
{
or: []
}
]
}
]
}
}, function(err, users) {
if (err){ return done(err); }
if (users.length !== 1) { return done(new Error('Expected there to be exactly one record returned!')); }
if (!_.isArray(users[0].pets) || users[0].pets.length !== 0) { return done(new Error('Expected base value for populated `pets` (i.e. empty array)')); }
return done();
});//_∏_
});//_∏_
});//_∏_ (Waterline.start())
});//it
});
});
});