Created
June 12, 2015 08:48
-
-
Save tmarcus87/cdf219ea723120213f08 to your computer and use it in GitHub Desktop.
JsonSchemaValidatorを色々試してみるテスト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var _ = require('lodash'), | |
fs = require('fs'), | |
path = require('path'), | |
async = require('async'), | |
request = require('request'), | |
BaseError = require('src/error/base'), | |
SystemError = require('src/error/system'), | |
InvalidParamError = require('src/error/invalidparam') | |
JsonReader = require('src/util/json_reader'); | |
var LOGGER = require('log4js').getLogger(); | |
var keywordMap = { | |
} | |
var convertError = function (options) { | |
return function (error) { | |
error = error || {}; | |
var dataPath = error.dataPath; | |
var errorKeyword = error.keyword; | |
var message = error.message; | |
}; | |
}; | |
var validators = { | |
ajv: function (schema, json, callback) { | |
var AJV = require('ajv'), | |
ajv = new AJV({ allErrors: true }); | |
if (ajv.validate(schema, json)) { | |
return callback(null); | |
} | |
callback(new InvalidParamError(null, ajv.errors)); | |
// [2015-06-12 16:38:33.971] [DEBUG] [default] - --- all fields is not found --- | |
// [2015-06-12 16:38:33.971] [TRACE] [default] - JSON = {} | |
// [2015-06-12 16:38:33.971] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 16:38:33.989] [WARN] [default] - ERRORS = [ | |
// { | |
// "keyword": "required", | |
// "dataPath": "", | |
// "message": "properties id, name, date, nested are required" | |
// } | |
// ] | |
// ✓ testNoPropertyError | |
// [2015-06-12 16:38:33.990] [DEBUG] [default] - --- all fields in nested is not found. | |
// [2015-06-12 16:38:33.991] [TRACE] [default] - JSON = {"id":123,"name":"this is name.","date":"2015-06-01T09:00:00Z","nested":{}} | |
// [2015-06-12 16:38:33.991] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 16:38:34.012] [WARN] [default] - ERRORS = [ | |
// { | |
// "keyword": "required", | |
// "dataPath": ".nested", | |
// "message": "properties id, name, date are required" | |
// } | |
// ] | |
// ✓ testNoNestedPropertyError (41ms) | |
// [2015-06-12 16:38:34.032] [TRACE] [default] - JSON = {"id":123,"name":"","date":"2015-06-01T09:00:00Z","nested":{"id":123,"name":"","date":"2015-06-01T09:00:00Z"}} | |
// [2015-06-12 16:38:34.032] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 16:38:34.043] [WARN] [default] - ERRORS = [ | |
// { | |
// "keyword": "minLength", | |
// "dataPath": ".name", | |
// "message": "should NOT be shorter than 1 characters" | |
// }, | |
// { | |
// "keyword": "minLength", | |
// "dataPath": ".nested.name", | |
// "message": "should NOT be shorter than 1 characters" | |
// } | |
// ] | |
}, | |
skeemas: function (schema, json, callback) { | |
var skeemas = require('skeemas'); | |
var result = skeemas.validate(json, schema); | |
if (result.valid) { | |
return callback(null); | |
} | |
callback(new InvalidParamError(null, result.errors)); | |
// [2015-06-12 16:38:47.585] [DEBUG] [default] - --- all fields is not found --- | |
// [2015-06-12 16:38:47.585] [TRACE] [default] - JSON = {} | |
// [2015-06-12 16:38:47.585] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 16:38:47.587] [WARN] [default] - ERRORS = [ | |
// { | |
// "message": "Missing required property \"nested\"", | |
// "context": "#", | |
// "value": {}, | |
// "criteria": "nested" | |
// }, | |
// { | |
// "message": "Missing required property \"date\"", | |
// "context": "#", | |
// "value": {}, | |
// "criteria": "date" | |
// }, | |
// { | |
// "message": "Missing required property \"name\"", | |
// "context": "#", | |
// "value": {}, | |
// "criteria": "name" | |
// }, | |
// { | |
// "message": "Missing required property \"id\"", | |
// "context": "#", | |
// "value": {}, | |
// "criteria": "id" | |
// } | |
// ] | |
// ✓ testNoPropertyError (47ms) | |
// [2015-06-12 16:38:47.634] [DEBUG] [default] - --- all fields in nested is not found. | |
// [2015-06-12 16:38:47.634] [TRACE] [default] - JSON = {"id":123,"name":"this is name.","date":"2015-06-01T09:00:00Z","nested":{}} | |
// [2015-06-12 16:38:47.634] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 16:38:47.635] [WARN] [default] - ERRORS = [ | |
// { | |
// "message": "Missing required property \"date\"", | |
// "context": "#/nested", | |
// "value": {}, | |
// "criteria": "date" | |
// }, | |
// { | |
// "message": "Missing required property \"name\"", | |
// "context": "#/nested", | |
// "value": {}, | |
// "criteria": "name" | |
// }, | |
// { | |
// "message": "Missing required property \"id\"", | |
// "context": "#/nested", | |
// "value": {}, | |
// "criteria": "id" | |
// } | |
// ] | |
// ✓ testNoNestedPropertyError | |
// [2015-06-12 16:38:47.636] [TRACE] [default] - JSON = {"id":123,"name":"","date":"2015-06-01T09:00:00Z","nested":{"id":123,"name":"","date":"2015-06-01T09:00:00Z"}} | |
// [2015-06-12 16:38:47.636] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 16:38:47.636] [WARN] [default] - ERRORS = [ | |
// { | |
// "message": "Failed \"minLength\" criteria", | |
// "context": "#/name", | |
// "value": "", | |
// "criteria": { | |
// "type": "string", | |
// "minLength": 1 | |
// } | |
// }, | |
// { | |
// "message": "Failed \"minLength\" criteria", | |
// "context": "#/nested/name", | |
// "value": "", | |
// "criteria": { | |
// "type": "string", | |
// "minLength": 1 | |
// } | |
// } | |
// ] | |
}, | |
jsonschema: function (schema, json, callback) { | |
var Validator = require('jsonschema').Validator; | |
v = new Validator(); | |
var result = v.validate(json, schema); | |
if (result.valid) { | |
return callback(null); | |
} | |
callback(new InvalidParamError(null, | |
_.map(result.errors, function (v) { return { | |
property: v.property, | |
message: v.message, | |
stack: v.stack | |
}}))); | |
// [2015-06-12 17:00:40.592] [DEBUG] [default] - --- all fields is not found --- | |
// [2015-06-12 17:00:40.592] [TRACE] [default] - JSON = {} | |
// [2015-06-12 17:00:40.592] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 17:00:40.616] [WARN] [default] - ERRORS = [ | |
// { | |
// "property": "instance", | |
// "message": "requires property \"id\"", | |
// "stack": "instance requires property \"id\"" | |
// }, | |
// { | |
// "property": "instance", | |
// "message": "requires property \"name\"", | |
// "stack": "instance requires property \"name\"" | |
// }, | |
// { | |
// "property": "instance", | |
// "message": "requires property \"date\"", | |
// "stack": "instance requires property \"date\"" | |
// }, | |
// { | |
// "property": "instance", | |
// "message": "requires property \"nested\"", | |
// "stack": "instance requires property \"nested\"" | |
// } | |
// ] | |
// ✓ testNoPropertyError | |
// [2015-06-12 17:00:40.617] [DEBUG] [default] - --- all fields in nested is not found. | |
// [2015-06-12 17:00:40.617] [TRACE] [default] - JSON = {"id":123,"name":"this is name.","date":"2015-06-01T09:00:00Z","nested":{}} | |
// [2015-06-12 17:00:40.618] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 17:00:40.619] [WARN] [default] - ERRORS = [ | |
// { | |
// "property": "instance.nested", | |
// "message": "requires property \"id\"", | |
// "stack": "instance.nested requires property \"id\"" | |
// }, | |
// { | |
// "property": "instance.nested", | |
// "message": "requires property \"name\"", | |
// "stack": "instance.nested requires property \"name\"" | |
// }, | |
// { | |
// "property": "instance.nested", | |
// "message": "requires property \"date\"", | |
// "stack": "instance.nested requires property \"date\"" | |
// } | |
// ] | |
// ✓ testNoNestedPropertyError | |
// [2015-06-12 17:00:40.620] [TRACE] [default] - JSON = {"id":123,"name":"","date":"2015-06-01T09:00:00Z","nested":{"id":123,"name":"","date":"2015-06-01T09:00:00Z"}} | |
// [2015-06-12 17:00:40.620] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 17:00:40.622] [WARN] [default] - ERRORS = [ | |
// { | |
// "property": "instance.name", | |
// "message": "does not meet minimum length of 1", | |
// "stack": "instance.name does not meet minimum length of 1" | |
// }, | |
// { | |
// "property": "instance.nested.name", | |
// "message": "does not meet minimum length of 1", | |
// "stack": "instance.nested.name does not meet minimum length of 1" | |
// } | |
// ] | |
}, | |
zschema: function (schema, json, callback) { | |
var ZSchema = require('z-schema'), | |
validator = new ZSchema(); | |
if (validator.validate(json, schema)) { | |
return callback(null); | |
} | |
callback(new InvalidParamError(null, validator.getLastErrors())); | |
// [2015-06-12 17:14:01.381] [DEBUG] [default] - --- all fields is not found --- | |
// [2015-06-12 17:14:01.381] [TRACE] [default] - JSON = {} | |
// [2015-06-12 17:14:01.381] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 17:14:01.383] [WARN] [default] - ERRORS = [ | |
// { | |
// "code": "OBJECT_MISSING_REQUIRED_PROPERTY", | |
// "params": [ | |
// "nested" | |
// ], | |
// "message": "Missing required property: nested", | |
// "path": "#/" | |
// }, | |
// { | |
// "code": "OBJECT_MISSING_REQUIRED_PROPERTY", | |
// "params": [ | |
// "date" | |
// ], | |
// "message": "Missing required property: date", | |
// "path": "#/" | |
// }, | |
// { | |
// "code": "OBJECT_MISSING_REQUIRED_PROPERTY", | |
// "params": [ | |
// "name" | |
// ], | |
// "message": "Missing required property: name", | |
// "path": "#/" | |
// }, | |
// { | |
// "code": "OBJECT_MISSING_REQUIRED_PROPERTY", | |
// "params": [ | |
// "id" | |
// ], | |
// "message": "Missing required property: id", | |
// "path": "#/" | |
// } | |
// ] | |
// ✓ testNoPropertyError | |
// [2015-06-12 17:14:01.383] [DEBUG] [default] - --- all fields in nested is not found. | |
// [2015-06-12 17:14:01.383] [TRACE] [default] - JSON = {"id":123,"name":"this is name.","date":"2015-06-01T09:00:00Z","nested":{}} | |
// [2015-06-12 17:14:01.384] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 17:14:01.384] [WARN] [default] - ERRORS = [ | |
// { | |
// "code": "OBJECT_MISSING_REQUIRED_PROPERTY", | |
// "params": [ | |
// "date" | |
// ], | |
// "message": "Missing required property: date", | |
// "path": "#/nested" | |
// }, | |
// { | |
// "code": "OBJECT_MISSING_REQUIRED_PROPERTY", | |
// "params": [ | |
// "name" | |
// ], | |
// "message": "Missing required property: name", | |
// "path": "#/nested" | |
// }, | |
// { | |
// "code": "OBJECT_MISSING_REQUIRED_PROPERTY", | |
// "params": [ | |
// "id" | |
// ], | |
// "message": "Missing required property: id", | |
// "path": "#/nested" | |
// } | |
// ] | |
// ✓ testNoNestedPropertyError | |
// [2015-06-12 17:14:01.385] [TRACE] [default] - JSON = {"id":123,"name":"","date":"2015-06-01T09:00:00Z","nested":{"id":123,"name":"","date":"2015-06-01T09:00:00Z"}} | |
// [2015-06-12 17:14:01.385] [TRACE] [default] - SCHEMA = {"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"},"nested":{"properties":{"id":{"type":"number"},"name":{"type":"string","minLength":1},"date":{"type":"string","format":"date-time"}},"required":["id","name","date"]}},"required":["id","name","date","nested"]} | |
// [2015-06-12 17:14:01.386] [WARN] [default] - ERRORS = [ | |
// { | |
// "code": "MIN_LENGTH", | |
// "params": [ | |
// 0, | |
// 1 | |
// ], | |
// "message": "String is too short (0 chars), minimum 1", | |
// "path": "#/nested/name" | |
// }, | |
// { | |
// "code": "MIN_LENGTH", | |
// "params": [ | |
// 0, | |
// 1 | |
// ], | |
// "message": "String is too short (0 chars), minimum 1", | |
// "path": "#/name" | |
// } | |
// ] | |
}, | |
jjv: function (schema, json, callback) { | |
var jjv = require('jjv'); | |
var errors = jjv(json, schema); | |
if (!errors) { | |
return callback(null); | |
} | |
callback(new InvalidParamError(null, errors)); | |
} | |
}; | |
var MODULE_NAME = 'jjv'; | |
module.exports = { | |
validate: function (schema, json, options, callback) { | |
if (arguments.length < 3) { | |
throw new SystemError(); | |
} else if (arguments.length == 3) { | |
callback = options; | |
options = {}; | |
} | |
async.waterfall( | |
[ | |
// Stringが指定された場合はリソースを取得して、それ以外はJSONSchemaとして利用する | |
function getSchema(next) { | |
if (_.isString(schema)) { | |
if (String(schema).match(/^https?\:\/\//)) { | |
// SchemaにURLが指定された場合 | |
request({ uri: schema, json: true }, function (e, r, b) { | |
if (e) { | |
return next(e); | |
} | |
if (r.statusCode >= 400) { | |
return next( | |
new BaseError( | |
'JsonSchemaの取得中にエラーが発生しました', | |
r.statusCode, | |
b)); | |
} | |
return next(null, b); | |
}); | |
} else { | |
// ファイルパスとして利用する | |
return JsonReader.open(path.join(__rootdir, schema), {}, next); | |
} | |
} else { | |
return next(null, schema); | |
} | |
} | |
], | |
function (err, jsonSchema) { | |
if (err) { | |
return callback(err); | |
} | |
LOGGER.trace("JSON = %s", JSON.stringify(json)); | |
LOGGER.trace("SCHEMA = %s", JSON.stringify(jsonSchema)); | |
validators[MODULE_NAME](jsonSchema, json, function (err) { | |
if (err) { | |
LOGGER.warn("ERRORS = %s", JSON.stringify(err.data, null, 2)); | |
} | |
callback(err); | |
}); | |
}); | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment