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} +                ] +            ]          }      ]; |