generated from coulomb/repo-seed
140 lines
5.1 KiB
Python
140 lines
5.1 KiB
Python
import pytest
|
|
|
|
from repo_scoping.acceptance import (
|
|
AgenticReviewDecision,
|
|
validate_agentic_review_decision,
|
|
)
|
|
from repo_scoping.core.service import RegistryService
|
|
from repo_scoping.repo_ingestion.git import GitIngestionService
|
|
from repo_scoping.storage.sqlite import RegistryStore
|
|
|
|
|
|
class RecordingAgenticReviewer:
|
|
reviewer_id = "test-agent"
|
|
policy_version = "agentic-review-policy/test"
|
|
|
|
def __init__(self):
|
|
self.requests = []
|
|
|
|
def review(self, request):
|
|
self.requests.append(request)
|
|
return []
|
|
|
|
|
|
class ApprovingAgenticReviewer:
|
|
reviewer_id = "approving-agent"
|
|
policy_version = "agentic-review-policy/test"
|
|
|
|
def __init__(self):
|
|
self.requests = []
|
|
|
|
def review(self, request):
|
|
self.requests.append(request)
|
|
graph = request.candidate_graph
|
|
return [
|
|
AgenticReviewDecision(
|
|
action="approve",
|
|
target_type="candidate_graph",
|
|
target_id=graph.analysis_run.id,
|
|
rationale="API source and README support the generated repository interface claim.",
|
|
criterion_ids=["RREG-QC-004"],
|
|
evidence_refs=["README.md", "app.py"],
|
|
)
|
|
]
|
|
|
|
|
|
def test_configured_agentic_reviewer_receives_graph_gates_and_criteria(tmp_path):
|
|
source = tmp_path / "repo"
|
|
source.mkdir()
|
|
(source / "README.md").write_text("# Agentic Review\nReports health.\n", encoding="utf-8")
|
|
(source / "app.py").write_text('@app.get("/health")\ndef health():\n return {}\n', encoding="utf-8")
|
|
store = RegistryStore(tmp_path / "registry.sqlite3")
|
|
store.initialize()
|
|
reviewer = RecordingAgenticReviewer()
|
|
service = RegistryService(
|
|
store,
|
|
ingestion=GitIngestionService(tmp_path / "checkouts"),
|
|
agentic_reviewer=reviewer,
|
|
)
|
|
repository = service.register_repository(name="Agentic Review", url=str(source))
|
|
|
|
summary = service.analyze_repository(
|
|
repository.id,
|
|
use_llm_assistance=False,
|
|
agentic_review=True,
|
|
)
|
|
|
|
graph = service.candidate_graph(repository.id, summary.analysis_run.id)
|
|
decisions = service.list_review_decisions(repository.id, summary.analysis_run.id)
|
|
assert len(reviewer.requests) == 1
|
|
request = reviewer.requests[0]
|
|
assert request.repository.id == repository.id
|
|
assert request.candidate_graph.analysis_run.id == summary.analysis_run.id
|
|
assert request.criteria_version == "repo-scoping-quality-criteria/v1"
|
|
assert request.quality_gate_outcomes == []
|
|
assert graph.abilities[0].capabilities[0].status == "candidate"
|
|
assert decisions[0].action == "agentic_review_completed"
|
|
assert "reviewer=test-agent" in decisions[0].notes
|
|
assert "decisions=0" in decisions[0].notes
|
|
|
|
|
|
def test_agentic_approval_requires_rationale_criteria_and_evidence():
|
|
with pytest.raises(ValueError, match="evidence refs"):
|
|
validate_agentic_review_decision(
|
|
AgenticReviewDecision(
|
|
action="approve",
|
|
target_type="candidate_graph",
|
|
target_id=1,
|
|
rationale="Looks supported.",
|
|
criterion_ids=["RREG-QC-004"],
|
|
evidence_refs=[],
|
|
)
|
|
)
|
|
|
|
|
|
def test_agentic_reviewer_can_approve_candidate_graph_with_rationale(tmp_path):
|
|
source = tmp_path / "repo"
|
|
source.mkdir()
|
|
(source / "README.md").write_text(
|
|
"# Agentic Approval\nReports health.\n",
|
|
encoding="utf-8",
|
|
)
|
|
(source / "app.py").write_text(
|
|
'@app.get("/health")\ndef health():\n return {}\n',
|
|
encoding="utf-8",
|
|
)
|
|
store = RegistryStore(tmp_path / "registry.sqlite3")
|
|
store.initialize()
|
|
reviewer = ApprovingAgenticReviewer()
|
|
service = RegistryService(
|
|
store,
|
|
ingestion=GitIngestionService(tmp_path / "checkouts"),
|
|
agentic_reviewer=reviewer,
|
|
)
|
|
repository = service.register_repository(name="Agentic Approval", url=str(source))
|
|
|
|
summary = service.analyze_repository(
|
|
repository.id,
|
|
use_llm_assistance=False,
|
|
agentic_review=True,
|
|
)
|
|
|
|
ability_map = service.ability_map(repository.id)
|
|
graph = service.candidate_graph(repository.id, summary.analysis_run.id)
|
|
decisions = service.list_review_decisions(repository.id, summary.analysis_run.id)
|
|
assert ability_map.abilities
|
|
assert graph.abilities[0].status == "approved"
|
|
assert decisions[1].action == "agentic_approve_candidate_graph"
|
|
assert decisions[1].reviewer_type == "agent"
|
|
assert decisions[1].reviewer_id == "approving-agent"
|
|
assert decisions[1].policy_version == "agentic-review-policy/test"
|
|
assert decisions[1].criteria_version == "repo-scoping-quality-criteria/v1"
|
|
assert decisions[1].criterion_ids == ["RREG-QC-004"]
|
|
assert decisions[1].evidence_refs == ["README.md", "app.py"]
|
|
assert decisions[1].decision_kind == "accepted_as_is"
|
|
assert "rationale=API source and README support" in decisions[1].notes
|
|
assert "criteria=RREG-QC-004" in decisions[1].notes
|
|
assert "evidence=README.md, app.py" in decisions[1].notes
|
|
assert decisions[0].action == "agentic_review_completed"
|
|
assert "decisions=1" in decisions[0].notes
|