fix(incidents): keep list endpoint pure read
All checks were successful
Code Review / ai-code-review (push) Successful in 11s
CD Pipeline / tests (push) Successful in 1m7s
CD Pipeline / build-and-deploy (push) Successful in 3m26s
CD Pipeline / post-deploy-checks (push) Successful in 1m17s

This commit is contained in:
Your Name
2026-05-06 21:17:25 +08:00
parent ea6b7d8f27
commit a0179cec6e
4 changed files with 106 additions and 17 deletions

View File

@@ -17,8 +17,8 @@ Incident API 整合測試
- GET /api/v1/monitoring/status — 監控工具狀態
注意: GET /api/v1/incidents 不在此測試
原因: 該端點觸發 AI 決策生成 (LLM 呼叫),回應時間 30s+
不適合整合測試。應使用 smoke_test_alert_chain.py 驗證
原因: 該端點是前端輪詢路徑,應維持純讀與低延遲;
是否背景觸發 AI 決策由獨立 unit test 驗證,修復建議生成改走 proposal/operator-run 入口
"""
import os

View File

@@ -0,0 +1,53 @@
"""
Incident list endpoint pure-read regression tests.
目的:
- GET /api/v1/incidents 是前端輪詢與 AwoooP Console 的列表路徑。
- 預設不得因為缺少 decision token 就背景啟動 LLM / Ollama / OpenClaw。
"""
from datetime import UTC, datetime
import pytest
from src.api.v1 import incidents as incidents_api
from src.models.incident import Incident, Severity
class _IncidentService:
async def get_active_incidents(self) -> list[Incident]:
return [
Incident(
incident_id="INC-20260506-PURE01",
severity=Severity.P2,
affected_services=["awoooi-api"],
created_at=datetime(2026, 5, 6, 12, 0, tzinfo=UTC),
updated_at=datetime(2026, 5, 6, 12, 1, tzinfo=UTC),
)
]
class _DecisionManager:
def __init__(self) -> None:
self.created = 0
async def _find_existing_token(self, incident_id: str):
return None
async def get_or_create_decision(self, *args, **kwargs):
self.created += 1
raise AssertionError("GET /incidents must not create AI decisions by default")
@pytest.mark.asyncio
async def test_list_incidents_does_not_trigger_ai_decision_by_default(monkeypatch):
decision_manager = _DecisionManager()
monkeypatch.setattr(incidents_api, "get_incident_service", lambda: _IncidentService())
monkeypatch.setattr(incidents_api, "get_decision_manager", lambda: decision_manager)
result = await incidents_api.list_incidents(generate_missing_decisions=False)
assert result.count == 1
assert result.incidents[0].incident_id == "INC-20260506-PURE01"
assert result.incidents[0].decision is None
assert decision_manager.created == 0