Spaces:
Sleeping
Sleeping
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"); | |