query.createEach.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. var assert = require('assert');
  2. var _ = require('@sailshq/lodash');
  3. var Waterline = require('../../../lib/waterline');
  4. describe('Collection Query ::', function() {
  5. describe('.createEach()', function() {
  6. describe('with proper values', function() {
  7. var query;
  8. before(function(done) {
  9. var waterline = new Waterline();
  10. var Model = Waterline.Model.extend({
  11. identity: 'user',
  12. datastore: 'foo',
  13. primaryKey: 'id',
  14. fetchRecordsOnCreateEach: true,
  15. attributes: {
  16. id: {
  17. type: 'number'
  18. },
  19. first:{
  20. type: 'string',
  21. defaultsTo: 'Foo'
  22. },
  23. second: {
  24. type: 'string',
  25. defaultsTo: 'Bar'
  26. },
  27. name: {
  28. type: 'string',
  29. defaultsTo: 'Foo Bar'
  30. },
  31. arr: {
  32. type: 'json',
  33. defaultsTo: []
  34. },
  35. createdAt: {
  36. type: 'number',
  37. autoCreatedAt: true
  38. },
  39. updatedAt: {
  40. type: 'number',
  41. autoUpdatedAt: true
  42. }
  43. }
  44. });
  45. waterline.registerModel(Model);
  46. // Fixture Adapter Def
  47. var adapterDef = {
  48. createEach: function(con, query, cb) {
  49. var id = 0;
  50. query.newRecords = _.map(query.newRecords, function(newRecord) { newRecord.id = ++id; return newRecord; });
  51. return cb(null, query.newRecords);
  52. }
  53. };
  54. var connections = {
  55. 'foo': {
  56. adapter: 'foobar'
  57. }
  58. };
  59. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  60. if (err) {
  61. return done(err);
  62. }
  63. query = orm.collections.user;
  64. return done();
  65. });
  66. });
  67. it('should require an array of values', function(done) {
  68. query.createEach({}, function(err) {
  69. assert(err);
  70. return done();
  71. });
  72. });
  73. it('should require a valid set of records', function(done) {
  74. query.createEach([{},'string'], function(err) {
  75. assert(err);
  76. done();
  77. });
  78. });
  79. it('should add default values to each record', function(done) {
  80. query.createEach([{},{}], function(err, values) {
  81. if (err) {
  82. return done(err);
  83. }
  84. assert(_.isArray(values));
  85. assert.equal(values[0].name, 'Foo Bar');
  86. assert.equal(values[1].name, 'Foo Bar');
  87. return done();
  88. });
  89. });
  90. it('should clone default values for each record', function(done) {
  91. query.createEach([{},{}], function(err, values) {
  92. if (err) {
  93. return done(err);
  94. }
  95. assert(_.isArray(values));
  96. assert.notEqual(values[0].arr !== values[1].arr);
  97. // Add an item to one array
  98. values[1].arr.push('another');
  99. // Check that the values aren't refs
  100. assert.equal(values[0].arr.length, 0);
  101. assert.equal(values[1].arr.length, 1);
  102. return done();
  103. });
  104. });
  105. it('should strip values that don\'t belong to the schema', function(done) {
  106. query.createEach([{ foo: 'bar' }], function(err, values) {
  107. if (err) {
  108. return done(err);
  109. }
  110. assert(!values[0].foo);
  111. return done();
  112. });
  113. });
  114. it('should add timestamp values to each record', function(done) {
  115. query.createEach([{},{}], function(err, values) {
  116. if (err) {
  117. return done(err);
  118. }
  119. assert(values[0].createdAt);
  120. assert(values[0].updatedAt);
  121. assert(values[0].createdAt);
  122. assert(values[1].updatedAt);
  123. return done();
  124. });
  125. });
  126. it('should allow a query to be built using deferreds', function(done) {
  127. query.createEach([{ name: 'bob' }, { name: 'foo'}])
  128. .exec(function(err, result) {
  129. if (err) {
  130. return done(err);
  131. }
  132. assert(result);
  133. assert.equal(result[0].name, 'bob');
  134. assert.equal(result[1].name, 'foo');
  135. return done();
  136. });
  137. });
  138. });
  139. describe('casting values', function() {
  140. var query;
  141. before(function(done) {
  142. var waterline = new Waterline();
  143. var Model = Waterline.Model.extend({
  144. identity: 'user',
  145. datastore: 'foo',
  146. primaryKey: 'id',
  147. fetchRecordsOnCreateEach: true,
  148. attributes: {
  149. id: {
  150. type: 'number'
  151. },
  152. name: {
  153. type: 'string'
  154. },
  155. age: {
  156. type: 'number'
  157. }
  158. }
  159. });
  160. waterline.registerModel(Model);
  161. // Fixture Adapter Def
  162. var adapterDef = {
  163. createEach: function(con, query, cb) {
  164. var id = 0;
  165. query.newRecords = _.map(query.newRecords, function(newRecord) { newRecord.id = ++id; return newRecord; });
  166. return cb(null, query.newRecords);
  167. }
  168. };
  169. var connections = {
  170. 'foo': {
  171. adapter: 'foobar'
  172. }
  173. };
  174. waterline.initialize({ adapters: { foobar: adapterDef }, datastores: connections }, function(err, orm) {
  175. if (err) {
  176. return done(err);
  177. }
  178. query = orm.collections.user;
  179. return done();
  180. });
  181. });
  182. it('should cast values before sending to adapter', function(done) {
  183. query.createEach([{ name: 'foo', age: '27' }], function(err, values) {
  184. if (err) {
  185. return done(err);
  186. }
  187. assert.equal(values[0].name, 'foo');
  188. assert.equal(values[0].age, 27);
  189. return done();
  190. });
  191. });
  192. it('should not be detructive to passed-in arrays', function(done) {
  193. var myPreciousArray = [{ name: 'foo', age: '27' }];
  194. query.createEach(myPreciousArray, function(err) {
  195. if (err) {
  196. return done(err);
  197. }
  198. assert.equal(myPreciousArray.length, 1);
  199. return done();
  200. });
  201. });
  202. });
  203. });
  204. });