validations.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. var assert = require('assert');
  2. var util = require('util');
  3. var _ = require('@sailshq/lodash');
  4. var Waterline = require('../../../lib/waterline');
  5. describe('Collection Validator ::', function() {
  6. describe('.validate()', function() {
  7. var person;
  8. var car;
  9. before(function(done) {
  10. var waterline = new Waterline();
  11. var Person = Waterline.Model.extend({
  12. identity: 'person',
  13. datastore: 'foo',
  14. primaryKey: 'id',
  15. attributes: {
  16. id: {
  17. type: 'number'
  18. },
  19. age: {
  20. type: 'number'
  21. },
  22. sex: {
  23. type: 'string',
  24. required: true,
  25. validations: {
  26. isIn: ['male', 'female']
  27. }
  28. }
  29. }
  30. });
  31. var Car = Waterline.Model.extend({
  32. identity: 'car',
  33. datastore: 'foo',
  34. primaryKey: 'id',
  35. attributes: {
  36. id: {
  37. type: 'string',
  38. required: true,
  39. validations: {
  40. minLength: 6
  41. }
  42. }
  43. }
  44. });
  45. waterline.registerModel(Person);
  46. waterline.registerModel(Car);
  47. var datastores = {
  48. 'foo': {
  49. adapter: 'foobar'
  50. }
  51. };
  52. waterline.initialize({ adapters: { foobar: { update: function(con, query, cb) { return cb(); }, create: function(con, query, cb) { return cb(); } } }, datastores: datastores }, function(err, orm) {
  53. if (err) {
  54. return done(err);
  55. }
  56. person = orm.collections.person;
  57. car = orm.collections.car;
  58. done();
  59. });
  60. });
  61. it('should not return any errors when no validation rules are violated', function(done) {
  62. person.create({ sex: 'male' }).exec(function(err) {
  63. assert(!err);
  64. return done();
  65. });
  66. });
  67. it('should return an Error with name `UsageError` when a required field is not present in a `create`', function(done) {
  68. person.create({}).exec(function(err) {
  69. assert(err);
  70. assert.equal(err.name, 'UsageError');
  71. assert(err.message.match(/required/));
  72. return done();
  73. });
  74. });
  75. it('should return an Error with name `UsageError` when a required string field is set to empty string in a `create`', function(done) {
  76. person.create({ sex: '' }).exec(function(err) {
  77. assert(err);
  78. assert.equal(err.name, 'UsageError');
  79. assert(err.message.match(/required/));
  80. return done();
  81. });
  82. });
  83. it('should return an Error with name `UsageError` when a field is set to the wrong type in a `create`', function(done) {
  84. person.create({ name: 'foo', age: 'bar' }).exec(function(err) {
  85. assert(err);
  86. assert.equal(err.name, 'UsageError');
  87. assert(err.message.match(/type/));
  88. return done();
  89. });
  90. });
  91. it('should return an Error with name `UsageError` when a field fails a validation rule in a `create`', function(done) {
  92. person.create({ name: 'foo', sex: 'bar' }).exec(function(err) {
  93. assert(err);
  94. assert.equal(err.name, 'UsageError');
  95. assert(err.message.match(/rule/));
  96. return done();
  97. });
  98. });
  99. it('should not return an Error when a required field is not present in an `update`', function(done) {
  100. person.update({}, {}).exec(function(err) {
  101. assert(!err);
  102. return done();
  103. });
  104. });
  105. it('should return an Error with name `UsageError` when a required string field is set to empty string in a `update`', function(done) {
  106. person.update({}, { sex: '' }).exec(function(err) {
  107. assert(err);
  108. assert.equal(err.name, 'UsageError');
  109. assert(err.message.match(/required/));
  110. return done();
  111. });
  112. });
  113. it('should return an Error with name `UsageError` when a field is set to the wrong type in a `update`', function(done) {
  114. person.update({}, { age: 'bar' }).exec(function(err) {
  115. assert(err);
  116. assert.equal(err.name, 'UsageError');
  117. assert(err.message.match(/type/));
  118. return done();
  119. });
  120. });
  121. it('should return an Error with name `UsageError` when a field fails a validation rule in a `update`', function(done) {
  122. person.update({}, { sex: 'bar' }).exec(function(err) {
  123. assert(err);
  124. assert.equal(err.name, 'UsageError');
  125. assert(err.message.match(/rule/));
  126. return done();
  127. });
  128. });
  129. it('should not return any errors when a primary key does not violate any validations.', function(done) {
  130. car.create({ id: 'foobarbax' }).exec(function(err) {
  131. assert(!err);
  132. return done();
  133. });
  134. });
  135. it('should return an Error with name `UsageError` when a primary key fails a validation rule in a `create`', function(done) {
  136. car.create({ id: 'foo' }).exec(function(err) {
  137. assert(err);
  138. assert.equal(err.name, 'UsageError');
  139. assert(err.message.match(/rule/));
  140. return done();
  141. });
  142. });
  143. });
  144. });