"""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(client: AsyncClient) -> None:
    """``GET /api/health`` must return HTTP 200."""
    response = await client.get("/api/health")
    assert response.status_code == 200


@pytest.mark.asyncio
async def test_health_check_returns_ok_status(client: AsyncClient) -> None:
    """``GET /api/health`` must contain ``status: ok`` and a ``fail2ban`` field."""
    response = await client.get("/api/health")
    data: dict[str, str] = response.json()
    assert data["status"] == "ok"
    assert data["fail2ban"] in ("online", "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/health")
    assert "application/json" in response.headers.get("content-type", "")


@pytest.mark.asyncio
async def test_health_check_respects_cached_server_status(client: AsyncClient) -> None:
    """The health response should reflect the injected cached server status."""
    client._transport.app.state.server_status = ServerStatus(online=True)

    response = await client.get("/api/health")

    assert response.status_code == 200
    assert response.json()["fail2ban"] == "online"
