Skip to content

Commit

Permalink
feat(draft2019-09): upgrading jsonschema to support draft2019-09
Browse files Browse the repository at this point in the history
  • Loading branch information
Arqu committed Apr 14, 2020
1 parent 1fbc1e0 commit f49ac6b
Show file tree
Hide file tree
Showing 73 changed files with 7,127 additions and 1 deletion.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
module github.com/qri-io/jsonschema

go 1.14

require (
github.com/qri-io/jsonpointer v0.1.0
github.com/sergi/go-diff v1.0.0
Expand Down
87 changes: 87 additions & 0 deletions schema_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,93 @@ func TestDraft7(t *testing.T) {
})
}

func TestDraft2019_09(t *testing.T) {
prev := DefaultSchemaPool
defer func() { DefaultSchemaPool = prev }()

path := "testdata/draft2019-09_schema.json"
data, err := ioutil.ReadFile(path)
if err != nil {
t.Errorf("error reading %s: %s", path, err.Error())
return
}

rsch := &RootSchema{}
if err := json.Unmarshal(data, rsch); err != nil {
t.Errorf("error unmarshaling schema: %s", err.Error())
return
}

DefaultSchemaPool["https://json-schema.org/draft/2019-09/schema#"] = &rsch.Schema

runJSONTests(t, []string{
"testdata/draft2019-09/additionalItems.json",
"testdata/draft2019-09/additionalProperties.json",
"testdata/draft2019-09/allOf.json",
"testdata/draft2019-09/anchor.json",
"testdata/draft2019-09/anyOf.json",
"testdata/draft2019-09/boolean_schema.json",
"testdata/draft2019-09/const.json",
"testdata/draft2019-09/contains.json",
"testdata/draft2019-09/default.json",
"testdata/draft2019-09/defs.json",
"testdata/draft2019-09/dependentRequired.json",
"testdata/draft2019-09/dependentSchemas.json",
"testdata/draft2019-09/enum.json",
"testdata/draft2019-09/exclusiveMaximum.json",
"testdata/draft2019-09/exclusiveMinimum.json",
"testdata/draft2019-09/format.json",
"testdata/draft2019-09/if-then-else.json",
"testdata/draft2019-09/items.json",
"testdata/draft2019-09/maxItems.json",
"testdata/draft2019-09/maxLength.json",
"testdata/draft2019-09/maxProperties.json",
"testdata/draft2019-09/maximum.json",
"testdata/draft2019-09/minItems.json",
"testdata/draft2019-09/minLength.json",
"testdata/draft2019-09/minProperties.json",
"testdata/draft2019-09/minimum.json",
"testdata/draft2019-09/multipleOf.json",
"testdata/draft2019-09/not.json",
"testdata/draft2019-09/oneOf.json",
"testdata/draft2019-09/pattern.json",
"testdata/draft2019-09/patternProperties.json",
"testdata/draft2019-09/properties.json",
"testdata/draft2019-09/propertyNames.json",
"testdata/draft2019-09/ref.json",
"testdata/draft2019-09/refRemote.json",
"testdata/draft2019-09/required.json",
"testdata/draft2019-09/type.json",
"testdata/draft2019-09/unevaluatedItems.json",
"testdata/draft2019-09/unevaluatedProperties.json",
"testdata/draft2019-09/uniqueItems.json",

"testdata/draft2019-09/optional/bignum.json",
"testdata/draft2019-09/optional/content.json",
"testdata/draft2019-09/optional/ecmascript-regex.json",
"testdata/draft2019-09/optional/refOfUnknownKeyword.json",
"testdata/draft2019-09/optional/zeroTerminatedFloats.json",

"testdata/draft2019-09/optional/format/date-time.json",
"testdata/draft2019-09/optional/format/date.json",
"testdata/draft2019-09/optional/format/email.json",
"testdata/draft2019-09/optional/format/hostname.json",
"testdata/draft2019-09/optional/format/idn-email.json",
"testdata/draft2019-09/optional/format/idn-hostname.json",
"testdata/draft2019-09/optional/format/ipv4.json",
"testdata/draft2019-09/optional/format/ipv6.json",
"testdata/draft2019-09/optional/format/iri-reference.json",
"testdata/draft2019-09/optional/format/iri.json",
"testdata/draft2019-09/optional/format/json-pointer.json",
"testdata/draft2019-09/optional/format/regex.json",
"testdata/draft2019-09/optional/format/relative-json-pointer.json",
"testdata/draft2019-09/optional/format/time.json",
"testdata/draft2019-09/optional/format/uri-reference.json",
"testdata/draft2019-09/optional/format/uri-template.json",
"testdata/draft2019-09/optional/format/uri.json",
})
}

// TestSet is a json-based set of tests
// JSON-Schema comes with a lovely JSON-based test suite:
// https://github.com/json-schema-org/JSON-Schema-Test-Suite
Expand Down
87 changes: 87 additions & 0 deletions testdata/draft2019-09/additionalItems.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
[
{
"description": "additionalItems as schema",
"schema": {
"items": [{}],
"additionalItems": {"type": "integer"}
},
"tests": [
{
"description": "additional items match schema",
"data": [ null, 2, 3, 4 ],
"valid": true
},
{
"description": "additional items do not match schema",
"data": [ null, 2, 3, "foo" ],
"valid": false
}
]
},
{
"description": "items is schema, no additionalItems",
"schema": {
"items": {},
"additionalItems": false
},
"tests": [
{
"description": "all items match schema",
"data": [ 1, 2, 3, 4, 5 ],
"valid": true
}
]
},
{
"description": "array of items with no additionalItems",
"schema": {
"items": [{}, {}, {}],
"additionalItems": false
},
"tests": [
{
"description": "fewer number of items present",
"data": [ 1, 2 ],
"valid": true
},
{
"description": "equal number of items present",
"data": [ 1, 2, 3 ],
"valid": true
},
{
"description": "additional items are not permitted",
"data": [ 1, 2, 3, 4 ],
"valid": false
}
]
},
{
"description": "additionalItems as false without items",
"schema": {"additionalItems": false},
"tests": [
{
"description":
"items defaults to empty schema so everything is valid",
"data": [ 1, 2, 3, 4, 5 ],
"valid": true
},
{
"description": "ignores non-arrays",
"data": {"foo" : "bar"},
"valid": true
}
]
},
{
"description": "additionalItems are allowed by default",
"schema": {"items": [{"type": "integer"}]},
"tests": [
{
"description": "only the first item is validated",
"data": [1, "foo", false],
"valid": true
}
]
}
]
133 changes: 133 additions & 0 deletions testdata/draft2019-09/additionalProperties.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
[
{
"description":
"additionalProperties being false does not allow other properties",
"schema": {
"properties": {"foo": {}, "bar": {}},
"patternProperties": { "^v": {} },
"additionalProperties": false
},
"tests": [
{
"description": "no additional properties is valid",
"data": {"foo": 1},
"valid": true
},
{
"description": "an additional property is invalid",
"data": {"foo" : 1, "bar" : 2, "quux" : "boom"},
"valid": false
},
{
"description": "ignores arrays",
"data": [1, 2, 3],
"valid": true
},
{
"description": "ignores strings",
"data": "foobarbaz",
"valid": true
},
{
"description": "ignores other non-objects",
"data": 12,
"valid": true
},
{
"description": "patternProperties are not additional properties",
"data": {"foo":1, "vroom": 2},
"valid": true
}
]
},
{
"description": "non-ASCII pattern with additionalProperties",
"schema": {
"patternProperties": {"^á": {}},
"additionalProperties": false
},
"tests": [
{
"description": "matching the pattern is valid",
"data": {"ármányos": 2},
"valid": true
},
{
"description": "not matching the pattern is invalid",
"data": {"élmény": 2},
"valid": false
}
]
},
{
"description":
"additionalProperties allows a schema which should validate",
"schema": {
"properties": {"foo": {}, "bar": {}},
"additionalProperties": {"type": "boolean"}
},
"tests": [
{
"description": "no additional properties is valid",
"data": {"foo": 1},
"valid": true
},
{
"description": "an additional valid property is valid",
"data": {"foo" : 1, "bar" : 2, "quux" : true},
"valid": true
},
{
"description": "an additional invalid property is invalid",
"data": {"foo" : 1, "bar" : 2, "quux" : 12},
"valid": false
}
]
},
{
"description":
"additionalProperties can exist by itself",
"schema": {
"additionalProperties": {"type": "boolean"}
},
"tests": [
{
"description": "an additional valid property is valid",
"data": {"foo" : true},
"valid": true
},
{
"description": "an additional invalid property is invalid",
"data": {"foo" : 1},
"valid": false
}
]
},
{
"description": "additionalProperties are allowed by default",
"schema": {"properties": {"foo": {}, "bar": {}}},
"tests": [
{
"description": "additional properties are allowed",
"data": {"foo": 1, "bar": 2, "quux": true},
"valid": true
}
]
},
{
"description": "additionalProperties should not look in applicators",
"schema": {
"allOf": [
{"properties": {"foo": {}}}
],
"additionalProperties": {"type": "boolean"}
},
"tests": [
{
"description": "properties defined in allOf are not allowed",
"data": {"foo": 1, "bar": true},
"valid": false
}
]
}
]
Loading

0 comments on commit f49ac6b

Please sign in to comment.