query.findOne.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. var assert = require('assert');
  2. var util = require('util');
  3. var _ = require('@sailshq/lodash');
  4. var Waterline = require('../../../lib/waterline');
  5. describe('Collection Query ::', function() {
  6. describe('.findOne()', function() {
  7. describe('with autoPK', function() {
  8. var query;
  9. before(function(done) {
  10. var waterline = new Waterline();
  11. var Model = Waterline.Model.extend({
  12. identity: 'user',
  13. datastore: 'foo',
  14. primaryKey: 'id',
  15. attributes: {
  16. id: {
  17. type: 'number'
  18. },
  19. name: {
  20. type: 'string',
  21. defaultsTo: 'Foo Bar'
  22. }
  23. }
  24. });
  25. waterline.registerModel(Model);
  26. // Fixture Adapter Def
  27. var adapterDef = { find: function(con, query, cb) { return cb(null, [{id: 1, criteria: query.criteria}]); }};
  28. var connections = {
  29. 'foo': {
  30. adapter: 'foobar'
  31. }
  32. };
  33. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  34. if (err) {
  35. return done(err);
  36. }
  37. query = orm.collections.user;
  38. return done();
  39. });
  40. });
  41. it('should allow an integer to be passed in as criteria', function(done) {
  42. query.findOne(1, function(err, record) {
  43. if (err) {
  44. return done(err);
  45. }
  46. assert(_.isObject(record.criteria.where), 'Expected `record.where` to be a dictionary, but it is not. Here is `record`:\n```\n'+util.inspect(record,{depth:5})+'\n```\n');
  47. assert.equal(record.criteria.where.id, 1);
  48. return done();
  49. });
  50. });
  51. it('should allow a query to be built using deferreds', function(done) {
  52. query.findOne()
  53. .where({
  54. name: 'Foo Bar',
  55. id: {
  56. '>': 1
  57. }
  58. })
  59. .exec(function(err, results) {
  60. if (err) {
  61. return done(err);
  62. }
  63. assert(!_.isArray(results));
  64. assert.equal(_.keys(results.criteria.where).length, 1);
  65. assert.equal(results.criteria.where.and[0].name, 'Foo Bar');
  66. assert.equal(results.criteria.where.and[1].id['>'], 1);
  67. return done();
  68. });
  69. });
  70. });
  71. describe('with custom PK', function() {
  72. describe('with no columnName set', function() {
  73. var query;
  74. before(function(done) {
  75. var waterline = new Waterline();
  76. // Extend for testing purposes
  77. var Model = Waterline.Model.extend({
  78. identity: 'user',
  79. datastore: 'foo',
  80. primaryKey: 'myPk',
  81. attributes: {
  82. name: {
  83. type: 'string',
  84. defaultsTo: 'Foo Bar'
  85. },
  86. myPk: {
  87. type: 'number'
  88. }
  89. }
  90. });
  91. waterline.registerModel(Model);
  92. // Fixture Adapter Def
  93. var adapterDef = { find: function(con, query, cb) { return cb(null, [{myPk: 1, criteria: query.criteria}]); }};
  94. var connections = {
  95. 'foo': {
  96. adapter: 'foobar'
  97. }
  98. };
  99. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  100. if (err) {
  101. return done(err);
  102. }
  103. query = orm.collections.user;
  104. return done();
  105. });
  106. });
  107. it('should use the custom primary key when a single value is passed in', function(done) {
  108. query.findOne(1, function(err, values) {
  109. if (err) {
  110. return done(err);
  111. }
  112. assert.equal(values.criteria.where.myPk, 1);
  113. return done();
  114. });
  115. });
  116. });
  117. describe('with custom columnName set', function() {
  118. var query;
  119. before(function(done) {
  120. var waterline = new Waterline();
  121. // Extend for testing purposes
  122. var Model = Waterline.Model.extend({
  123. identity: 'user',
  124. datastore: 'foo',
  125. primaryKey: 'myPk',
  126. attributes: {
  127. name: {
  128. type: 'string',
  129. defaultsTo: 'Foo Bar'
  130. },
  131. myPk: {
  132. type: 'number',
  133. columnName: 'pkColumn'
  134. }
  135. }
  136. });
  137. waterline.registerModel(Model);
  138. // Fixture Adapter Def
  139. var adapterDef = { find: function(con, query, cb) { return cb(null, [{myPk: 1, criteria: query.criteria}]); }};
  140. var connections = {
  141. 'foo': {
  142. adapter: 'foobar'
  143. }
  144. };
  145. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  146. if (err) {
  147. return done(err);
  148. }
  149. query = orm.collections.user;
  150. return done();
  151. });
  152. });
  153. it('should use the custom primary key when a single value is passed in', function(done) {
  154. query.findOne(1, function(err, values) {
  155. if (err) {
  156. return done(err);
  157. }
  158. assert.equal(values.criteria.where.pkColumn, 1);
  159. return done();
  160. });
  161. });
  162. });
  163. });
  164. });
  165. });