release: v1.9.0 — IRM-алерты отдельно от инцидентов
- Alembic 005: таблицы irm_alerts и incident_alert_links - Модуль alerts: API/UI, Ack/Resolve, привязка к инциденту через alert_ids - Вебхук Grafana: одна транзакция ingress + irm_alerts; разбор payload в grafana_payload - По умолчанию инцидент из вебхука не создаётся (AUTO_INCIDENT_FROM_ALERT) - Документация IRM_GRAFANA_PARITY.md, обновления IRM.md и CHANGELOG Made-with: Cursor
This commit is contained in:
@ -1,9 +1,23 @@
|
||||
import json
|
||||
from unittest.mock import AsyncMock, MagicMock, patch
|
||||
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
|
||||
def _webhook_mock_pool(mock_conn: AsyncMock) -> MagicMock:
|
||||
"""Пул с транзакцией и execute — как после вставки ingress + irm_alerts."""
|
||||
tx = AsyncMock()
|
||||
tx.__aenter__ = AsyncMock(return_value=None)
|
||||
tx.__aexit__ = AsyncMock(return_value=None)
|
||||
mock_conn.transaction = MagicMock(return_value=tx)
|
||||
mock_conn.execute = AsyncMock()
|
||||
mock_cm = AsyncMock()
|
||||
mock_cm.__aenter__ = AsyncMock(return_value=mock_conn)
|
||||
mock_cm.__aexit__ = AsyncMock(return_value=None)
|
||||
mock_pool = MagicMock()
|
||||
mock_pool.acquire = MagicMock(return_value=mock_cm)
|
||||
return mock_pool
|
||||
|
||||
|
||||
def test_grafana_webhook_no_db(client: TestClient) -> None:
|
||||
"""Без пула БД — 202, запись не падает."""
|
||||
r = client.post(
|
||||
@ -41,12 +55,7 @@ def test_grafana_webhook_inserts_with_mock_pool(client: TestClient) -> None:
|
||||
mock_conn = AsyncMock()
|
||||
uid = uuid4()
|
||||
mock_conn.fetchrow = AsyncMock(return_value={"id": uid})
|
||||
mock_cm = AsyncMock()
|
||||
mock_cm.__aenter__ = AsyncMock(return_value=mock_conn)
|
||||
mock_cm.__aexit__ = AsyncMock(return_value=None)
|
||||
|
||||
mock_pool = MagicMock()
|
||||
mock_pool.acquire = MagicMock(return_value=mock_cm)
|
||||
mock_pool = _webhook_mock_pool(mock_conn)
|
||||
|
||||
app = client.app
|
||||
real_pool = app.state.pool
|
||||
@ -59,6 +68,7 @@ def test_grafana_webhook_inserts_with_mock_pool(client: TestClient) -> None:
|
||||
)
|
||||
assert r.status_code == 202
|
||||
mock_conn.fetchrow.assert_called_once()
|
||||
mock_conn.execute.assert_called_once()
|
||||
finally:
|
||||
app.state.pool = real_pool
|
||||
|
||||
@ -69,11 +79,7 @@ def test_grafana_webhook_auto_org_from_external_url(client: TestClient) -> None:
|
||||
mock_conn = AsyncMock()
|
||||
uid = uuid4()
|
||||
mock_conn.fetchrow = AsyncMock(return_value={"id": uid})
|
||||
mock_cm = AsyncMock()
|
||||
mock_cm.__aenter__ = AsyncMock(return_value=mock_conn)
|
||||
mock_cm.__aexit__ = AsyncMock(return_value=None)
|
||||
mock_pool = MagicMock()
|
||||
mock_pool.acquire = MagicMock(return_value=mock_cm)
|
||||
mock_pool = _webhook_mock_pool(mock_conn)
|
||||
|
||||
app = client.app
|
||||
real_pool = app.state.pool
|
||||
@ -99,11 +105,7 @@ def test_grafana_webhook_publishes_alert_received(client: TestClient) -> None:
|
||||
mock_conn = AsyncMock()
|
||||
uid = uuid4()
|
||||
mock_conn.fetchrow = AsyncMock(return_value={"id": uid})
|
||||
mock_cm = AsyncMock()
|
||||
mock_cm.__aenter__ = AsyncMock(return_value=mock_conn)
|
||||
mock_cm.__aexit__ = AsyncMock(return_value=None)
|
||||
mock_pool = MagicMock()
|
||||
mock_pool.acquire = MagicMock(return_value=mock_cm)
|
||||
mock_pool = _webhook_mock_pool(mock_conn)
|
||||
|
||||
app = client.app
|
||||
bus = app.state.event_bus
|
||||
@ -130,11 +132,7 @@ def test_grafana_webhook_org_any_slug_without_json_config(client: TestClient) ->
|
||||
mock_conn = AsyncMock()
|
||||
uid = uuid4()
|
||||
mock_conn.fetchrow = AsyncMock(return_value={"id": uid})
|
||||
mock_cm = AsyncMock()
|
||||
mock_cm.__aenter__ = AsyncMock(return_value=mock_conn)
|
||||
mock_cm.__aexit__ = AsyncMock(return_value=None)
|
||||
mock_pool = MagicMock()
|
||||
mock_pool.acquire = MagicMock(return_value=mock_cm)
|
||||
mock_pool = _webhook_mock_pool(mock_conn)
|
||||
|
||||
app = client.app
|
||||
real_pool = app.state.pool
|
||||
@ -157,11 +155,7 @@ def test_grafana_webhook_org_ok(client: TestClient) -> None:
|
||||
mock_conn = AsyncMock()
|
||||
uid = uuid4()
|
||||
mock_conn.fetchrow = AsyncMock(return_value={"id": uid})
|
||||
mock_cm = AsyncMock()
|
||||
mock_cm.__aenter__ = AsyncMock(return_value=mock_conn)
|
||||
mock_cm.__aexit__ = AsyncMock(return_value=None)
|
||||
mock_pool = MagicMock()
|
||||
mock_pool.acquire = MagicMock(return_value=mock_cm)
|
||||
mock_pool = _webhook_mock_pool(mock_conn)
|
||||
|
||||
app = client.app
|
||||
real_json = app.state.settings.grafana_sources_json
|
||||
|
||||
Reference in New Issue
Block a user