import pytest from pathlib import Path from scripts.review_stats import compute_stats from scripts.telemetry import append_subagent_run, append_verdict def _seed(log: Path): append_subagent_run( log, run_id="r1", repo="/r", mode="local", agent="aws-bp-reviewer", model="claude-sonnet-4-6", input_tokens=1000, output_tokens=200, duration_ms=5000, finding_count=3, ) append_verdict(log, run_id="r1", agent="aws-bp-reviewer", rule_id="TRIVY AVD-AWS-0089", file="a.tf", line=1, verdict="kept") append_verdict(log, run_id="r1", agent="aws-bp-reviewer", rule_id="TRIVY AVD-AWS-0089", file="b.tf", line=2, verdict="dismissed") append_verdict(log, run_id="r1", agent="aws-bp-reviewer", rule_id="TRIVY AVD-AWS-0089", file="c.tf", line=3, verdict="false_positive") def test_compute_stats_precision_and_tokens(tmp_path): log = tmp_path / "runs.jsonl" _seed(log) stats = compute_stats(log) assert stats["runs"] == 1 a = stats["by_agent"]["aws-bp-reviewer"] assert a["total"] == 3 assert a["kept"] == 1 assert a["dismissed"] == 1 assert a["false_positive"] == 1 assert a["precision"] == pytest.approx(1 / 3) assert a["tokens"] == 1200 assert a["tokens_per_kept"] == 1200 def test_compute_stats_empty(tmp_path): stats = compute_stats(tmp_path / "missing.jsonl") assert stats == {"by_agent": {}, "by_rule": {}, "runs": 0} def test_compute_stats_per_rule(tmp_path): log = tmp_path / "runs.jsonl" _seed(log) stats = compute_stats(log) rule_key = "aws-bp-reviewer/TRIVY AVD-AWS-0089" r = stats["by_rule"][rule_key] assert r["total"] == 3 assert r["kept"] == 1 assert r["precision"] == pytest.approx(1 / 3)