query.update.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. var assert = require('assert');
  2. var Waterline = require('../../../lib/waterline');
  3. describe('Collection Query ::', function() {
  4. describe('.update()', function() {
  5. describe('with proper values', 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. attributes: {
  14. id: {
  15. type: 'number'
  16. },
  17. name: {
  18. type: 'string',
  19. defaultsTo: 'Foo Bar'
  20. },
  21. age: {
  22. type: 'number'
  23. },
  24. updatedAt: {
  25. type: 'number',
  26. autoUpdatedAt: true
  27. }
  28. }
  29. });
  30. waterline.registerModel(Model);
  31. // Fixture Adapter Def
  32. var adapterDef = { update: function(con, query, cb) { query.valuesToSet.id = 1; return cb(null, [query.valuesToSet]); }};
  33. var connections = {
  34. 'foo': {
  35. adapter: 'foobar'
  36. }
  37. };
  38. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  39. if (err) {
  40. return done(err);
  41. }
  42. query = orm.collections.user;
  43. return done();
  44. });
  45. });
  46. it('should change the updatedAt timestamp', function(done) {
  47. query.update({}, { name: 'foo' }, function(err, status) {
  48. if (err) {
  49. return done(err);
  50. }
  51. assert(status[0].updatedAt);
  52. return done();
  53. }, { fetch: true });
  54. });
  55. it('should set values', function(done) {
  56. query.update({}, { name: 'foo' }, function(err, status) {
  57. if (err) {
  58. return done(err);
  59. }
  60. assert.equal(status[0].name, 'foo');
  61. return done();
  62. }, { fetch: true });
  63. });
  64. it('should strip values that don\'t belong to the schema', function(done) {
  65. query.update({}, { foo: 'bar' }, function(err, values) {
  66. if (err) {
  67. return done(err);
  68. }
  69. assert(!values.foo);
  70. return done();
  71. }, { fetch: true });
  72. });
  73. it('should allow a query to be built using deferreds', function(done) {
  74. query.update()
  75. .where({})
  76. .set({ name: 'foo' })
  77. .meta({
  78. fetch: true
  79. })
  80. .exec(function(err, results) {
  81. if (err) {
  82. return done(err);
  83. }
  84. assert.equal(results[0].name, 'foo');
  85. return done();
  86. });
  87. });
  88. });
  89. describe('casting values', function() {
  90. var query;
  91. before(function(done) {
  92. var waterline = new Waterline();
  93. var Model = Waterline.Model.extend({
  94. identity: 'user',
  95. datastore: 'foo',
  96. primaryKey: 'id',
  97. attributes: {
  98. id: {
  99. type: 'number'
  100. },
  101. name: {
  102. type: 'string'
  103. },
  104. age: {
  105. type: 'number'
  106. }
  107. }
  108. });
  109. waterline.registerModel(Model);
  110. // Fixture Adapter Def
  111. var adapterDef = { update: function(con, query, cb) { query.valuesToSet.id = 1; return cb(null, [query.valuesToSet]); }};
  112. var connections = {
  113. 'foo': {
  114. adapter: 'foobar'
  115. }
  116. };
  117. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  118. if (err) {
  119. return done(err);
  120. }
  121. query = orm.collections.user;
  122. return done();
  123. });
  124. });
  125. it('should cast values before sending to adapter', function(done) {
  126. query.update({}, { name: 'foo', age: '27' }, function(err, values) {
  127. if (err) {
  128. return done(err);
  129. }
  130. assert.equal(values[0].name, 'foo');
  131. assert.equal(values[0].age, 27);
  132. return done();
  133. }, { fetch: true });
  134. });
  135. });
  136. describe('with custom columnName set', function() {
  137. var query;
  138. before(function(done) {
  139. var waterline = new Waterline();
  140. var Model = Waterline.Model.extend({
  141. identity: 'user',
  142. datastore: 'foo',
  143. primaryKey: 'myPk',
  144. attributes: {
  145. name: {
  146. type: 'string',
  147. defaultsTo: 'Foo Bar'
  148. },
  149. myPk: {
  150. type: 'number',
  151. columnName: 'pkColumn'
  152. }
  153. }
  154. });
  155. waterline.registerModel(Model);
  156. // Fixture Adapter Def
  157. var adapterDef = { update: function(con, query, cb) { return cb(null, [{myPk: 1, criteria: query.criteria}]); }};
  158. var connections = {
  159. 'foo': {
  160. adapter: 'foobar'
  161. }
  162. };
  163. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  164. if (err) {
  165. return done(err);
  166. }
  167. query = orm.collections.user;
  168. return done();
  169. });
  170. });
  171. it('should use the custom primary key when a single value is passed in', function(done) {
  172. query.update(1, { name: 'foo' }, function(err, values) {
  173. if (err) {
  174. return done(err);
  175. }
  176. assert.equal(values[0].criteria.where.pkColumn, 1);
  177. return done();
  178. }, { fetch: true });
  179. });
  180. });
  181. });
  182. });