import json from pathlib import Path from scripts.review_stats import compute_stats def _write_log(path: Path, records: list[dict]) -> None: path.parent.mkdir(parents=True, exist_ok=True) with path.open("w") as f: for r in records: f.write(json.dumps(r) + "\n") def test_precision_per_agent(tmp_path): log = tmp_path / "runs.jsonl" _write_log(log, [ {"kind": "subagent_run", "run_id": "r1", "agent": "sec", "model": "claude-sonnet-4-6", "input_tokens": 1000, "output_tokens": 200, "duration_ms": 100, "finding_count": 4, "ts": "x", "repo": "/r", "mode": "local"}, {"kind": "verdict", "run_id": "r1", "agent": "sec", "rule_id": "B1", "file": "a", "line": 1, "verdict": "kept"}, {"kind": "verdict", "run_id": "r1", "agent": "sec", "rule_id": "B2", "file": "a", "line": 2, "verdict": "kept"}, {"kind": "verdict", "run_id": "r1", "agent": "sec", "rule_id": "B3", "file": "a", "line": 3, "verdict": "dismissed"}, {"kind": "verdict", "run_id": "r1", "agent": "sec", "rule_id": "B4", "file": "a", "line": 4, "verdict": "false_positive"}, ]) stats = compute_stats(log) sec = stats["by_agent"]["sec"] assert sec["kept"] == 2 assert sec["total"] == 4 assert abs(sec["precision"] - 0.5) < 1e-9 assert sec["tokens"] == 1200 assert sec["tokens_per_kept"] == 600.0 def test_per_rule_precision(tmp_path): log = tmp_path / "runs.jsonl" _write_log(log, [ {"kind": "verdict", "run_id": "r1", "agent": "sec", "rule_id": "B101", "file": "a", "line": 1, "verdict": "dismissed"}, {"kind": "verdict", "run_id": "r2", "agent": "sec", "rule_id": "B101", "file": "b", "line": 1, "verdict": "dismissed"}, {"kind": "verdict", "run_id": "r3", "agent": "sec", "rule_id": "B101", "file": "c", "line": 1, "verdict": "false_positive"}, ]) stats = compute_stats(log) rule = stats["by_rule"]["sec/B101"] assert rule["kept"] == 0 assert rule["total"] == 3 assert rule["precision"] == 0.0 def test_empty_log_returns_zero_stats(tmp_path): log = tmp_path / "runs.jsonl" stats = compute_stats(log) assert stats == {"by_agent": {}, "by_rule": {}, "runs": 0}