index.spec.js (6042B)
1 'use strict'; 2 3 var traverse = require('../index'); 4 var assert = require('assert'); 5 6 describe('json-schema-traverse', function() { 7 var calls; 8 9 beforeEach(function() { 10 calls = []; 11 }); 12 13 it('should traverse all keywords containing schemas recursively', function() { 14 var schema = require('./fixtures/schema').schema; 15 var expectedCalls = require('./fixtures/schema').expectedCalls; 16 17 traverse(schema, {cb: callback}); 18 assert.deepStrictEqual(calls, expectedCalls); 19 }); 20 21 describe('Legacy v0.3.1 API', function() { 22 it('should traverse all keywords containing schemas recursively', function() { 23 var schema = require('./fixtures/schema').schema; 24 var expectedCalls = require('./fixtures/schema').expectedCalls; 25 26 traverse(schema, callback); 27 assert.deepStrictEqual(calls, expectedCalls); 28 }); 29 30 it('should work when an options object is provided', function() { 31 // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex 32 var schema = require('./fixtures/schema').schema; 33 var expectedCalls = require('./fixtures/schema').expectedCalls; 34 35 traverse(schema, {}, callback); 36 assert.deepStrictEqual(calls, expectedCalls); 37 }); 38 }); 39 40 41 describe('allKeys option', function() { 42 var schema = { 43 someObject: { 44 minimum: 1, 45 maximum: 2 46 } 47 }; 48 49 it('should traverse objects with allKeys: true option', function() { 50 // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex 51 var expectedCalls = [ 52 [schema, '', schema, undefined, undefined, undefined, undefined], 53 [schema.someObject, '/someObject', schema, '', 'someObject', schema, undefined] 54 ]; 55 56 traverse(schema, {allKeys: true, cb: callback}); 57 assert.deepStrictEqual(calls, expectedCalls); 58 }); 59 60 61 it('should NOT traverse objects with allKeys: false option', function() { 62 // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex 63 var expectedCalls = [ 64 [schema, '', schema, undefined, undefined, undefined, undefined] 65 ]; 66 67 traverse(schema, {allKeys: false, cb: callback}); 68 assert.deepStrictEqual(calls, expectedCalls); 69 }); 70 71 72 it('should NOT traverse objects without allKeys option', function() { 73 // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex 74 var expectedCalls = [ 75 [schema, '', schema, undefined, undefined, undefined, undefined] 76 ]; 77 78 traverse(schema, {cb: callback}); 79 assert.deepStrictEqual(calls, expectedCalls); 80 }); 81 82 83 it('should NOT travers objects in standard keywords which value is not a schema', function() { 84 var schema2 = { 85 const: {foo: 'bar'}, 86 enum: ['a', 'b'], 87 required: ['foo'], 88 another: { 89 90 }, 91 patternProperties: {}, // will not traverse - no properties 92 dependencies: true, // will not traverse - invalid 93 properties: { 94 smaller: { 95 type: 'number' 96 }, 97 larger: { 98 type: 'number', 99 minimum: {$data: '1/smaller'} 100 } 101 } 102 }; 103 104 // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex 105 var expectedCalls = [ 106 [schema2, '', schema2, undefined, undefined, undefined, undefined], 107 [schema2.another, '/another', schema2, '', 'another', schema2, undefined], 108 [schema2.properties.smaller, '/properties/smaller', schema2, '', 'properties', schema2, 'smaller'], 109 [schema2.properties.larger, '/properties/larger', schema2, '', 'properties', schema2, 'larger'], 110 ]; 111 112 traverse(schema2, {allKeys: true, cb: callback}); 113 assert.deepStrictEqual(calls, expectedCalls); 114 }); 115 }); 116 117 describe('pre and post', function() { 118 var schema = { 119 type: 'object', 120 properties: { 121 name: {type: 'string'}, 122 age: {type: 'number'} 123 } 124 }; 125 126 it('should traverse schema in pre-order', function() { 127 traverse(schema, {cb: {pre}}); 128 var expectedCalls = [ 129 ['pre', schema, '', schema, undefined, undefined, undefined, undefined], 130 ['pre', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'], 131 ['pre', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'], 132 ]; 133 assert.deepStrictEqual(calls, expectedCalls); 134 }); 135 136 it('should traverse schema in post-order', function() { 137 traverse(schema, {cb: {post}}); 138 var expectedCalls = [ 139 ['post', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'], 140 ['post', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'], 141 ['post', schema, '', schema, undefined, undefined, undefined, undefined], 142 ]; 143 assert.deepStrictEqual(calls, expectedCalls); 144 }); 145 146 it('should traverse schema in pre- and post-order at the same time', function() { 147 traverse(schema, {cb: {pre, post}}); 148 var expectedCalls = [ 149 ['pre', schema, '', schema, undefined, undefined, undefined, undefined], 150 ['pre', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'], 151 ['post', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'], 152 ['pre', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'], 153 ['post', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'], 154 ['post', schema, '', schema, undefined, undefined, undefined, undefined], 155 ]; 156 assert.deepStrictEqual(calls, expectedCalls); 157 }); 158 }); 159 160 function callback() { 161 calls.push(Array.prototype.slice.call(arguments)); 162 } 163 164 function pre() { 165 calls.push(['pre'].concat(Array.prototype.slice.call(arguments))); 166 } 167 168 function post() { 169 calls.push(['post'].concat(Array.prototype.slice.call(arguments))); 170 } 171 });