Files
state-hub/tests/test_doi_scope_health.py
2026-05-01 01:47:14 +02:00

157 lines
4.8 KiB
Python

from __future__ import annotations
import pytest
from api.doi_engine import evaluate, evaluate_scope_health
VALID_SCOPE = """# SCOPE
## One-liner
One sentence.
## Core Idea
Core idea.
## In Scope
- One thing
## Out of Scope
- Another thing
## Relevant When
- Useful
## Not Relevant When
- Not useful
## Current State
Active.
## How It Fits
Fits here.
## Terminology
- Term
## Related / Overlapping
- None
## Provided Capabilities
```capability
type: api
title: Example API
```
"""
async def _create_domain(client, slug="scopedom"):
r = await client.post("/domains/", json={"slug": slug, "name": "Scope Domain"})
assert r.status_code == 201, r.text
return r.json()
async def _create_repo(client, domain_slug, local_path, slug="scope-repo"):
r = await client.post("/repos/", json={
"slug": slug,
"name": "Scope Repo",
"domain_slug": domain_slug,
"local_path": str(local_path),
"remote_url": "https://example.invalid/scope-repo.git",
})
assert r.status_code == 201, r.text
return r.json()
def test_scope_health_reports_section_and_capability_detail(tmp_path):
(tmp_path / "SCOPE.md").write_text("# SCOPE\n", encoding="utf-8")
issues = evaluate_scope_health({"slug": "stub", "local_path": str(tmp_path)})
by_id = {issue["id"]: issue for issue in issues}
assert by_id["C5a"]["status"] == "pass"
assert by_id["C5b"]["status"] == "warn"
assert "One-liner" in by_id["C5b"]["missing_sections"]
assert "One-liner" in by_id["C5b"]["needs_refresh_sections"]
assert by_id["C5c"]["status"] == "warn"
assert by_id["C5c"]["needs_refresh_sections"] == ["Provided Capabilities"]
@pytest.mark.asyncio
async def test_doi_reports_c5a_c5b_c5c_separately(tmp_path):
(tmp_path / "SCOPE.md").write_text(VALID_SCOPE, encoding="utf-8")
report = await evaluate(
{
"slug": "valid",
"domain_slug": "scopedom",
"local_path": str(tmp_path),
"remote_url": "https://example.invalid/valid.git",
},
skip_consistency=True,
prefetch={
"domain_status": {"scopedom": "active"},
"tpsc_snap_counts": {"valid": 0},
"active_goal_counts": {"valid": 0},
},
)
c5 = {criterion.id: criterion for criterion in report.criteria if criterion.id.startswith("C5")}
assert set(c5) == {"C5a", "C5b", "C5c"}
assert c5["C5a"].status == "pass"
assert c5["C5b"].status == "pass"
assert c5["C5c"].status == "pass"
class TestRepoDispatchScopeHealth:
async def test_dispatch_flags_stub_scope_for_review(self, client, tmp_path):
await _create_domain(client)
(tmp_path / "SCOPE.md").write_text("# SCOPE\n", encoding="utf-8")
await _create_repo(client, "scopedom", tmp_path, slug="stub-scope")
r = await client.get("/repos/stub-scope/dispatch")
assert r.status_code == 200, r.text
body = r.json()
assert body["scope_needs_review"] is True
by_id = {issue["id"]: issue for issue in body["scope_issue_details"]}
assert by_id["C5b"]["missing_sections"]
assert by_id["C5c"]["needs_refresh_sections"] == ["Provided Capabilities"]
async def test_dispatch_reports_valid_scope_without_review(self, client, tmp_path):
await _create_domain(client)
(tmp_path / "SCOPE.md").write_text(VALID_SCOPE, encoding="utf-8")
await _create_repo(client, "scopedom", tmp_path, slug="valid-scope")
r = await client.get("/repos/valid-scope/dispatch")
assert r.status_code == 200, r.text
body = r.json()
assert body["scope_needs_review"] is False
assert {issue["id"]: issue["status"] for issue in body["scope_issue_details"]} == {
"C5a": "pass",
"C5b": "pass",
"C5c": "pass",
}
async def test_scope_health_list_filters_reachable_repos_needing_review(self, client, tmp_path):
await _create_domain(client)
stub_path = tmp_path / "stub"
valid_path = tmp_path / "valid"
stub_path.mkdir()
valid_path.mkdir()
(stub_path / "SCOPE.md").write_text("# SCOPE\n", encoding="utf-8")
(valid_path / "SCOPE.md").write_text(VALID_SCOPE, encoding="utf-8")
await _create_repo(client, "scopedom", stub_path, slug="stub-list")
await _create_repo(client, "scopedom", valid_path, slug="valid-list")
r = await client.get("/repos/scope-health?needs_review=true&reachable_only=true")
assert r.status_code == 200, r.text
body = r.json()
assert [entry["repo_slug"] for entry in body] == ["stub-list"]
assert body[0]["path_available"] is True
by_id = {issue["id"]: issue for issue in body[0]["scope_issue_details"]}
assert by_id["C5b"]["needs_refresh_sections"]