"""IRM API с подменённым пулом БД (без PostgreSQL).""" from __future__ import annotations import pytest from fastapi.testclient import TestClient from starlette.requests import Request from onguard24.deps import get_pool from onguard24.main import app from tests.irm_db_fake import IrmFakePool @pytest.fixture def irm_client() -> tuple[TestClient, IrmFakePool]: pool = IrmFakePool() def override_get_pool(_request: Request): return pool app.dependency_overrides[get_pool] = override_get_pool with TestClient(app) as client: yield client, pool app.dependency_overrides.pop(get_pool, None) def test_irm_incident_crud_and_tasks(irm_client: tuple[TestClient, IrmFakePool]) -> None: client, _pool = irm_client r = client.post( "/api/v1/modules/incidents/", json={"title": "Сбой API", "status": "open", "severity": "critical"}, ) assert r.status_code == 201 iid = r.json()["id"] assert r.json()["source"] == "manual" r = client.get(f"/api/v1/modules/incidents/{iid}") assert r.status_code == 200 assert r.json()["title"] == "Сбой API" r = client.patch(f"/api/v1/modules/incidents/{iid}", json={"status": "resolved"}) assert r.status_code == 200 assert r.json()["status"] == "resolved" r = client.post( "/api/v1/modules/tasks/", json={"title": "Разбор логов", "incident_id": iid}, ) assert r.status_code == 201 tid = r.json()["id"] r = client.get(f"/api/v1/modules/incidents/{iid}/tasks") assert r.status_code == 200 assert len(r.json()["items"]) == 1 assert r.json()["items"][0]["id"] == tid r = client.get(f"/api/v1/modules/tasks/{tid}") assert r.status_code == 200 assert r.json()["status"] == "open" r = client.patch(f"/api/v1/modules/tasks/{tid}", json={"status": "done"}) assert r.status_code == 200 assert r.json()["status"] == "done" def test_irm_task_bad_incident(irm_client: tuple[TestClient, IrmFakePool]) -> None: client, _ = irm_client import uuid r = client.post( "/api/v1/modules/tasks/", json={"title": "x", "incident_id": str(uuid.uuid4())}, ) assert r.status_code == 400 assert r.json()["detail"] == "incident not found" def test_irm_incident_tasks_unknown(irm_client: tuple[TestClient, IrmFakePool]) -> None: client, _ = irm_client import uuid rid = str(uuid.uuid4()) r = client.get(f"/api/v1/modules/incidents/{rid}/tasks") assert r.status_code == 404 def test_irm_patch_validation(irm_client: tuple[TestClient, IrmFakePool]) -> None: client, _ = irm_client r = client.post("/api/v1/modules/incidents/", json={"title": "t"}) iid = r.json()["id"] r = client.patch(f"/api/v1/modules/incidents/{iid}", json={}) assert r.status_code == 400 def test_irm_escalations_crud(irm_client: tuple[TestClient, IrmFakePool]) -> None: client, _ = irm_client r = client.post( "/api/v1/modules/escalations/", json={"name": "L1", "enabled": True, "steps": [{"after_min": 5, "channel": "slack"}]}, ) assert r.status_code == 201 pid = r.json()["id"] assert r.json()["steps"][0]["channel"] == "slack" r = client.get(f"/api/v1/modules/escalations/{pid}") assert r.status_code == 200 assert r.json()["name"] == "L1" r = client.patch(f"/api/v1/modules/escalations/{pid}", json={"enabled": False}) assert r.status_code == 200 assert r.json()["enabled"] is False r = client.delete(f"/api/v1/modules/escalations/{pid}") assert r.status_code == 204 r = client.get(f"/api/v1/modules/escalations/{pid}") assert r.status_code == 404