58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
from workbench.api import WorkbenchApi
|
|
from workbench import readers
|
|
|
|
|
|
def _demo_out_dirs() -> dict[str, bool]:
|
|
root = Path("demos")
|
|
return {
|
|
path.as_posix(): path.exists()
|
|
for path in sorted(root.glob("*/out"))
|
|
}
|
|
|
|
|
|
def test_list_demos_projects_closed_registry() -> None:
|
|
demos = readers.list_demos()
|
|
|
|
ids = {demo.demo_id for demo in demos}
|
|
assert "proof_carrying_promotion" in ids
|
|
assert "deductive_entailment_authority" in ids
|
|
assert all(demo.read_only is True for demo in demos)
|
|
assert all(demo.scenario_count == len(demo.scenarios) for demo in demos)
|
|
assert all(s.what_this_proves for demo in demos for s in demo.scenarios)
|
|
|
|
|
|
def test_run_demo_compares_against_committed_expected_artifacts() -> None:
|
|
result = readers.run_demo("deductive_entailment_authority")
|
|
|
|
assert result.demo_id == "deductive_entailment_authority"
|
|
assert result.all_passed is True
|
|
assert result.what_this_proves
|
|
assert any(s.proposer_wrong for s in result.scenarios)
|
|
assert all(s.response for s in result.scenarios)
|
|
|
|
|
|
def test_demo_api_refuses_unknown_or_unsafe_ids() -> None:
|
|
api = WorkbenchApi()
|
|
|
|
unknown = api.handle("POST", "/demos/not_registered/run", b"")
|
|
unsafe = api.handle("POST", "/demos/../proof_carrying_promotion/run", b"")
|
|
|
|
assert unknown.status == 404
|
|
assert unknown.payload["error"]["code"] == "not_found"
|
|
assert unsafe.status == 400
|
|
assert unsafe.payload["error"]["code"] == "bad_request"
|
|
|
|
|
|
def test_demo_run_endpoint_does_not_write_demo_out_dirs() -> None:
|
|
before = _demo_out_dirs()
|
|
api = WorkbenchApi()
|
|
|
|
response = api.handle("POST", "/demos/proof_carrying_promotion/run", b"")
|
|
|
|
assert response.status == 200
|
|
assert response.payload["data"]["all_passed"] is True
|
|
assert _demo_out_dirs() == before
|