query.find.transform.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. var assert = require('assert');
  2. var _ = require('@sailshq/lodash');
  3. var Waterline = require('../../../lib/waterline');
  4. describe('Collection Query ::', function() {
  5. describe('.find()', function() {
  6. describe('with transformed values', function() {
  7. var modelDef = {
  8. identity: 'user',
  9. datastore: 'foo',
  10. primaryKey: 'id',
  11. attributes: {
  12. id: {
  13. type: 'number'
  14. },
  15. name: {
  16. type: 'string',
  17. columnName: 'login'
  18. }
  19. }
  20. };
  21. it('should transform criteria before sending to adapter', function(done) {
  22. var waterline = new Waterline();
  23. waterline.registerModel(Waterline.Model.extend(_.extend({}, modelDef)));
  24. // Fixture Adapter Def
  25. var adapterDef = {
  26. find: function(con, query, cb) {
  27. assert(query.criteria.where.login);
  28. return cb(null, [{ id: 1, login: 'foo' }]);
  29. }
  30. };
  31. var connections = {
  32. 'foo': {
  33. adapter: 'foobar'
  34. }
  35. };
  36. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  37. if (err) {
  38. return done(err);
  39. }
  40. orm.collections.user.find({ where: { name: 'foo' }}, done);
  41. });
  42. });
  43. it('should transform values after receiving from adapter', function(done) {
  44. var waterline = new Waterline();
  45. waterline.registerModel(Waterline.Model.extend(_.extend({}, modelDef)));
  46. // Fixture Adapter Def
  47. var adapterDef = {
  48. find: function(con, query, cb) {
  49. assert(query.criteria.where.login);
  50. return cb(null, [{ id: 1, login: 'foo' }]);
  51. }
  52. };
  53. var connections = {
  54. 'foo': {
  55. adapter: 'foobar'
  56. }
  57. };
  58. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  59. if(err) {
  60. return done(err);
  61. }
  62. orm.collections.user.find({ name: 'foo' }, function(err, values) {
  63. if (err) {
  64. return done(err);
  65. }
  66. assert(values[0].name);
  67. assert(!values[0].login);
  68. return done();
  69. });
  70. });
  71. });//it
  72. it('should include base value for no-op populates', function(done) {
  73. Waterline.start({
  74. defaultModelSettings: {
  75. attributes: {
  76. id: { type: 'number' }
  77. },
  78. primaryKey: 'id',
  79. datastore: 'default'
  80. },
  81. models: {
  82. user: {
  83. attributes: {
  84. name: {
  85. type: 'string',
  86. columnName: '_userName'
  87. },
  88. pets: {
  89. collection: 'pet'
  90. }
  91. }
  92. },
  93. pet: {
  94. attributes: {
  95. name: {
  96. type: 'string',
  97. columnName: '_petName'
  98. }
  99. }
  100. }
  101. },
  102. adapters: {
  103. fake: {
  104. identity: 'fake',
  105. find: function(datastoreName, query, done) {
  106. if (query.using === 'user') {
  107. assert(!query.criteria.where.name);
  108. return done(undefined, [{ id: 1, _userName: query.criteria.where._userName||'someuser' }]);
  109. }
  110. else if (query.using === 'pet') {
  111. // console.log('query.criteria.where', require('util').inspect(query.criteria.where,{depth:null}));
  112. assert(!query.criteria.where.name);
  113. return done(undefined, [{ id: 1, _petName: query.criteria.where._petName||'somepet' }]);
  114. }
  115. else if (query.using === 'pet_pets_pet__user_pets') {
  116. assert(_.contains(query.criteria.select, 'id'));
  117. assert(_.contains(query.criteria.select, 'user_pets'));
  118. assert(_.contains(query.criteria.select, 'pet_pets_pet'));
  119. assert.equal(query.criteria.where.and[0].user_pets.in[0], 1);
  120. return done(undefined, [{ id: 999, user_pets: 1, pet_pets_pet: 1 }]);//eslint-disable-line camelcase
  121. }
  122. else {
  123. return done(new Error('Unexpected result for this test-- what model is this?? (`'+query.using+'`)'));
  124. }
  125. }
  126. }
  127. },
  128. datastores: {
  129. default: { adapter: 'fake' }
  130. }
  131. }, function(err, orm) {
  132. if(err) { return done(err); }
  133. // First, just a quick sanity check.
  134. Waterline.getModel('pet', orm).find({ name: 'fluffy' }, function(err, pets) {
  135. if (err){ return done(err); }
  136. if (pets.length !== 1) { return done(new Error('Expected there to be exactly one record returned!')); }
  137. // Then, let's test the meat of this.
  138. Waterline.getModel('user', orm).find({ name: 'jorahmormont' }, {
  139. // Use a deliberate no-op populate:
  140. pets: {
  141. or: [
  142. {
  143. id: { in: [] }
  144. },
  145. {
  146. and: [
  147. {},
  148. {
  149. id: { nin: [] }
  150. },
  151. {
  152. or: []
  153. }
  154. ]
  155. }
  156. ]
  157. }
  158. }, function(err, users) {
  159. if (err){ return done(err); }
  160. if (users.length !== 1) { return done(new Error('Expected there to be exactly one record returned!')); }
  161. if (!_.isArray(users[0].pets) || users[0].pets.length !== 0) { return done(new Error('Expected base value for populated `pets` (i.e. empty array)')); }
  162. return done();
  163. });//_∏_
  164. });//_∏_
  165. });//_∏_ (Waterline.start())
  166. });//it
  167. });
  168. });
  169. });