Skip to content

Instantly share code, notes, and snippets.

@tmarcus87
Created June 12, 2015 08:48
Show Gist options
  • Save tmarcus87/cdf219ea723120213f08 to your computer and use it in GitHub Desktop.
Save tmarcus87/cdf219ea723120213f08 to your computer and use it in GitHub Desktop.
JsonSchemaValidatorを色々試してみるテスト
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