AgentEvalTool/tests/unit/test_campaign_lifecycle.py

71 lines
2.5 KiB
Python

"""Tests for the durable Campaign creation lifecycle seam."""
import pytest
from agenteval.evaluation.campaign_lifecycle import CampaignCreateError, create_campaign
from agenteval.models import CampaignPlanEntry, CampaignStatus, Case, Scenario
from agenteval.storage.repository import CampaignRepository, ScenarioRepository, TargetRepository
from tests.unit.test_repository import _make_target
def test_create_campaign_commits_running_before_launch(db_session):
TargetRepository(db_session).create(_make_target())
ScenarioRepository(db_session).create(Scenario(id="s-1", name="scenario", cases=[Case(id="c-1", messages=["hi"])]))
launched: list[str] = []
def launch(campaign_id):
launched.append(campaign_id)
assert CampaignRepository(db_session).get(campaign_id).status is CampaignStatus.RUNNING
campaign = create_campaign(
db_session,
name="campaign",
target_id="t-1",
window_seconds=60,
time_scale=1,
plan=[CampaignPlanEntry(scenario_id="s-1", offset_seconds=0, count=1)],
launch=launch,
)
assert campaign.status is CampaignStatus.RUNNING
assert campaign.started_at is not None
assert launched == [campaign.id]
def test_create_campaign_launch_failure_leaves_durable_row(db_session):
TargetRepository(db_session).create(_make_target())
ScenarioRepository(db_session).create(Scenario(id="s-1", name="scenario", cases=[Case(id="c-1", messages=["hi"])]))
def launch(_campaign_id):
raise RuntimeError("scheduler unavailable")
with pytest.raises(RuntimeError):
create_campaign(
db_session,
name="campaign",
target_id="t-1",
window_seconds=60,
time_scale=1,
plan=[CampaignPlanEntry(scenario_id="s-1", offset_seconds=0, count=1)],
launch=launch,
)
rows = CampaignRepository(db_session).list_all()
assert len(rows) == 1
assert rows[0].status is CampaignStatus.RUNNING
def test_create_campaign_rejects_invalid_references_without_writing(db_session):
with pytest.raises(CampaignCreateError) as exc:
create_campaign(
db_session,
name="campaign",
target_id="missing",
window_seconds=60,
time_scale=1,
plan=[CampaignPlanEntry(scenario_id="s-1", offset_seconds=0, count=1)],
)
assert exc.value.status_code == 404
assert CampaignRepository(db_session).list_all() == []