travel/admin/node_modules/JSV/tests/tests3b.js

212 lines
8.8 KiB
JavaScript

var env;
//calls ok(true) if no error is thrown
function okNoError(func, msg) {
try {
func();
ok(true, msg);
} catch (e) {
ok(false, msg + ': ' + e);
}
}
function setupEnv () {
env = env || require('../lib/jsv').JSV.createEnvironment("json-schema-draft-03");
// AddressBook example from http://relaxng.org/compact-tutorial-20030326.html
env.createSchema({
"type": "object",
"id": "http://example.com/addressbook.json",
"description": "AddressBook example from http://relaxng.org/compact-tutorial-20030326.html",
"properties": {
"cards": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 2,
"maxItems": 2,
"$schema":"http://json-schema.org/draft-03/schema#"
},
"required": true
}
},
"$schema":"http://json-schema.org/draft-03/schema#"
},
undefined,
"http://example.com/addressbook.json");
// The referral target schema, with a canonical id.
env.createSchema({
"type": "array",
"id": "http://example.com/subdir/card.json",
"description": "Referral target",
"items": {
"type": "string"
},
"minItems": 2,
"maxItems": 2,
"$schema":"http://json-schema.org/draft-03/schema#"
},
undefined,
"http://example.com/subdir/card.json");
// Similar example, using $ref to factor part of the schema.
env.createSchema({
"type": "object",
"id": "http://example.com/addressbook_ref.json",
"description": "Similar example, using $ref to factor part of the schema.",
"properties": {
"cards": {
"type": "array",
"items": {
"$ref": "./subdir/card.json"
},
"required": true
}
},
"$schema":"http://json-schema.org/draft-03/schema#"
},
undefined,
"http://example.com/addressbook_ref.json");
// Similar example, using extends to factor part of the schema.
env.createSchema({
"type": "object",
"id": "http://example.com/addressbook_extends.json",
"description": "Similar example, using extends to factor part of the schema.",
"properties": {
"cards": {
"type": "array",
"items": {
"extends": {
"$ref": "./subdir/card.json"
}
},
"required": true
}
},
"$schema":"http://json-schema.org/draft-03/schema#"
},
undefined,
"http://example.com/addressbook_extends.json");
}
//
//
// Tests
//
//
module("Reference Tests");
test("Self Identifying Schemas", function () {
setupEnv();
// While createSchema takes a URI argument, for V3 schemas the validator should be able
// to use the canonical id field to find it, if it has been registered.
// http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.27
env.createSchema({ "id": "http://example.com/foo.json",
"$schema":"http://json-schema.org/draft-03/schema#"
});
ok(env.findSchema("http://example.com/foo.json"), "found schema by id");
});
test("Forward Referral", function () {
setupEnv();
// A schema with a reference in it should be accepted, even if the destination schema
// hasn't been registered yet.
okNoError(function () {
env.createSchema({
"type": "object",
"id": "http://example.com/addressbook.json",
"properties": {
"cards": {
"type": "array",
"items": {
"$ref": "http://example.com/subdir/card.json"
},
"required": true
}
},
"$schema":"http://json-schema.org/draft-03/schema#"
});
}, "Can make schema with forward reference");
});
test("Validate Schema", function () {
setupEnv();
var jsonschema = env.findSchema(env.getOption("latestJSONSchemaSchemaURI"));
var explicit_schema = env.findSchema("http://example.com/addressbook.json");
var referring_schema = env.findSchema("http://example.com/addressbook_ref.json");
var card_schema = env.findSchema("http://example.com/subdir/card.json");
ok(explicit_schema, "explicit addressbook schema");
ok(referring_schema, "referring addressbook schema");
ok(card_schema, "card schema");
equal(jsonschema.validate(explicit_schema).errors.length, 0, 'valid explicit schema');
equal(jsonschema.validate(referring_schema).errors.length, 0, 'valid referring schema');
equal(jsonschema.validate(card_schema).errors.length, 0, 'valid referral target schema');
});
test("Simple Referral", function () {
setupEnv();
var schema = { "$ref": "http://example.com/subdir/card.json" };
notEqual(env.validate({}, schema).errors.length, 0, "card must be array");
notEqual(env.validate([], schema).errors.length, 0, "card must have fields");
notEqual(env.validate(["foo"], schema).errors.length, 0, "card must have two fields");
notEqual(env.validate(["foo", {}], schema).errors.length, 0, "both fields must be string");
notEqual(env.validate(["foo", "bar", "baz"], schema).errors.length, 0, "card maxItems 2");
equal(env.validate(["foo", "bar"], schema).errors.length, 0, "card maxItems 2");
});
function validateAddressbook (test_name, schema_uri) {
var schema = { "$ref": schema_uri };
test(test_name, function () {
setupEnv();
notEqual(env.validate('', schema).errors.length, 0, "addressbook is object");
notEqual(env.validate({}, schema).errors.length, 0, "cards required");
notEqual(env.validate({ "cards": {}}, schema).errors.length, 0, "cards must be array");
equal(env.validate({ "cards": []}, schema).errors.length, 0, "empty array ok");
notEqual(env.validate({ "cards": [ {} ] }, schema).errors.length, 0,
"cards schema is enforced on items");
notEqual(env.validate({ "cards": [['foo']]}, schema).errors.length, 0,
"each card must have length 2");
notEqual(env.validate({ "cards": [ ['foo', 'bar' ], ["foo" ] ] }, schema).errors.length, 0,
"second card is bad");
equal(env.validate({ "cards": [ ["foo", "bar" ] ] }, schema).errors.length, 0,
"good addressbook with one card");
equal(env.validate({ "cards": [ ["foo", "bar" ], ["bar", "foo" ] ] }, schema).errors.length, 0,
"good addressbook with two cards");
});
}
validateAddressbook("Explicit Schema", "http://example.com/addressbook.json");
validateAddressbook("Referring Schema", "http://example.com/addressbook_ref.json");
validateAddressbook("Extends Schema", "http://example.com/addressbook_extends.json");