UNPKG

water-orm

Version:

A monolith version of Standalone waterline ORM

334 lines (289 loc) 9.48 kB
var Waterline = require('../../../lib/waterline'), assert = require('assert'); describe('Collection Query', function() { describe('.update()', function() { describe('with nested model values', function() { var query; before(function(done) { var waterline = new Waterline(); var Model = Waterline.Collection.extend({ identity: 'user', connection: 'foo', attributes: { name: { type: 'string', defaultsTo: 'Foo Bar' }, nestedModel: { model: 'nested' } } }); var Nested = Waterline.Collection.extend({ identity: 'nested', connection: 'foo', attributes: { name: 'string' } }); waterline.loadCollection(Model); waterline.loadCollection(Nested); // Fixture Adapter Def var _id = 1; var findValues = []; var adapterDef = { update: function(con, col, criteria, values, cb) { values.id = _id; findValues.push(values); _id++; return cb(null, values); }, find: function(con, col, criteria, cb) { cb(null, findValues[_id - 1]); } }; var connections = { 'foo': { adapter: 'foobar' } }; waterline.initialize({ adapters: { foobar: adapterDef }, connections: connections }, function(err, colls) { if(err) return done(err); query = colls.collections.user; done(); }); }); it('should reduce the nested object down to a foreign key', function(done) { query.update({}, { name: 'foo', nestedModel: { id: 1337, name: 'joe' }}, function(err, status) { assert(!err, err); assert(status[0].nestedModel); assert(status[0].nestedModel === 1337); done(); }); }); }); describe('with nested model values (create)', function() { var query; before(function(done) { var waterline = new Waterline(); var Model = Waterline.Collection.extend({ identity: 'user', connection: 'foo', attributes: { name: { type: 'string', defaultsTo: 'Foo Bar' }, nestedModel: { model: 'nested' }, nestedModel2: { model: 'nested' } } }); var Nested = Waterline.Collection.extend({ identity: 'nested', connection: 'foo', attributes: { name: 'string' } }); waterline.loadCollection(Model); waterline.loadCollection(Nested); // Fixture Adapter Def var _id = 1; var findValues = []; var adapterDef = { create: function(con, col, values, cb) { values.id = _id; findValues.push(values); _id++; return cb(null, values); }, update: function(con, col, criteria, values, cb) { values.id = _id; findValues.push(values); _id++; return cb(null, values); }, find: function(con, col, criteria, cb) { cb(null, findValues[_id - 1]); } }; var connections = { 'foo': { adapter: 'foobar' } }; waterline.initialize({ adapters: { foobar: adapterDef }, connections: connections }, function(err, colls) { if(err) return done(err); query = colls.collections.user; done(); }); }); it('should reduce the newly created nested object down to two foreign keys', function(done) { query.update({}, { name: 'foo', nestedModel: { name: 'joe' }, nestedModel2: { name: 'jane' } }, function(err, status) { assert(!err, err); assert(status[0].nestedModel); assert(status[0].nestedModel === 1); assert(status[0].nestedModel2); assert(status[0].nestedModel2 === 2); done(); }); }); }); describe('with nested model values (create, asynchronous adapter)', function() { var query; before(function(done) { var waterline = new Waterline(); var Model = Waterline.Collection.extend({ identity: 'user', connection: 'foo', attributes: { name: { type: 'string', defaultsTo: 'Foo Bar' }, nestedModel: { model: 'nested' }, nestedModel2: { model: 'nested' } } }); var Nested = Waterline.Collection.extend({ identity: 'nested', connection: 'foo', attributes: { name: 'string' } }); waterline.loadCollection(Model); waterline.loadCollection(Nested); // Fixture Adapter Def var _id = 1; var findValues = []; var adapterDef = { create: function(con, col, values, cb) { process.nextTick(function() { values.id = _id; findValues.push(values); _id++; return cb(null, values); }); }, update: function(con, col, criteria, values, cb) { process.nextTick(function() { values.id = _id; findValues.push(values); _id++; return cb(null, values); }); }, find: function(con, col, criteria, cb) { process.nextTick(function() { cb(null, findValues[_id - 1]); }); } }; var connections = { 'foo': { adapter: 'foobar' } }; waterline.initialize({ adapters: { foobar: adapterDef }, connections: connections }, function(err, colls) { if(err) return done(err); query = colls.collections.user; done(); }); }); it('should call back only once and reduce the newly created nested object down to two foreign keys', function(done) { var count = 0; query.update({}, { name: 'foo', nestedModel: { name: 'joe' }, nestedModel2: { name: 'jane' } }, function(err, status) { assert(++count === 1); assert(!err, err); assert(status[0].nestedModel); assert(status[0].nestedModel2); assert.deepEqual([status[0].nestedModel, status[0].nestedModel2].sort(), [1, 2]); done(); }); }); }); describe('with nested collection values', function() { var query, updatedModels = []; before(function(done) { var waterline = new Waterline(); var Model = Waterline.Collection.extend({ identity: 'user', connection: 'foo', attributes: { name: { type: 'string', defaultsTo: 'Foo Bar' }, nestedModels: { collection: 'nested', via: 'model' } } }); var Nested = Waterline.Collection.extend({ identity: 'nested', connection: 'foo', attributes: { name: 'string', model: { model: 'user' } } }); waterline.loadCollection(Model); waterline.loadCollection(Nested); // Fixture Adapter Def var _id = 1; var findValues = []; var adapterDef = { update: function(con, col, criteria, values, cb) { updatedModels.push(criteria.where); values.id = _id; findValues.push(values); _id++; return cb(null, [values]); }, find: function(con, col, criteria, cb) { cb(null, findValues[_id - 1]); } }; var connections = { 'foo': { adapter: 'foobar' } }; waterline.initialize({ adapters: { foobar: adapterDef }, connections: connections }, function(err, colls) { if(err) return done(err); query = colls.collections.user; done(); }); }); // // TO-DO: // Make this not use a shit load of queries. (currently 10)! // it('should attempt to update each nested model', function(done) { var nestedModels = [ { id: 1337, name: 'joe', model: 2 }, { id: 1338, name: 'moe', model: 3 }, { id: 1339, name: 'flow', model: 4 } ]; query.update({}, { id: 5, name: 'foo', nestedModels: nestedModels }, function(err, status) { assert(!err, err); assert(status[0].nestedModels.length === 0); assert(updatedModels.length === 10); done(); }); }); }); }); });