"""Tests for system routes — health, version. These tests use the FastAPI TestClient against the real app. The health and version endpoints do NOT require authentication, so we can test them without setting up the full dependency injection. """ import pytest from fastapi.testclient import TestClient from wled_controller import __version__ @pytest.fixture(scope="module") def client(): """Provide a test client for the main app. The app module initializes stores from the default config on import, which is acceptable for read-only endpoints tested here. """ from wled_controller.main import app return TestClient(app, raise_server_exceptions=False) class TestHealthEndpoint: def test_health_returns_200(self, client): resp = client.get("/health") assert resp.status_code == 200 def test_health_response_structure(self, client): data = client.get("/health").json() assert data["status"] == "healthy" assert data["version"] == __version__ assert "timestamp" in data def test_health_no_auth_required(self, client): """Health endpoint should work without Authorization header.""" resp = client.get("/health") assert resp.status_code == 200 class TestVersionEndpoint: def test_version_returns_200(self, client): resp = client.get("/api/v1/version") assert resp.status_code == 200 def test_version_response_fields(self, client): data = client.get("/api/v1/version").json() assert data["version"] == __version__ assert "python_version" in data assert data["api_version"] == "v1" assert "demo_mode" in data class TestOpenAPIEndpoint: def test_openapi_available(self, client): resp = client.get("/openapi.json") assert resp.status_code == 200 data = resp.json() assert "info" in data assert data["info"]["version"] == __version__ def test_swagger_ui(self, client): resp = client.get("/docs") assert resp.status_code == 200 assert "text/html" in resp.headers["content-type"] class TestRootEndpoint: def test_root_returns_html(self, client): resp = client.get("/") assert resp.status_code == 200 assert "text/html" in resp.headers["content-type"]