homelab_automation/tests/backend/test_routes_health.py
Bruno Charest ecefbc8611
Some checks failed
Tests / Backend Tests (Python) (3.10) (push) Has been cancelled
Tests / Backend Tests (Python) (3.11) (push) Has been cancelled
Tests / Backend Tests (Python) (3.12) (push) Has been cancelled
Tests / Frontend Tests (JS) (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / All Tests Passed (push) Has been cancelled
Clean up test files and debug artifacts, add node_modules to gitignore, export DashboardManager for testing, and enhance pytest configuration with comprehensive test markers and settings
2025-12-15 08:15:49 -05:00

137 lines
4.6 KiB
Python

"""
Tests pour les routes de health check.
Couvre:
- Métriques système
- Health check global
- Health check par hôte
- Refresh des hôtes
"""
import pytest
from unittest.mock import patch, AsyncMock, MagicMock
from httpx import AsyncClient
pytestmark = pytest.mark.unit
class TestGetMetrics:
"""Tests pour GET /api/health."""
async def test_get_metrics(self, client: AsyncClient):
"""Récupère les métriques système."""
with patch("app.routes.health.db") as mock_db:
mock_db.metrics = MagicMock()
mock_db.metrics.dict.return_value = {
"cpu_percent": 25.0,
"memory_percent": 50.0,
"disk_percent": 30.0
}
response = await client.get("/api/health")
assert response.status_code == 200
class TestGlobalHealthCheck:
"""Tests pour GET /api/health/global."""
async def test_global_health_no_auth(self, client: AsyncClient):
"""Health check global ne requiert pas d'auth."""
# Remove API key
headers = dict(client.headers)
headers.pop("X-API-Key", None)
response = await client.get("/api/health/global")
assert response.status_code == 200
data = response.json()
assert data["status"] == "ok"
assert "timestamp" in data
async def test_global_health_returns_service_name(self, client: AsyncClient):
"""Retourne le nom du service."""
response = await client.get("/api/health/global")
assert response.status_code == 200
data = response.json()
assert data["service"] == "homelab-automation-api"
class TestHostHealthCheck:
"""Tests pour GET /api/health/{host_name}."""
async def test_health_check_host_not_found(self, client: AsyncClient):
"""Erreur si hôte non trouvé."""
with patch("app.routes.health.db") as mock_db:
mock_db.hosts = []
response = await client.get("/api/health/nonexistent-host")
assert response.status_code == 404
@pytest.mark.asyncio
async def test_health_check_host_online(self, client: AsyncClient):
"""Health check pour hôte en ligne."""
mock_host = MagicMock()
mock_host.name = "test-host"
mock_host.status = "online"
mock_host.os = "linux"
with patch("app.routes.health.db") as mock_db, \
patch("app.routes.health.ws_manager") as mock_ws:
mock_db.hosts = [mock_host]
mock_db.update_host_status = MagicMock()
mock_db.logs = MagicMock()
mock_db.logs.insert = MagicMock()
mock_ws.broadcast = AsyncMock()
response = await client.get("/api/health/test-host")
assert response.status_code == 200
data = response.json()
assert data["host"] == "test-host"
assert data["reachable"] is True
@pytest.mark.asyncio
async def test_health_check_host_offline(self, client: AsyncClient):
"""Health check pour hôte hors ligne."""
mock_host = MagicMock()
mock_host.name = "offline-host"
mock_host.status = "offline"
mock_host.os = "linux"
with patch("app.routes.health.db") as mock_db, \
patch("app.routes.health.ws_manager") as mock_ws:
mock_db.hosts = [mock_host]
mock_db.update_host_status = MagicMock()
mock_db.logs = MagicMock()
mock_db.logs.insert = MagicMock()
mock_ws.broadcast = AsyncMock()
response = await client.get("/api/health/offline-host")
assert response.status_code == 200
data = response.json()
assert data["reachable"] is False
class TestRefreshHosts:
"""Tests pour POST /api/health/refresh."""
@pytest.mark.asyncio
async def test_refresh_hosts(self, client: AsyncClient):
"""Refresh des hôtes depuis l'inventaire."""
with patch("app.services.ansible_service.ansible_service") as mock_ansible, \
patch("app.services.hybrid_db.db") as mock_db, \
patch("app.services.websocket_service.ws_manager") as mock_ws:
mock_ansible.invalidate_cache = MagicMock()
mock_db.refresh_hosts = MagicMock(return_value=[MagicMock(), MagicMock()])
mock_ws.broadcast = AsyncMock()
response = await client.post("/api/health/refresh")
assert response.status_code == 200
data = response.json()
assert "message" in data