AgentEvalTool/tests/unit/test_campaign_read_model.py

69 lines
2.5 KiB
Python

"""Campaign read-model projections and batched child-Run loading."""
from datetime import datetime, timezone
from agenteval.evaluation.campaign_read_model import CampaignReadModel
from agenteval.models import Campaign, CampaignPlanEntry, EvalRun, RunStatus
from agenteval.storage.repository import CampaignRepository, RunRepository
def _campaign(session, campaign_id: str) -> Campaign:
return CampaignRepository(session).create(Campaign(
id=campaign_id,
name=campaign_id,
target_id="target-1",
window_seconds=60,
plan=[CampaignPlanEntry(scenario_id="scenario-1", offset_seconds=0)],
))
def _run(session, campaign_id: str, run_id: str) -> EvalRun:
return RunRepository(session).create(EvalRun(
id=run_id,
target_id="target-1",
scenario_id="scenario-1",
campaign_id=campaign_id,
status=RunStatus.COMPLETED,
started_at=datetime(2026, 1, 1, tzinfo=timezone.utc),
summary={"total_cases": 1, "passed_cases": 1, "pass_rate": 1.0},
))
def test_list_items_empty(db_session):
assert CampaignReadModel(db_session).list_items() == []
def test_list_items_batches_runs_for_multiple_campaigns(db_session, monkeypatch):
first = _campaign(db_session, "campaign-1")
second = _campaign(db_session, "campaign-2")
_run(db_session, first.id, "run-1")
_run(db_session, second.id, "run-2")
def reject_per_campaign_query(*args, **kwargs):
raise AssertionError("list_items must not query child Runs per Campaign")
monkeypatch.setattr(RunRepository, "list_by_campaign", reject_per_campaign_query)
items = CampaignReadModel(db_session).list_items()
progress_by_id = {item["id"]: item["progress"] for item in items}
assert set(progress_by_id) == {first.id, second.id}
assert progress_by_id[first.id]["completed_runs"] == 1
assert progress_by_id[second.id]["completed_runs"] == 1
def test_markdown_projection_uses_json_report_projection(db_session):
campaign = _campaign(db_session, "campaign-1")
_run(db_session, campaign.id, "run-1")
read_model = CampaignReadModel(db_session)
json_report = read_model.report(campaign.id)
markdown_projection = read_model.markdown_projection(campaign.id)
assert json_report is not None
assert markdown_projection is not None
assert markdown_projection["report"] == {
key: value for key, value in json_report.items() if key != "exploration"
}
assert markdown_projection["exploration"] == json_report.get("exploration")