1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
import os
import pathlib
import pytest
import responses
from check_jsonschema.schema_loader import SchemaLoader, SchemaParseError
from check_jsonschema.schema_loader.readers import HttpSchemaReader, LocalSchemaReader
@pytest.fixture
def in_tmp_dir(request, tmp_path):
os.chdir(str(tmp_path))
yield
os.chdir(request.config.invocation_dir)
@pytest.mark.parametrize(
"filename",
[
"schema.json",
"schema.yaml",
],
)
def test_schemaloader_path_handling_relative_local_path(in_tmp_dir, filename):
# ensure that the file exists so that the behavior of pathlib resolution will be
# correct on Windows with older python versions
# see: https://bugs.python.org/issue38671
path = pathlib.Path("path", "to") / filename
path.parent.mkdir(parents=True)
path.touch()
sl = SchemaLoader(str(path))
assert isinstance(sl.reader, LocalSchemaReader)
assert sl.reader.filename == os.path.abspath(str(path))
assert str(sl.reader.path) == str(path.resolve())
@pytest.mark.parametrize(
"filename",
[
"schema.yaml",
"schema.yml",
"https://foo.example.com/schema.yaml",
"https://foo.example.com/schema.yml",
],
)
def test_schemaloader_yaml_data(tmp_path, filename):
schema_text = """
---
"$schema": https://json-schema.org/draft/2020-12/schema
type: object
properties:
a:
type: object
properties:
b:
type: array
items:
type: integer
c:
type: string
"""
if filename.startswith("http"):
responses.add("GET", filename, body=schema_text)
path = filename
else:
f = tmp_path / filename
f.write_text(schema_text)
path = str(f)
sl = SchemaLoader(path)
schema = sl.get_schema()
assert schema == {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"a": {
"type": "object",
"properties": {
"b": {"type": "array", "items": {"type": "integer"}},
"c": {"type": "string"},
},
},
},
}
@pytest.mark.parametrize(
"schemafile",
[
"https://foo.example.com/schema.json",
"http://foo.example.com/schema.json",
],
)
def test_schemaloader_remote_path(schemafile):
sl = SchemaLoader(schemafile)
assert isinstance(sl.reader, HttpSchemaReader)
assert sl.reader.url == schemafile
def test_schemaloader_local_yaml_dup_anchor(tmp_path):
f = tmp_path / "schema.yaml"
f.write_text(
"""
---
"$schema": https://json-schema.org/draft/2020-12/schema
type: object
properties:
a:
type: object
properties:
b: &anchor
type: array
items:
type: integer
c: &anchor
type: string
"""
)
sl = SchemaLoader(str(f))
schema = sl.get_schema()
assert schema == {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"a": {
"type": "object",
"properties": {
"b": {"type": "array", "items": {"type": "integer"}},
"c": {"type": "string"},
},
},
},
}
def test_schemaloader_invalid_yaml_data(tmp_path):
f = tmp_path / "foo.yaml"
f.write_text(
"""\
a: {b
"""
)
sl = SchemaLoader(str(f))
with pytest.raises(SchemaParseError):
sl.get_schema()
|