query.findOrCreate.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. var assert = require('assert');
  2. var Waterline = require('../../../lib/waterline');
  3. describe('Collection Query ::', function() {
  4. describe('.findOrCreate()', 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. fetchRecordsOnCreate: true,
  14. fetchRecordsOnCreateEach: true,
  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 = {
  28. find: function(con, query, cb) { return cb(null, []); },
  29. create: function(con, query, cb) { query.newRecord.id = 1; return cb(null, query.newRecord); }
  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. query = orm.collections.user;
  41. return done();
  42. });
  43. });
  44. it('should set default values', function(done) {
  45. query.findOrCreate({ name: 'Foo Bar' }, {}, function(err, status, created) {
  46. if (err) {
  47. return done(err);
  48. }
  49. assert.equal(status.name, 'Foo Bar');
  50. assert.equal(created, true);
  51. return done();
  52. });
  53. });
  54. it('should set default values with exec', function(done) {
  55. query.findOrCreate({ name: 'Foo Bar' }).exec(function(err, status, created) {
  56. if (err) {
  57. return done(err);
  58. }
  59. assert.equal(status.name, 'Foo Bar');
  60. assert.equal(created, true);
  61. return done();
  62. });
  63. });
  64. it('should set values', function(done) {
  65. query.findOrCreate({ name: 'Foo Bar' }, { name: 'Bob' }, function(err, status, created) {
  66. if (err) {
  67. return done(err);
  68. }
  69. assert.equal(status.name, 'Bob');
  70. assert.equal(created, true);
  71. return done();
  72. });
  73. });
  74. it('should strip values that don\'t belong to the schema', function(done) {
  75. query.findOrCreate({ name: 'Foo Bar'}, { foo: 'bar' }, function(err, values) {
  76. if (err) {
  77. return done(err);
  78. }
  79. assert(!values.foo);
  80. return done();
  81. });
  82. });
  83. });
  84. describe('casting values', function() {
  85. var query;
  86. before(function(done) {
  87. var waterline = new Waterline();
  88. var Model = Waterline.Model.extend({
  89. identity: 'user',
  90. datastore: 'foo',
  91. primaryKey: 'id',
  92. fetchRecordsOnCreate: true,
  93. fetchRecordsOnCreateEach: true,
  94. attributes: {
  95. id: {
  96. type: 'number'
  97. },
  98. name: {
  99. type: 'string'
  100. },
  101. age: {
  102. type: 'number'
  103. }
  104. }
  105. });
  106. waterline.registerModel(Model);
  107. // Fixture Adapter Def
  108. var adapterDef = {
  109. find: function(con, query, cb) { return cb(null, []); },
  110. create: function(con, query, cb) { query.newRecord.id = 1; return cb(null, query.newRecord); }
  111. };
  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.findOrCreate({ name: 'Foo Bar' }, { name: 'foo', age: '27' }, function(err, values, created) {
  127. if (err) {
  128. return done(err);
  129. }
  130. assert.equal(values.name, 'foo');
  131. assert.equal(values.age, 27);
  132. assert.equal(created, true);
  133. return done();
  134. });
  135. });
  136. });
  137. });
  138. });