"""Tests for the health check router.""" import pytest from httpx import AsyncClient from app.models.server import ServerStatus @pytest.mark.asyncio async def test_health_check_returns_200_when_online(client: AsyncClient) -> None: """``GET /api/health`` must return HTTP 200 when fail2ban is online.""" client._transport.app.state.server_status = ServerStatus(online=True) response = await client.get("/api/v1/health") assert response.status_code == 200 @pytest.mark.asyncio async def test_health_check_returns_503_when_offline(client: AsyncClient) -> None: """``GET /api/health`` must return HTTP 503 when fail2ban is offline.""" client._transport.app.state.server_status = ServerStatus(online=False) response = await client.get("/api/v1/health") assert response.status_code == 503 @pytest.mark.asyncio async def test_health_check_returns_ok_status_when_online(client: AsyncClient) -> None: """``GET /api/health`` must contain ``status: ok`` when fail2ban is online.""" client._transport.app.state.server_status = ServerStatus(online=True) response = await client.get("/api/v1/health") data: dict[str, str] = response.json() assert data["status"] == "ok" assert data["fail2ban"] == "online" @pytest.mark.asyncio async def test_health_check_returns_unavailable_when_offline(client: AsyncClient) -> None: """``GET /api/health`` must contain ``status: unavailable`` when fail2ban is offline.""" client._transport.app.state.server_status = ServerStatus(online=False) response = await client.get("/api/v1/health") data: dict[str, str] = response.json() assert data["status"] == "unavailable" assert data["fail2ban"] == "offline" @pytest.mark.asyncio async def test_health_check_content_type_is_json(client: AsyncClient) -> None: """``GET /api/health`` must set the ``Content-Type`` header to JSON.""" response = await client.get("/api/v1/health") assert "application/json" in response.headers.get("content-type", "")