"""Tests for the unified durable Campaign startup recovery seam.""" from agenteval.evaluation import campaign_lifecycle def test_recovery_coordinator_orders_cleanup_before_relaunch(db_session, monkeypatch): calls: list[str] = [] class FakeRuns: def __init__(self, _session): pass def mark_orphans_failed(self): calls.append("runs") return 2 class FakeAnalysis: def __init__(self, _session): pass def mark_orphans_failed(self): calls.append("analysis") return 1 class FakeComparison(FakeAnalysis): def mark_orphans_failed(self): calls.append("comparison") return 1 monkeypatch.setattr(campaign_lifecycle, "RunRepository", FakeRuns) monkeypatch.setattr(campaign_lifecycle, "CampaignAnalysisRepository", FakeAnalysis) monkeypatch.setattr(campaign_lifecycle, "CampaignPeriodComparisonRepository", FakeComparison) import agenteval.evaluation.analysis as analysis import agenteval.evaluation.campaign_runner as runner monkeypatch.setattr(analysis, "resume_queued_campaign_analysis", lambda _session: calls.append("queued") or 3) monkeypatch.setattr(runner, "resume_running_campaigns", lambda _session, **_: calls.append("campaigns") or 4) summary = campaign_lifecycle.recover_campaign_runtime(db_session) assert calls == ["runs", "analysis", "comparison", "campaigns", "queued"] assert summary.interrupted_runs == 2 assert summary.interrupted_analysis == 2 assert summary.resumed_campaigns == 4 assert summary.resumed_analysis == 3