from src.services.telegram_gateway import TelegramMessage
def test_action_required_card_exposes_ai_automation_on_fallback() -> None:
message = TelegramMessage(
status_emoji="🚨",
risk_level="CRITICAL",
resource_name="node-exporter-110",
root_cause="AI 分析超時(90s),降級至人工審核",
suggested_action="待分析",
estimated_downtime="5-15 min",
approval_id="test-approval-id",
incident_id="INC-20260429-TEST01",
primary_responsibility="INFRA",
confidence=0.0,
)
body = message.format()
assert "AI 自動化鏈路" in body
assert "rule_fallback" in body
assert "llm_timeout_manual_gate" in body
assert "OpenClaw" in body
assert "NemoTron" in body
assert "Hermes" in body
assert "ElephantAlpha" in body
assert "流程進度" in body
assert "執行:no_action_or_observe" in body
def test_nemotron_card_exposes_same_ai_automation_chain() -> None:
message = TelegramMessage(
status_emoji="🚨",
risk_level="CRITICAL",
resource_name="awoooi-api",
root_cause="Pod restart loop",
suggested_action="restart deployment/awoooi-api",
estimated_downtime="30s",
approval_id="test-approval-id",
incident_id="INC-20260429-TEST02",
primary_responsibility="INFRA",
confidence=0.86,
ai_provider="openclaw_nemo",
ai_model="llama-3.1-nemotron",
nemotron_enabled=True,
playbook_name="restart_deployment",
)
body = message.format_with_nemotron()
assert "AI 自動化鏈路" in body
assert "OpenClaw Nemo" in body
assert "tool_ready" in body
assert "restart_deployment" in body
assert "流程進度" in body
def test_action_required_card_exposes_truth_chain_progress() -> None:
message = TelegramMessage(
status_emoji="⚠️",
risk_level="LOW",
resource_name="awoooi-api",
root_cause="restart spike",
suggested_action="kubectl rollout restart deployment/awoooi-api",
estimated_downtime="30s",
approval_id="approval-id",
incident_id="INC-20260513-TEST03",
primary_responsibility="INFRA",
confidence=0.91,
playbook_name="restart_deployment",
automation_quality={
"verdict": "auto_repaired_verified",
"facts": {
"auto_repair_execution_records": 1,
"automation_operation_records": 1,
"verification_result": "success",
"mcp_gateway_total": 5,
"knowledge_entries": 2,
},
},
)
body = message.format()
assert "流程進度" in body
assert "執行:auto_repair_recorded:1" in body
assert "驗證:success" in body
assert "KM:2" in body
assert "MCP:5" in body
assert "已驗證自動修復" in body
assert "已驗證自動修復完成" in body
assert "等待人工批准" not in body
def test_action_required_card_does_not_call_diagnostic_ops_auto_repair() -> None:
message = TelegramMessage(
status_emoji="🚨",
risk_level="CRITICAL",
resource_name="dirty-reboot-evidence",
root_cause="Expert System: 偵測到高錯誤率",
suggested_action="ssh 192.168.0.110 'df -h /data/minio'",
estimated_downtime="0 min",
approval_id="approval-id",
incident_id="INC-20260530-88D960",
primary_responsibility="INFRA",
confidence=0.0,
playbook_name="rule_catalog",
automation_quality={
"verdict": "auto_repaired_verification_degraded",
"facts": {
"auto_repair_execution_records": 0,
"automation_operation_records": 1,
"effective_execution_records": 0,
"verification_result": "degraded",
"mcp_gateway_total": 22,
"knowledge_entries": 2,
},
},
)
body = message.format()
assert "已記錄診斷/觀察,驗證結果:degraded" in body
assert "執行:diagnostic_recorded:1" in body
assert "已記錄診斷/觀察,尚未證明修復" in body
assert "已自動執行" not in body