69 lines
2.7 KiB
Python
69 lines
2.7 KiB
Python
from unittest.mock import patch
|
|
|
|
from backend.agents.base import AgentScope, AgentUsage
|
|
|
|
from backend.agents.verifier import (
|
|
EvidenceVerifierAgent, apply_verdicts, select_findings,
|
|
)
|
|
|
|
|
|
def _finding(sev="critical", issue_id="i1", sheets=("S401",), cluster_key=None):
|
|
f = {"issue_id": issue_id, "severity": sev, "confidence": "high",
|
|
"source_stage": "constructability", "sheets": list(sheets),
|
|
"description": "HSS16x4 on (2) 2x6 STUD PACK is unbuildable",
|
|
"evidence": [{"sheet": "S401", "source_text": "(2) 2x6 STUD PACK",
|
|
"asserted_value": "3-inch width"}]}
|
|
if cluster_key:
|
|
f["cluster_key"] = cluster_key
|
|
return f
|
|
|
|
|
|
def test_select_findings_by_severity_and_dispute():
|
|
findings = [_finding("critical"), _finding("low", "i2"),
|
|
_finding("medium", "i3", cluster_key="c9")]
|
|
clusters = [{"key": "c9", "disputed_attributes": [{"attribute": "a"}]}]
|
|
selected = select_findings(findings, clusters, max_checks=20,
|
|
severities={"critical", "high"})
|
|
assert [f["issue_id"] for f in selected] == ["i1", "i3"]
|
|
|
|
|
|
def test_select_findings_respects_cap():
|
|
findings = [_finding("critical", f"i{n}") for n in range(30)]
|
|
selected = select_findings(findings, [], max_checks=5,
|
|
severities={"critical"})
|
|
assert len(selected) == 5
|
|
|
|
|
|
def test_run_attaches_verdicts_and_marks_refuted():
|
|
agent = EvidenceVerifierAgent(usage=AgentUsage())
|
|
scope = AgentScope(scope_id="verify:0", payload={
|
|
"finding_index": 0,
|
|
"finding": _finding(),
|
|
"images_b64": ["QUJD"],
|
|
})
|
|
verdicts = {"verdicts": [
|
|
{"sheet": "S401", "source_text": "(2) 2x6 STUD PACK",
|
|
"verdict": "corrected", "actual_text": "(5) 2x6 STUD PACK",
|
|
"notes": "callout reads (5)"},
|
|
]}
|
|
with patch("backend.agents.verifier.call_json", return_value=verdicts):
|
|
result = agent.run(scope)
|
|
assert not result.error
|
|
artifact = result.artifacts[0]
|
|
assert artifact["finding_index"] == 0
|
|
assert artifact["status"] == "refuted" # no evidence confirmed
|
|
assert artifact["verdicts"][0]["actual_text"] == "(5) 2x6 STUD PACK"
|
|
|
|
|
|
def test_apply_verdicts_annotates_and_suppresses():
|
|
from backend.agents.base import AgentResult
|
|
findings = [_finding("critical", "i1"), _finding("high", "i2")]
|
|
results = [AgentResult(scope_id="verify:0", artifacts=[
|
|
{"finding_index": 0, "status": "refuted", "verdicts": []},
|
|
{"finding_index": 1, "status": "confirmed", "verdicts": []},
|
|
])]
|
|
suppressed = apply_verdicts(findings, results)
|
|
assert suppressed == [findings[0]]
|
|
assert findings[0]["verification"]["status"] == "refuted"
|
|
assert findings[1]["verification"]["status"] == "confirmed"
|