boolean.spec.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. 'use strict';
  2. var Ajv = require('./ajv');
  3. require('./chai').should();
  4. describe('boolean schemas', function() {
  5. var ajvs;
  6. before(function() {
  7. ajvs = [
  8. new Ajv,
  9. new Ajv({allErrors: true}),
  10. new Ajv({inlineRefs: false})
  11. ];
  12. });
  13. describe('top level schema', function() {
  14. describe('schema = true', function() {
  15. it('should validate any data as valid', function() {
  16. ajvs.forEach(test(true, true));
  17. });
  18. });
  19. describe('schema = false', function() {
  20. it('should validate any data as invalid', function() {
  21. ajvs.forEach(test(false, false));
  22. });
  23. });
  24. function test(boolSchema, valid) {
  25. return function (ajv) {
  26. var validate = ajv.compile(boolSchema);
  27. testSchema(validate, valid);
  28. };
  29. }
  30. });
  31. describe('in properties / sub-properties', function() {
  32. describe('schema = true', function() {
  33. it('should be valid with any property value', function() {
  34. ajvs.forEach(test(true, true));
  35. });
  36. });
  37. describe('schema = false', function() {
  38. it('should be invalid with any property value', function() {
  39. ajvs.forEach(test(false, false));
  40. });
  41. });
  42. function test(boolSchema, valid) {
  43. return function (ajv) {
  44. var schema = {
  45. type: 'object',
  46. properties: {
  47. foo: boolSchema,
  48. bar: {
  49. type: 'object',
  50. properties: {
  51. baz: boolSchema
  52. }
  53. }
  54. }
  55. };
  56. var validate = ajv.compile(schema);
  57. validate({ foo: 1, bar: { baz: 1 }}) .should.equal(valid);
  58. validate({ foo: '1', bar: { baz: '1' }}) .should.equal(valid);
  59. validate({ foo: {}, bar: { baz: {} }}) .should.equal(valid);
  60. validate({ foo: [], bar: { baz: [] }}) .should.equal(valid);
  61. validate({ foo: true, bar: { baz: true }}) .should.equal(valid);
  62. validate({ foo: false, bar: { baz: false }}) .should.equal(valid);
  63. validate({ foo: null, bar: { baz: null }}) .should.equal(valid);
  64. validate({ bar: { quux: 1 } }) .should.equal(true);
  65. };
  66. }
  67. });
  68. describe('in items / sub-items', function() {
  69. describe('schema = true', function() {
  70. it('should be valid with any item value', function() {
  71. ajvs.forEach(test(true, true));
  72. });
  73. });
  74. describe('schema = false', function() {
  75. it('should be invalid with any item value', function() {
  76. ajvs.forEach(test(false, false));
  77. });
  78. });
  79. function test(boolSchema, valid) {
  80. return function (ajv) {
  81. var schema = {
  82. type: 'array',
  83. items: boolSchema
  84. };
  85. var validate = ajv.compile(schema);
  86. validate([ 1 ]) .should.equal(valid);
  87. validate([ '1' ]) .should.equal(valid);
  88. validate([ {} ]) .should.equal(valid);
  89. validate([ [] ]) .should.equal(valid);
  90. validate([ true ]) .should.equal(valid);
  91. validate([ false ]) .should.equal(valid);
  92. validate([ null ]) .should.equal(valid);
  93. validate([]) .should.equal(true);
  94. schema = {
  95. type: 'array',
  96. items: [
  97. true,
  98. {
  99. type: 'array',
  100. items: [
  101. true,
  102. boolSchema
  103. ]
  104. },
  105. boolSchema
  106. ]
  107. };
  108. validate = ajv.compile(schema);
  109. validate([ 1, [ 1, 1 ], 1 ]) .should.equal(valid);
  110. validate([ '1', [ '1', '1' ], '1' ]) .should.equal(valid);
  111. validate([ {}, [ {}, {} ], {} ]) .should.equal(valid);
  112. validate([ [], [ [], [] ], [] ]) .should.equal(valid);
  113. validate([ true, [ true, true ], true ]) .should.equal(valid);
  114. validate([ false, [ false, false ], false ]) .should.equal(valid);
  115. validate([ null, [ null, null ], null ]) .should.equal(valid);
  116. validate([ 1, [ 1 ] ]) .should.equal(true);
  117. };
  118. }
  119. });
  120. describe('in dependencies and sub-dependencies', function() {
  121. describe('schema = true', function() {
  122. it('should be valid with any property value', function() {
  123. ajvs.forEach(test(true, true));
  124. });
  125. });
  126. describe('schema = false', function() {
  127. it('should be invalid with any property value', function() {
  128. ajvs.forEach(test(false, false));
  129. });
  130. });
  131. function test(boolSchema, valid) {
  132. return function (ajv) {
  133. var schema = {
  134. type: 'object',
  135. dependencies: {
  136. foo: boolSchema,
  137. bar: {
  138. type: 'object',
  139. dependencies: {
  140. baz: boolSchema
  141. }
  142. }
  143. }
  144. };
  145. var validate = ajv.compile(schema);
  146. validate({ foo: 1, bar: 1, baz: 1 }) .should.equal(valid);
  147. validate({ foo: '1', bar: '1', baz: '1' }) .should.equal(valid);
  148. validate({ foo: {}, bar: {}, baz: {} }) .should.equal(valid);
  149. validate({ foo: [], bar: [], baz: [] }) .should.equal(valid);
  150. validate({ foo: true, bar: true, baz: true }) .should.equal(valid);
  151. validate({ foo: false, bar: false, baz: false }) .should.equal(valid);
  152. validate({ foo: null, bar: null, baz: null }) .should.equal(valid);
  153. validate({ bar: 1, quux: 1 }) .should.equal(true);
  154. };
  155. }
  156. });
  157. describe('in patternProperties', function () {
  158. describe('schema = true', function() {
  159. it('should be valid with any property matching pattern', function() {
  160. ajvs.forEach(test(true, true));
  161. });
  162. });
  163. describe('schema = false', function() {
  164. it('should be invalid with any property matching pattern', function() {
  165. ajvs.forEach(test(false, false));
  166. });
  167. });
  168. function test(boolSchema, valid) {
  169. return function (ajv) {
  170. var schema = {
  171. type: 'object',
  172. patternProperties: {
  173. '^f': boolSchema,
  174. 'r$': {
  175. type: 'object',
  176. patternProperties: {
  177. 'z$': boolSchema
  178. }
  179. }
  180. }
  181. };
  182. var validate = ajv.compile(schema);
  183. validate({ foo: 1, bar: { baz: 1 }}) .should.equal(valid);
  184. validate({ foo: '1', bar: { baz: '1' }}) .should.equal(valid);
  185. validate({ foo: {}, bar: { baz: {} }}) .should.equal(valid);
  186. validate({ foo: [], bar: { baz: [] }}) .should.equal(valid);
  187. validate({ foo: true, bar: { baz: true }}) .should.equal(valid);
  188. validate({ foo: false, bar: { baz: false }}) .should.equal(valid);
  189. validate({ foo: null, bar: { baz: null }}) .should.equal(valid);
  190. validate({ bar: { quux: 1 } }) .should.equal(true);
  191. };
  192. }
  193. });
  194. describe('in propertyNames', function() {
  195. describe('schema = true', function() {
  196. it('should be valid with any property', function() {
  197. ajvs.forEach(test(true, true));
  198. });
  199. });
  200. describe('schema = false', function() {
  201. it('should be invalid with any property', function() {
  202. ajvs.forEach(test(false, false));
  203. });
  204. });
  205. function test(boolSchema, valid) {
  206. return function (ajv) {
  207. var schema = {
  208. type: 'object',
  209. propertyNames: boolSchema
  210. };
  211. var validate = ajv.compile(schema);
  212. validate({ foo: 1 }) .should.equal(valid);
  213. validate({ bar: 1 }) .should.equal(valid);
  214. validate({}) .should.equal(true);
  215. };
  216. }
  217. });
  218. describe('in contains', function() {
  219. describe('schema = true', function() {
  220. it('should be valid with any items', function() {
  221. ajvs.forEach(test(true, true));
  222. });
  223. });
  224. describe('schema = false', function() {
  225. it('should be invalid with any items', function() {
  226. ajvs.forEach(test(false, false));
  227. });
  228. });
  229. function test(boolSchema, valid) {
  230. return function (ajv) {
  231. var schema = {
  232. type: 'array',
  233. contains: boolSchema
  234. };
  235. var validate = ajv.compile(schema);
  236. validate([ 1 ]) .should.equal(valid);
  237. validate([ 'foo' ]) .should.equal(valid);
  238. validate([ {} ]) .should.equal(valid);
  239. validate([ [] ]) .should.equal(valid);
  240. validate([ true ]) .should.equal(valid);
  241. validate([ false ]) .should.equal(valid);
  242. validate([ null ]) .should.equal(valid);
  243. validate([]) .should.equal(false);
  244. };
  245. }
  246. });
  247. describe('in not', function() {
  248. describe('schema = true', function() {
  249. it('should be invalid with any data', function() {
  250. ajvs.forEach(test(true, false));
  251. });
  252. });
  253. describe('schema = false', function() {
  254. it('should be valid with any data', function() {
  255. ajvs.forEach(test(false, true));
  256. });
  257. });
  258. function test(boolSchema, valid) {
  259. return function (ajv) {
  260. var schema = {
  261. not: boolSchema
  262. };
  263. var validate = ajv.compile(schema);
  264. testSchema(validate, valid);
  265. };
  266. }
  267. });
  268. describe('in allOf', function() {
  269. describe('schema = true', function() {
  270. it('should be valid with any data', function() {
  271. ajvs.forEach(test(true, true));
  272. });
  273. });
  274. describe('schema = false', function() {
  275. it('should be invalid with any data', function() {
  276. ajvs.forEach(test(false, false));
  277. });
  278. });
  279. function test(boolSchema, valid) {
  280. return function (ajv) {
  281. var schema = {
  282. allOf: [
  283. false,
  284. boolSchema
  285. ]
  286. };
  287. var validate = ajv.compile(schema);
  288. testSchema(validate, false);
  289. schema = {
  290. allOf: [
  291. true,
  292. boolSchema
  293. ]
  294. };
  295. validate = ajv.compile(schema);
  296. testSchema(validate, valid);
  297. };
  298. }
  299. });
  300. describe('in anyOf', function() {
  301. describe('schema = true', function() {
  302. it('should be valid with any data', function() {
  303. ajvs.forEach(test(true, true));
  304. });
  305. });
  306. describe('schema = false', function() {
  307. it('should be invalid with any data', function() {
  308. ajvs.forEach(test(false, false));
  309. });
  310. });
  311. function test(boolSchema, valid) {
  312. return function (ajv) {
  313. var schema = {
  314. anyOf: [
  315. false,
  316. boolSchema
  317. ]
  318. };
  319. var validate = ajv.compile(schema);
  320. testSchema(validate, valid);
  321. schema = {
  322. anyOf: [
  323. true,
  324. boolSchema
  325. ]
  326. };
  327. validate = ajv.compile(schema);
  328. testSchema(validate, true);
  329. };
  330. }
  331. });
  332. describe('in oneOf', function() {
  333. describe('schema = true', function() {
  334. it('should be valid with any data', function() {
  335. ajvs.forEach(test(true, true));
  336. });
  337. });
  338. describe('schema = false', function() {
  339. it('should be invalid with any data', function() {
  340. ajvs.forEach(test(false, false));
  341. });
  342. });
  343. function test(boolSchema, valid) {
  344. return function (ajv) {
  345. var schema = {
  346. oneOf: [
  347. false,
  348. boolSchema
  349. ]
  350. };
  351. var validate = ajv.compile(schema);
  352. testSchema(validate, valid);
  353. schema = {
  354. oneOf: [
  355. true,
  356. boolSchema
  357. ]
  358. };
  359. validate = ajv.compile(schema);
  360. testSchema(validate, !valid);
  361. };
  362. }
  363. });
  364. describe('in $ref', function() {
  365. describe('schema = true', function() {
  366. it('should be valid with any data', function() {
  367. ajvs.forEach(test(true, true));
  368. });
  369. });
  370. describe('schema = false', function() {
  371. it('should be invalid with any data', function() {
  372. ajvs.forEach(test(false, false));
  373. });
  374. });
  375. function test(boolSchema, valid) {
  376. return function (ajv) {
  377. var schema = {
  378. $ref: '#/definitions/bool',
  379. definitions: {
  380. bool: boolSchema
  381. }
  382. };
  383. var validate = ajv.compile(schema);
  384. testSchema(validate, valid);
  385. };
  386. }
  387. });
  388. function testSchema(validate, valid) {
  389. validate(1) .should.equal(valid);
  390. validate('foo') .should.equal(valid);
  391. validate({}) .should.equal(valid);
  392. validate([]) .should.equal(valid);
  393. validate(true) .should.equal(valid);
  394. validate(false) .should.equal(valid);
  395. validate(null) .should.equal(valid);
  396. }
  397. });