Files
KF-OnlineJudge/backend/tests/test_contracts.py

27 lines
1015 B
Python

import json
from pathlib import Path
import pytest
from jsonschema import Draft202012Validator, FormatChecker
from pydantic import ValidationError
from kf_oj.contracts.judge import JudgeTaskNotification
ROOT = Path(__file__).resolve().parents[2]
FIXTURES = ROOT / "tests/fixtures/contracts"
SCHEMA = json.loads((ROOT / "contracts/schemas/judge-task.v1.schema.json").read_text())
@pytest.mark.parametrize("path", sorted(FIXTURES.glob("judge-task.*.json")), ids=lambda p: p.stem)
def test_shared_wire_examples(path: Path) -> None:
payload = json.loads(path.read_text())
validator = Draft202012Validator(SCHEMA, format_checker=FormatChecker())
if ".invalid-" in path.name:
with pytest.raises(ValidationError):
JudgeTaskNotification.model_validate(payload)
assert not validator.is_valid(payload)
else:
notification = JudgeTaskNotification.model_validate(payload)
validator.validate(payload)
assert notification.model_dump(mode="json") == payload