tests.js (3289B)
1 var assert = require('assert'); 2 var vows = require('vows'); 3 var path = require('path'); 4 var fs = require('fs'); 5 6 var validate = require('../lib/validate').validate; 7 8 9 var revision = 'draft-03'; 10 var schemaRoot = path.join(__dirname, '..', revision); 11 var schemaNames = ['schema', 'hyper-schema', 'links', 'json-ref' ]; 12 var schemas = {}; 13 14 schemaNames.forEach(function(name) { 15 var file = path.join(schemaRoot, name); 16 schemas[name] = loadSchema(file); 17 }); 18 19 schemaNames.forEach(function(name) { 20 var s, n = name+'-nsd', f = path.join(schemaRoot, name); 21 schemas[n] = loadSchema(f); 22 s = schemas[n]; 23 delete s['$schema']; 24 }); 25 26 function loadSchema(path) { 27 var data = fs.readFileSync(path, 'utf-8'); 28 var schema = JSON.parse(data); 29 return schema; 30 } 31 32 function resultIsValid() { 33 return function(result) { 34 assert.isObject(result); 35 //assert.isBoolean(result.valid); 36 assert.equal(typeof(result.valid), 'boolean'); 37 assert.isArray(result.errors); 38 for (var i = 0; i < result.errors.length; i++) { 39 assert.notEqual(result.errors[i], null, 'errors['+i+'] is null'); 40 } 41 } 42 } 43 44 function assertValidates(doc, schema) { 45 var context = {}; 46 47 context[': validate('+doc+', '+schema+')'] = { 48 topic: validate(schemas[doc], schemas[schema]), 49 'returns valid result': resultIsValid(), 50 'with valid=true': function(result) { assert.equal(result.valid, true); }, 51 'and no errors': function(result) { 52 // XXX work-around for bug in vows: [null] chokes it 53 if (result.errors[0] == null) assert.fail('(errors contains null)'); 54 assert.length(result.errors, 0); 55 } 56 }; 57 58 return context; 59 } 60 61 function assertSelfValidates(doc) { 62 var context = {}; 63 64 context[': validate('+doc+')'] = { 65 topic: validate(schemas[doc]), 66 'returns valid result': resultIsValid(), 67 'with valid=true': function(result) { assert.equal(result.valid, true); }, 68 'and no errors': function(result) { assert.length(result.errors, 0); } 69 }; 70 71 return context; 72 } 73 74 var suite = vows.describe('JSON Schema').addBatch({ 75 'Core-NSD self-validates': assertSelfValidates('schema-nsd'), 76 'Core-NSD/Core-NSD': assertValidates('schema-nsd', 'schema-nsd'), 77 'Core-NSD/Core': assertValidates('schema-nsd', 'schema'), 78 79 'Core self-validates': assertSelfValidates('schema'), 80 'Core/Core': assertValidates('schema', 'schema'), 81 82 'Hyper-NSD self-validates': assertSelfValidates('hyper-schema-nsd'), 83 'Hyper self-validates': assertSelfValidates('hyper-schema'), 84 'Hyper/Hyper': assertValidates('hyper-schema', 'hyper-schema'), 85 'Hyper/Core': assertValidates('hyper-schema', 'schema'), 86 87 'Links-NSD self-validates': assertSelfValidates('links-nsd'), 88 'Links self-validates': assertSelfValidates('links'), 89 'Links/Hyper': assertValidates('links', 'hyper-schema'), 90 'Links/Core': assertValidates('links', 'schema'), 91 92 'Json-Ref self-validates': assertSelfValidates('json-ref'), 93 'Json-Ref/Hyper': assertValidates('json-ref', 'hyper-schema'), 94 'Json-Ref/Core': assertValidates('json-ref', 'schema') 95 }).export(module);