Json schema improvements (#1078)
* Test multipleOf * Refactor defaulting * Use default if invalid for non-object/array properties * Add tests
This commit is contained in:
parent
ff6ebdab88
commit
ae9a20e0de
@ -594,23 +594,22 @@ class JsonSchemaValidator {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_getDefaultSchemaValue(schema) {
|
||||||
|
const schemaType = schema.type;
|
||||||
|
const schemaDefault = schema.default;
|
||||||
|
return (
|
||||||
|
typeof schemaDefault !== 'undefined' &&
|
||||||
|
this._isValueTypeAny(schemaDefault, this._getValueType(schemaDefault), schemaType) ?
|
||||||
|
clone(schemaDefault) :
|
||||||
|
this._getDefaultTypeValue(schemaType)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
_getValidValueOrDefault(schema, value, info) {
|
_getValidValueOrDefault(schema, value, info) {
|
||||||
let type = this._getValueType(value);
|
let type = this._getValueType(value);
|
||||||
const schemaType = schema.type;
|
if (typeof value === 'undefined' || !this._isValueTypeAny(value, type, schema.type)) {
|
||||||
if (typeof value === 'undefined' || !this._isValueTypeAny(value, type, schemaType)) {
|
value = this._getDefaultSchemaValue(schema);
|
||||||
let assignDefault = true;
|
type = this._getValueType(value);
|
||||||
|
|
||||||
const schemaDefault = schema.default;
|
|
||||||
if (typeof schemaDefault !== 'undefined') {
|
|
||||||
value = clone(schemaDefault);
|
|
||||||
type = this._getValueType(value);
|
|
||||||
assignDefault = !this._isValueTypeAny(value, type, schemaType);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (assignDefault) {
|
|
||||||
value = this._getDefaultTypeValue(schemaType);
|
|
||||||
type = this._getValueType(value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@ -620,6 +619,14 @@ class JsonSchemaValidator {
|
|||||||
case 'array':
|
case 'array':
|
||||||
value = this._populateArrayDefaults(value, schema, info);
|
value = this._populateArrayDefaults(value, schema, info);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
if (!this.isValid(value, schema)) {
|
||||||
|
const schemaDefault = this._getDefaultSchemaValue(schema);
|
||||||
|
if (this.isValid(schemaDefault, schema)) {
|
||||||
|
value = schemaDefault;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
|
@ -358,6 +358,19 @@ function testValidate2() {
|
|||||||
{expected: false, value: 1}
|
{expected: false, value: 1}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
schema: {
|
||||||
|
type: 'integer',
|
||||||
|
multipleOf: 2
|
||||||
|
},
|
||||||
|
inputs: [
|
||||||
|
{expected: true, value: -2},
|
||||||
|
{expected: false, value: -1},
|
||||||
|
{expected: true, value: 0},
|
||||||
|
{expected: false, value: 1},
|
||||||
|
{expected: true, value: 2}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
// Numeric type tests
|
// Numeric type tests
|
||||||
{
|
{
|
||||||
@ -595,6 +608,79 @@ function testGetValidValueOrDefault1() {
|
|||||||
{toString: 'default'}
|
{toString: 'default'}
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
// Test enum
|
||||||
|
{
|
||||||
|
schema: {
|
||||||
|
type: 'object',
|
||||||
|
required: ['test'],
|
||||||
|
properties: {
|
||||||
|
test: {
|
||||||
|
type: 'string',
|
||||||
|
default: 'value1',
|
||||||
|
enum: ['value1', 'value2', 'value3']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
inputs: [
|
||||||
|
[
|
||||||
|
{test: 'value1'},
|
||||||
|
{test: 'value1'}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{test: 'value2'},
|
||||||
|
{test: 'value2'}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{test: 'value3'},
|
||||||
|
{test: 'value3'}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{test: 'value4'},
|
||||||
|
{test: 'value1'}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
// Test valid vs invalid default
|
||||||
|
{
|
||||||
|
schema: {
|
||||||
|
type: 'object',
|
||||||
|
required: ['test'],
|
||||||
|
properties: {
|
||||||
|
test: {
|
||||||
|
type: 'integer',
|
||||||
|
default: 2,
|
||||||
|
minimum: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
inputs: [
|
||||||
|
[
|
||||||
|
{test: -1},
|
||||||
|
{test: 2}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
schema: {
|
||||||
|
type: 'object',
|
||||||
|
required: ['test'],
|
||||||
|
properties: {
|
||||||
|
test: {
|
||||||
|
type: 'integer',
|
||||||
|
default: 1,
|
||||||
|
minimum: 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
inputs: [
|
||||||
|
[
|
||||||
|
{test: -1},
|
||||||
|
{test: -1}
|
||||||
|
]
|
||||||
|
]
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user