from __future__ import annotations from src.services.channel_hub import ( build_grouped_alert_provider_event_id, build_grouped_alert_run_id, ensure_completed_shadow_run, format_grouped_alert_digest_text, format_grouped_alert_event_content, record_outbound_message, ) def test_build_grouped_alert_provider_event_id_is_deterministic() -> None: event_id = build_grouped_alert_provider_event_id( "INC-20260507-ABCD12", "1234567890abcdef" * 4, ) assert event_id == "alert-group:INC-20260507-ABCD12:1234567890abcdef1234567890abcdef" assert len(event_id) < 256 def test_build_grouped_alert_run_id_is_stable() -> None: provider_event_id = build_grouped_alert_provider_event_id( "INC-20260507-ABCD12", "1234567890abcdef" * 4, ) first = build_grouped_alert_run_id("awoooi", provider_event_id) second = build_grouped_alert_run_id("awoooi", provider_event_id) other_project = build_grouped_alert_run_id("ewoooc", provider_event_id) assert first == second assert first != other_project def test_format_grouped_alert_event_content_keeps_operator_context() -> None: content = format_grouped_alert_event_content( alert_id="INC-20260507-ABCD12", alertname="DockerContainerRestartSpike", severity="critical", namespace="default", target_resource="sentry-self-hosted-events-consumer-1", group_key="DockerContainerRestartSpike:default", count=4, parent_fingerprint="parent-fp", fingerprint="child-fp", ) assert "告警已收斂,不發 Telegram" in content assert "Alert: DockerContainerRestartSpike" in content assert "Target: sentry-self-hosted-events-consumer-1" in content assert "Group Count: 4" in content assert "Parent Fingerprint: parent-fp" in content def test_format_grouped_alert_digest_text_is_html_safe() -> None: content = format_grouped_alert_digest_text( alertname="Docker", severity="critical", namespace="default", target_resource="sentry&snuba", group_key="Docker:default", count=7, ) assert "告警已收斂到父卡" in content assert "Docker<Restart>" in content assert "sentry&snuba" in content assert "7 筆同組告警" in content assert "AwoooP Run 監控" in content class _FakeResult: def fetchone(self) -> tuple[str] | None: return ("created",) class _FakeSession: def __init__(self) -> None: self.statement = "" self.params = {} self.statements = [] self.param_sets = [] async def execute(self, statement, params): # noqa: ANN001 self.statement = str(statement) self.params = params self.statements.append(str(statement)) self.param_sets.append(params) return _FakeResult() async def test_completed_shadow_run_sets_run_state_not_null_defaults() -> None: session = _FakeSession() run_id = build_grouped_alert_run_id("awoooi", "provider-event") inserted = await ensure_completed_shadow_run( session, # type: ignore[arg-type] project_id="awoooi", run_id=run_id, agent_id="legacy-telegram-gateway", trigger_type="legacy_outbound", trigger_ref="12713", input_payload={"message_type": "final"}, ) assert inserted is True assert "attempt_count, max_attempts, cost_usd, step_count" in session.statement assert "0, 3, 0.0000, 0" in session.statement assert session.params["project_id"] == "awoooi" assert session.params["run_id"] == run_id async def test_record_outbound_message_sets_sent_at_for_sent_messages() -> None: session = _FakeSession() run_id = build_grouped_alert_run_id("awoooi", "telegram-message-13152") await record_outbound_message( session, # type: ignore[arg-type] project_id="awoooi", run_id=run_id, channel_type="telegram", channel_chat_id="-100123", message_type="approval_request", content="ACTION REQUIRED INC-20260513-9B082D", provider_message_id="13152", send_status="sent", triggered_by_state="legacy_gateway", is_shadow=False, ) insert_statement = session.statements[-1] assert "sent_at" in insert_statement assert ":sent_at" in insert_statement assert session.param_sets[-1]["send_status"] == "sent" assert session.param_sets[-1]["sent_at"] is not None assert session.param_sets[-1]["sent_at"].tzinfo is None