diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2020-11-30 18:56:28 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-30 18:56:28 -0500 |
commit | ae9a20e0de61bbb84ec359004a401d9f2705aeea (patch) | |
tree | c9c3b292f907e324e19f21ca8f01131f2aebee8a | |
parent | ff6ebdab88c9f9459e633ed0dbf6134b6d3add70 (diff) |
Json schema improvements (#1078)
* Test multipleOf
* Refactor defaulting
* Use default if invalid for non-object/array properties
* Add tests
-rw-r--r-- | ext/bg/js/json-schema.js | 37 | ||||
-rw-r--r-- | test/test-schema.js | 86 |
2 files changed, 108 insertions, 15 deletions
diff --git a/ext/bg/js/json-schema.js b/ext/bg/js/json-schema.js index ea1531ab..ca5ecd9b 100644 --- a/ext/bg/js/json-schema.js +++ b/ext/bg/js/json-schema.js @@ -594,23 +594,22 @@ class JsonSchemaValidator { return null; } - _getValidValueOrDefault(schema, value, info) { - let type = this._getValueType(value); + _getDefaultSchemaValue(schema) { const schemaType = schema.type; - if (typeof value === 'undefined' || !this._isValueTypeAny(value, type, schemaType)) { - let assignDefault = true; - - const schemaDefault = schema.default; - if (typeof schemaDefault !== 'undefined') { - value = clone(schemaDefault); - type = this._getValueType(value); - assignDefault = !this._isValueTypeAny(value, type, schemaType); - } + const schemaDefault = schema.default; + return ( + typeof schemaDefault !== 'undefined' && + this._isValueTypeAny(schemaDefault, this._getValueType(schemaDefault), schemaType) ? + clone(schemaDefault) : + this._getDefaultTypeValue(schemaType) + ); + } - if (assignDefault) { - value = this._getDefaultTypeValue(schemaType); - type = this._getValueType(value); - } + _getValidValueOrDefault(schema, value, info) { + let type = this._getValueType(value); + if (typeof value === 'undefined' || !this._isValueTypeAny(value, type, schema.type)) { + value = this._getDefaultSchemaValue(schema); + type = this._getValueType(value); } switch (type) { @@ -620,6 +619,14 @@ class JsonSchemaValidator { case 'array': value = this._populateArrayDefaults(value, schema, info); break; + default: + if (!this.isValid(value, schema)) { + const schemaDefault = this._getDefaultSchemaValue(schema); + if (this.isValid(schemaDefault, schema)) { + value = schemaDefault; + } + } + break; } return value; diff --git a/test/test-schema.js b/test/test-schema.js index 34dd857a..0141f1ce 100644 --- a/test/test-schema.js +++ b/test/test-schema.js @@ -358,6 +358,19 @@ function testValidate2() { {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 { @@ -595,6 +608,79 @@ function testGetValidValueOrDefault1() { {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} + ] + ] } ]; |