codekingpro/portable-devtools
114k
1import pytest2 3from referencing import Registry, Resource, Specification4import referencing.jsonschema5 6 7@pytest.mark.parametrize(8 "uri, expected",9 [10 (11 "https://json-schema.org/draft/2020-12/schema",12 referencing.jsonschema.DRAFT202012,13 ),14 (15 "https://json-schema.org/draft/2019-09/schema",16 referencing.jsonschema.DRAFT201909,17 ),18 (19 "http://json-schema.org/draft-07/schema#",20 referencing.jsonschema.DRAFT7,21 ),22 (23 "http://json-schema.org/draft-06/schema#",24 referencing.jsonschema.DRAFT6,25 ),26 (27 "http://json-schema.org/draft-04/schema#",28 referencing.jsonschema.DRAFT4,29 ),30 (31 "http://json-schema.org/draft-03/schema#",32 referencing.jsonschema.DRAFT3,33 ),34 ],35)36def test_schemas_with_explicit_schema_keywords_are_detected(uri, expected):37 """38 The $schema keyword in JSON Schema is a dialect identifier.39 """40 contents = {"$schema": uri}41 resource = Resource.from_contents(contents)42 assert resource == Resource(contents=contents, specification=expected)43 44 45def test_unknown_dialect():46 dialect_id = "http://example.com/unknown-json-schema-dialect-id"47 with pytest.raises(referencing.jsonschema.UnknownDialect) as excinfo:48 Resource.from_contents({"$schema": dialect_id})49 assert excinfo.value.uri == dialect_id50 51 52@pytest.mark.parametrize(53 "id, specification",54 [55 ("$id", referencing.jsonschema.DRAFT202012),56 ("$id", referencing.jsonschema.DRAFT201909),57 ("$id", referencing.jsonschema.DRAFT7),58 ("$id", referencing.jsonschema.DRAFT6),59 ("id", referencing.jsonschema.DRAFT4),60 ("id", referencing.jsonschema.DRAFT3),61 ],62)63def test_id_of_mapping(id, specification):64 uri = "http://example.com/some-schema"65 assert specification.id_of({id: uri}) == uri66 67 68@pytest.mark.parametrize(69 "specification",70 [71 referencing.jsonschema.DRAFT202012,72 referencing.jsonschema.DRAFT201909,73 referencing.jsonschema.DRAFT7,74 referencing.jsonschema.DRAFT6,75 ],76)77@pytest.mark.parametrize("value", [True, False])78def test_id_of_bool(specification, value):79 assert specification.id_of(value) is None80 81 82@pytest.mark.parametrize(83 "specification",84 [85 referencing.jsonschema.DRAFT202012,86 referencing.jsonschema.DRAFT201909,87 referencing.jsonschema.DRAFT7,88 referencing.jsonschema.DRAFT6,89 ],90)91@pytest.mark.parametrize("value", [True, False])92def test_anchors_in_bool(specification, value):93 assert list(specification.anchors_in(value)) == []94 95 96@pytest.mark.parametrize(97 "specification",98 [99 referencing.jsonschema.DRAFT202012,100 referencing.jsonschema.DRAFT201909,101 referencing.jsonschema.DRAFT7,102 referencing.jsonschema.DRAFT6,103 ],104)105@pytest.mark.parametrize("value", [True, False])106def test_subresources_of_bool(specification, value):107 assert list(specification.subresources_of(value)) == []108 109 110@pytest.mark.parametrize(111 "uri, expected",112 [113 (114 "https://json-schema.org/draft/2020-12/schema",115 referencing.jsonschema.DRAFT202012,116 ),117 (118 "https://json-schema.org/draft/2019-09/schema",119 referencing.jsonschema.DRAFT201909,120 ),121 (122 "http://json-schema.org/draft-07/schema#",123 referencing.jsonschema.DRAFT7,124 ),125 (126 "http://json-schema.org/draft-06/schema#",127 referencing.jsonschema.DRAFT6,128 ),129 (130 "http://json-schema.org/draft-04/schema#",131 referencing.jsonschema.DRAFT4,132 ),133 (134 "http://json-schema.org/draft-03/schema#",135 referencing.jsonschema.DRAFT3,136 ),137 ],138)139def test_specification_with(uri, expected):140 assert referencing.jsonschema.specification_with(uri) == expected141 142 143@pytest.mark.parametrize(144 "uri, expected",145 [146 (147 "http://json-schema.org/draft-07/schema",148 referencing.jsonschema.DRAFT7,149 ),150 (151 "http://json-schema.org/draft-06/schema",152 referencing.jsonschema.DRAFT6,153 ),154 (155 "http://json-schema.org/draft-04/schema",156 referencing.jsonschema.DRAFT4,157 ),158 (159 "http://json-schema.org/draft-03/schema",160 referencing.jsonschema.DRAFT3,161 ),162 ],163)164def test_specification_with_no_empty_fragment(uri, expected):165 assert referencing.jsonschema.specification_with(uri) == expected166 167 168def test_specification_with_unknown_dialect():169 dialect_id = "http://example.com/unknown-json-schema-dialect-id"170 with pytest.raises(referencing.jsonschema.UnknownDialect) as excinfo:171 referencing.jsonschema.specification_with(dialect_id)172 assert excinfo.value.uri == dialect_id173 174 175def test_specification_with_default():176 dialect_id = "http://example.com/unknown-json-schema-dialect-id"177 specification = referencing.jsonschema.specification_with(178 dialect_id,179 default=Specification.OPAQUE,180 )181 assert specification is Specification.OPAQUE182 183 184# FIXME: The tests below should move to the referencing suite but I haven't yet185# figured out how to represent dynamic (& recursive) ref lookups in it.186def test_lookup_trivial_dynamic_ref():187 one = referencing.jsonschema.DRAFT202012.create_resource(188 {"$dynamicAnchor": "foo"},189 )190 resolver = Registry().with_resource("http://example.com", one).resolver()191 resolved = resolver.lookup("http://example.com#foo")192 assert resolved.contents == one.contents193 194 195def test_multiple_lookup_trivial_dynamic_ref():196 TRUE = referencing.jsonschema.DRAFT202012.create_resource(True)197 root = referencing.jsonschema.DRAFT202012.create_resource(198 {199 "$id": "http://example.com",200 "$dynamicAnchor": "fooAnchor",201 "$defs": {202 "foo": {203 "$id": "foo",204 "$dynamicAnchor": "fooAnchor",205 "$defs": {206 "bar": True,207 "baz": {208 "$dynamicAnchor": "fooAnchor",209 },210 },211 },212 },213 },214 )215 resolver = (216 Registry()217 .with_resources(218 [219 ("http://example.com", root),220 ("http://example.com/foo/", TRUE),221 ("http://example.com/foo/bar", root),222 ],223 )224 .resolver()225 )226 227 first = resolver.lookup("http://example.com")228 second = first.resolver.lookup("foo/")229 resolver = second.resolver.lookup("bar").resolver230 fourth = resolver.lookup("#fooAnchor")231 assert fourth.contents == root.contents232 233 234def test_multiple_lookup_dynamic_ref_to_nondynamic_ref():235 one = referencing.jsonschema.DRAFT202012.create_resource(236 {"$anchor": "fooAnchor"},237 )238 two = referencing.jsonschema.DRAFT202012.create_resource(239 {240 "$id": "http://example.com",241 "$dynamicAnchor": "fooAnchor",242 "$defs": {243 "foo": {244 "$id": "foo",245 "$dynamicAnchor": "fooAnchor",246 "$defs": {247 "bar": True,248 "baz": {249 "$dynamicAnchor": "fooAnchor",250 },251 },252 },253 },254 },255 )256 resolver = (257 Registry()258 .with_resources(259 [260 ("http://example.com", two),261 ("http://example.com/foo/", one),262 ("http://example.com/foo/bar", two),263 ],264 )265 .resolver()266 )267 268 first = resolver.lookup("http://example.com")269 second = first.resolver.lookup("foo/")270 resolver = second.resolver.lookup("bar").resolver271 fourth = resolver.lookup("#fooAnchor")272 assert fourth.contents == two.contents273 274 275def test_lookup_trivial_recursive_ref():276 one = referencing.jsonschema.DRAFT201909.create_resource(277 {"$recursiveAnchor": True},278 )279 resolver = Registry().with_resource("http://example.com", one).resolver()280 first = resolver.lookup("http://example.com")281 resolved = referencing.jsonschema.lookup_recursive_ref(282 resolver=first.resolver,283 )284 assert resolved.contents == one.contents285 286 287def test_lookup_recursive_ref_to_bool():288 TRUE = referencing.jsonschema.DRAFT201909.create_resource(True)289 registry = Registry({"http://example.com": TRUE})290 resolved = referencing.jsonschema.lookup_recursive_ref(291 resolver=registry.resolver(base_uri="http://example.com"),292 )293 assert resolved.contents == TRUE.contents294 295 296def test_multiple_lookup_recursive_ref_to_bool():297 TRUE = referencing.jsonschema.DRAFT201909.create_resource(True)298 root = referencing.jsonschema.DRAFT201909.create_resource(299 {300 "$id": "http://example.com",301 "$recursiveAnchor": True,302 "$defs": {303 "foo": {304 "$id": "foo",305 "$recursiveAnchor": True,306 "$defs": {307 "bar": True,308 "baz": {309 "$recursiveAnchor": True,310 "$anchor": "fooAnchor",311 },312 },313 },314 },315 },316 )317 resolver = (318 Registry()319 .with_resources(320 [321 ("http://example.com", root),322 ("http://example.com/foo/", TRUE),323 ("http://example.com/foo/bar", root),324 ],325 )326 .resolver()327 )328 329 first = resolver.lookup("http://example.com")330 second = first.resolver.lookup("foo/")331 resolver = second.resolver.lookup("bar").resolver332 fourth = referencing.jsonschema.lookup_recursive_ref(resolver=resolver)333 assert fourth.contents == root.contents334 335 336def test_multiple_lookup_recursive_ref_with_nonrecursive_ref():337 one = referencing.jsonschema.DRAFT201909.create_resource(338 {"$recursiveAnchor": True},339 )340 two = referencing.jsonschema.DRAFT201909.create_resource(341 {342 "$id": "http://example.com",343 "$recursiveAnchor": True,344 "$defs": {345 "foo": {346 "$id": "foo",347 "$recursiveAnchor": True,348 "$defs": {349 "bar": True,350 "baz": {351 "$recursiveAnchor": True,352 "$anchor": "fooAnchor",353 },354 },355 },356 },357 },358 )359 three = referencing.jsonschema.DRAFT201909.create_resource(360 {"$recursiveAnchor": False},361 )362 resolver = (363 Registry()364 .with_resources(365 [366 ("http://example.com", three),367 ("http://example.com/foo/", two),368 ("http://example.com/foo/bar", one),369 ],370 )371 .resolver()372 )373 374 first = resolver.lookup("http://example.com")375 second = first.resolver.lookup("foo/")376 resolver = second.resolver.lookup("bar").resolver377 fourth = referencing.jsonschema.lookup_recursive_ref(resolver=resolver)378 assert fourth.contents == two.contents379 380 381def test_empty_registry():382 assert referencing.jsonschema.EMPTY_REGISTRY == Registry()383 