You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.1 KiB
64 lines
2.1 KiB
from pathlib import Path
|
|
import json
|
|
import os
|
|
|
|
import pytest
|
|
|
|
from referencing import Registry
|
|
from referencing.exceptions import Unresolvable
|
|
import referencing.jsonschema
|
|
|
|
|
|
class SuiteNotFound(Exception):
|
|
def __str__(self):
|
|
return (
|
|
"Cannot find the referencing suite. "
|
|
"Set the REFERENCING_SUITE environment variable to the path to "
|
|
"the suite, or run the test suite from alongside a full checkout "
|
|
"of the git repository."
|
|
)
|
|
|
|
|
|
if "REFERENCING_SUITE" in os.environ:
|
|
SUITE = Path(os.environ["REFERENCING_SUITE"]) / "tests"
|
|
else:
|
|
SUITE = Path(__file__).parent.parent.parent / "suite/tests"
|
|
if not SUITE.is_dir():
|
|
raise SuiteNotFound()
|
|
DIALECT_IDS = json.loads(SUITE.joinpath("specifications.json").read_text())
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"test_path",
|
|
[
|
|
pytest.param(each, id=f"{each.parent.name}-{each.stem}")
|
|
for each in SUITE.glob("*/**/*.json")
|
|
],
|
|
)
|
|
def test_referencing_suite(test_path, subtests):
|
|
dialect_id = DIALECT_IDS[test_path.relative_to(SUITE).parts[0]]
|
|
specification = referencing.jsonschema.specification_with(dialect_id)
|
|
loaded = json.loads(test_path.read_text())
|
|
registry = loaded["registry"]
|
|
registry = Registry().with_resources(
|
|
(uri, specification.create_resource(contents))
|
|
for uri, contents in loaded["registry"].items()
|
|
)
|
|
for test in loaded["tests"]:
|
|
with subtests.test(test=test):
|
|
resolver = registry.resolver(base_uri=test.get("base_uri", ""))
|
|
|
|
if test.get("error"):
|
|
with pytest.raises(Unresolvable):
|
|
resolver.lookup(test["ref"])
|
|
else:
|
|
resolved = resolver.lookup(test["ref"])
|
|
assert resolved.contents == test["target"]
|
|
|
|
then = test.get("then")
|
|
while then:
|
|
with subtests.test(test=test, then=then):
|
|
resolved = resolved.resolver.lookup(then["ref"])
|
|
assert resolved.contents == then["target"]
|
|
then = then.get("then")
|