198 lines
5.6 KiB
JavaScript
198 lines
5.6 KiB
JavaScript
'use strict';
|
|
|
|
|
|
var Ajv = require(typeof window == 'object' ? 'ajv' : '../lib/ajv')
|
|
, should = require('chai').should();
|
|
|
|
|
|
// Example from http://json-schema.org/latest/json-schema-core.html#anchor29
|
|
var schema = {
|
|
"id": "http://x.y.z/rootschema.json#",
|
|
"schema1": {
|
|
"id": "#foo",
|
|
"description": "schema1"
|
|
},
|
|
"schema2": {
|
|
"id": "otherschema.json",
|
|
"description": "schema2",
|
|
"nested": {
|
|
"id": "#bar",
|
|
"description": "nested"
|
|
},
|
|
"alsonested": {
|
|
"id": "t/inner.json#a",
|
|
"description": "alsonested"
|
|
}
|
|
},
|
|
"schema3": {
|
|
"id": "some://where.else/completely#",
|
|
"description": "schema3"
|
|
}
|
|
};
|
|
|
|
|
|
describe('resolve', function () {
|
|
var ajv;
|
|
|
|
beforeEach(function() {
|
|
ajv = Ajv();
|
|
});
|
|
|
|
describe('resolve.ids method', function() {
|
|
it('should resolve ids in schema', function() {
|
|
var validate = ajv.compile(schema);
|
|
// console.log(ajv._refs);
|
|
});
|
|
|
|
|
|
it('should throw if the same id resolves to two different schemas', function() {
|
|
ajv.compile({
|
|
"id": "http://example.com/1.json",
|
|
"type": "integer"
|
|
});
|
|
should.throw(function() {
|
|
ajv.compile({
|
|
"additionalProperties": {
|
|
"id": "http://example.com/1.json",
|
|
"type": "string"
|
|
}
|
|
});
|
|
});
|
|
|
|
should.throw(function() {
|
|
ajv.compile({
|
|
"items": {
|
|
"id": "#int",
|
|
"type": "integer"
|
|
},
|
|
"additionalProperties": {
|
|
"id": "#int",
|
|
"type": "string"
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
describe('missing schema error', function() {
|
|
it('should contain missingRef and missingSchema', function (done) {
|
|
testMissingSchemaError({
|
|
baseId: 'http://example.com/1.json',
|
|
ref: 'http://another.com/int.json',
|
|
expectedMissingRef: 'http://another.com/int.json',
|
|
expectedMissingSchema: 'http://another.com/int.json'
|
|
}, done);
|
|
});
|
|
|
|
it('should resolve missingRef and missingSchema relative to base id', function (done) {
|
|
testMissingSchemaError({
|
|
baseId: 'http://example.com/folder/1.json',
|
|
ref: 'int.json',
|
|
expectedMissingRef: 'http://example.com/folder/int.json',
|
|
expectedMissingSchema: 'http://example.com/folder/int.json'
|
|
}, done);
|
|
});
|
|
|
|
it('should resolve missingRef and missingSchema relative to base id from root', function (done) {
|
|
testMissingSchemaError({
|
|
baseId: 'http://example.com/folder/1.json',
|
|
ref: '/int.json',
|
|
expectedMissingRef: 'http://example.com/int.json',
|
|
expectedMissingSchema: 'http://example.com/int.json'
|
|
}, done);
|
|
});
|
|
|
|
it('missingRef should and missingSchema should NOT include JSON path (hash fragment)', function (done) {
|
|
testMissingSchemaError({
|
|
baseId: 'http://example.com/1.json',
|
|
ref: 'int.json#/definitions/positive',
|
|
expectedMissingRef: 'http://example.com/int.json#/definitions/positive',
|
|
expectedMissingSchema: 'http://example.com/int.json'
|
|
}, done);
|
|
});
|
|
|
|
|
|
function testMissingSchemaError(opts, done) {
|
|
try {
|
|
ajv.compile({
|
|
"id": opts.baseId,
|
|
"properties": { "a": { "$ref": opts.ref } }
|
|
});
|
|
} catch(e) {
|
|
e.missingRef .should.equal(opts.expectedMissingRef);
|
|
e.missingSchema .should.equal(opts.expectedMissingSchema);
|
|
done();
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
describe('inline referenced schemas without refs in them', function() {
|
|
var schemas = [
|
|
{ id: 'http://e.com/obj.json#',
|
|
properties: { a: { $ref: 'int.json#' } } },
|
|
{ id: 'http://e.com/int.json#',
|
|
type: 'integer', minimum: 2, maximum: 4 },
|
|
{ id: 'http://e.com/obj1.json#',
|
|
definitions: { int: { type: 'integer', minimum: 2, maximum: 4 } },
|
|
properties: { a: { $ref: '#/definitions/int' } } },
|
|
{ id: 'http://e.com/list.json#',
|
|
items: { $ref: 'obj.json#' } }
|
|
];
|
|
|
|
it('by default should inline schema if it doesn\'t contain refs', function() {
|
|
var ajv = Ajv({ schemas: schemas });
|
|
testSchemas(ajv, true);
|
|
});
|
|
|
|
|
|
it('should NOT inline schema if option inlineRefs == false', function() {
|
|
var ajv = Ajv({ schemas: schemas, inlineRefs: false });
|
|
testSchemas(ajv, false);
|
|
});
|
|
|
|
|
|
it('should inline schema if option inlineRefs is bigger than number of keys in referenced schema', function() {
|
|
var ajv = Ajv({ schemas: schemas, inlineRefs: 3 });
|
|
testSchemas(ajv, true);
|
|
});
|
|
|
|
|
|
it('should NOT inline schema if option inlineRefs is less than number of keys in referenced schema', function() {
|
|
var ajv = Ajv({ schemas: schemas, inlineRefs: 2 });
|
|
testSchemas(ajv, false);
|
|
});
|
|
|
|
|
|
function testSchemas(ajv, expectedInlined) {
|
|
var v1 = ajv.getSchema('http://e.com/obj.json')
|
|
, v2 = ajv.getSchema('http://e.com/obj1.json')
|
|
, vl = ajv.getSchema('http://e.com/list.json');
|
|
testObjSchema(v1);
|
|
testObjSchema(v2);
|
|
testListSchema(vl);
|
|
testInlined(v1, expectedInlined);
|
|
testInlined(v2, expectedInlined);
|
|
testInlined(vl, false);
|
|
}
|
|
|
|
function testObjSchema(validate) {
|
|
validate({a:3}) .should.equal(true);
|
|
validate({a:1}) .should.equal(false);
|
|
validate({a:5}) .should.equal(false);
|
|
}
|
|
|
|
function testListSchema(validate) {
|
|
validate([{a:3}]) .should.equal(true);
|
|
validate([{a:1}]) .should.equal(false);
|
|
validate([{a:5}]) .should.equal(false);
|
|
}
|
|
|
|
function testInlined(validate, expectedInlined) {
|
|
var inlined = !(/refVal/.test(validate.toString()));
|
|
inlined .should.equal(expectedInlined);
|
|
}
|
|
});
|
|
});
|