summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2020-11-30 18:56:28 -0500
committerGitHub <noreply@github.com>2020-11-30 18:56:28 -0500
commitae9a20e0de61bbb84ec359004a401d9f2705aeea (patch)
treec9c3b292f907e324e19f21ca8f01131f2aebee8a
parentff6ebdab88c9f9459e633ed0dbf6134b6d3add70 (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.js37
-rw-r--r--test/test-schema.js86
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}
+ ]
+ ]
}
];