query.find.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. var query;
  7. before(function(done) {
  8. var waterline = new Waterline();
  9. var Model = Waterline.Model.extend({
  10. identity: 'user',
  11. datastore: 'foo',
  12. primaryKey: 'id',
  13. schema: false,
  14. attributes: {
  15. id: {
  16. type: 'number'
  17. },
  18. name: {
  19. type: 'string',
  20. defaultsTo: 'Foo Bar'
  21. }
  22. }
  23. });
  24. waterline.registerModel(Model);
  25. // Fixture Adapter Def
  26. var adapterDef = { find: function(con, query, cb) { return cb(null, [{id: 1, criteria: query.criteria}]); }};
  27. var connections = {
  28. 'foo': {
  29. adapter: 'foobar'
  30. }
  31. };
  32. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  33. if(err) {
  34. return done(err);
  35. }
  36. query = orm.collections.user;
  37. return done();
  38. });
  39. });
  40. it('should allow options to be optional', function(done) {
  41. query.find({}, function(err) {
  42. if(err) {
  43. return done(err);
  44. }
  45. return done();
  46. });
  47. });
  48. it('should return an array', function(done) {
  49. query.find({}, {}, function(err, values) {
  50. if (err) {
  51. return done(err);
  52. }
  53. assert(_.isArray(values));
  54. return done();
  55. });
  56. });
  57. it('should allow a query to be built using deferreds', function(done) {
  58. query.find()
  59. .where({ name: 'Foo Bar' })
  60. .where({ id: { '>': 1 } })
  61. .limit(1)
  62. .skip(1)
  63. .sort([{ name: 'desc' }])
  64. .exec(function(err, results) {
  65. if (err) {
  66. return done(err);
  67. }
  68. assert(_.isArray(results));
  69. assert.equal(results[0].criteria.limit, 1);
  70. assert.equal(results[0].criteria.skip, 1);
  71. assert.equal(results[0].criteria.sort[0].name, 'DESC');
  72. return done();
  73. });
  74. });
  75. describe('.paginate()', function() {
  76. it('should skip to 0 and limit to 30 by default', function(done) {
  77. query.find()
  78. .paginate(0)
  79. .exec(function(err, results) {
  80. if (err) {
  81. return done(err);
  82. }
  83. assert(_.isArray(results));
  84. assert.equal(results[0].criteria.skip, 0);
  85. assert.equal(results[0].criteria.limit, 30);
  86. return done();
  87. });
  88. });
  89. it('should set skip to 0 from page 0', function(done) {
  90. query.find()
  91. .paginate(1)
  92. .exec(function(err, results) {
  93. if (err) {
  94. return done(err);
  95. }
  96. assert.equal(results[0].criteria.skip, 30);
  97. return done();
  98. });
  99. });
  100. it('should set skip to 0 from page 1', function(done) {
  101. query.find()
  102. .paginate(1)
  103. .exec(function(err, results) {
  104. if (err) {
  105. return done(err);
  106. }
  107. assert.equal(results[0].criteria.skip, 30);
  108. return done();
  109. });
  110. });
  111. it('should set skip to 30', function(done) {
  112. query.find()
  113. .paginate(2)
  114. .exec(function(err, results) {
  115. if (err) {
  116. return done(err);
  117. }
  118. assert.equal(results[0].criteria.skip, 60);
  119. return done();
  120. });
  121. });
  122. it('should set limit to 1', function(done) {
  123. query.find()
  124. .paginate(1, 1)
  125. .exec(function(err, results) {
  126. if (err) {
  127. return done(err);
  128. }
  129. assert.equal(results[0].criteria.limit, 1);
  130. return done();
  131. });
  132. });
  133. it('should set skip to 20 and limit to 10', function(done) {
  134. query.find()
  135. .paginate(2, 10)
  136. .exec(function(err, results) {
  137. if (err) {
  138. return done(err);
  139. }
  140. assert.equal(results[0].criteria.skip, 20);
  141. assert.equal(results[0].criteria.limit, 10);
  142. return done();
  143. });
  144. });
  145. it('should set skip to 30 and limit to 10', function(done) {
  146. query.find()
  147. .paginate(3, 10)
  148. .exec(function(err, results) {
  149. if (err) {
  150. return done(err);
  151. }
  152. assert.equal(results[0].criteria.skip, 30);
  153. assert.equal(results[0].criteria.limit, 10);
  154. return done();
  155. });
  156. });
  157. });
  158. });
  159. });