from __future__ import annotations import pytest from src.services import telegram_gateway as telegram_gateway_module @pytest.mark.asyncio async def test_telegram_projects_correlated_receipt_without_dispatch( monkeypatch, ) -> None: calls: list[tuple[str, str]] = [] correlated_receipt = { "schema_version": "agent99_controlled_dispatch_receipt_v1", "status": "dispatch_accepted_verifier_pending", "identity": { "incident_id": "INC-20260711-11C751", "run_id": "7cf8fdf7-0966-5ac6-95b2-09e32808b248", "trace_id": "00-11111111111111111111111111111111-2222222222222222-01", "work_item_id": "agent99-dispatch:awoooi:INC-20260711-11C751:recovery", "idempotency_key": "agent99-controlled:stable-key", }, "dispatch_receipt": { "status": "accepted_inbox_triggered", "transport": "relay", "accepted": True, "inbox_triggered": True, }, "receipt_persisted": True, "runtime_execution_authorized": False, "runtime_closure_verified": False, "verifier": {"status": "pending"}, "learning_writeback": {"status": "pending_verifier"}, } async def fake_read(*, project_id: str, incident_id: str): calls.append((project_id, incident_id)) return correlated_receipt monkeypatch.setattr( telegram_gateway_module, "read_agent99_dispatch_receipt", fake_read, ) projection = ( await telegram_gateway_module._mirror_ai_automation_alert_card_to_agent99( "\n".join( [ "ℹ️ ACTION REQUIRED | 低風險", "📋 INC-20260711-11C751", "🎯 資源:cold-start-gate", "🏷️ 分類:general", "🤖 AI 自動化鏈路", ] ), source="unit-test", ) ) assert calls == [("awoooi", "INC-20260711-11C751")] assert projection is not None assert projection["schema_version"] == ( "telegram_agent99_dispatch_receipt_projection_v1" ) assert projection["dispatch_performed"] is False assert projection["accepted"] is True assert projection["incident_id"] == "INC-20260711-11C751" assert projection["run_id"] == correlated_receipt["identity"]["run_id"] assert projection["trace_id"] == correlated_receipt["identity"]["trace_id"] assert projection["idempotency_key"] == ( correlated_receipt["identity"]["idempotency_key"] ) assert projection["runtime_closure_verified"] is False @pytest.mark.asyncio async def test_telegram_unbound_card_fails_closed_without_receipt_read( monkeypatch, ) -> None: reads: list[str] = [] async def unexpected_read(*, project_id: str, incident_id: str): reads.append(f"{project_id}:{incident_id}") return None monkeypatch.setattr( telegram_gateway_module, "read_agent99_dispatch_receipt", unexpected_read, ) card = telegram_gateway_module.format_aiops_signal_alert_card( "SourceProviderIngestionStale provider_freshness_signal freshness " "window timeout Sentry SigNoz provider freshness last seen missing " "direct ref verifier readback" ) projection = await telegram_gateway_module._mirror_ai_automation_alert_card_to_agent99( card, source="unit-test", ) assert projection is not None assert projection["dispatch_performed"] is False assert projection["status"] == "receipt_unbound_fail_closed" assert reads == []