"""Tests for API endpoints (public + authenticated).""" import os import sys import pytest from fastapi.testclient import TestClient from wled_controller.main import app from wled_controller import __version__ from wled_controller.config import get_config _has_display = bool(os.environ.get("DISPLAY") or sys.platform == "win32" or sys.platform == "darwin") requires_display = pytest.mark.skipif(not _has_display, reason="No display available (headless CI)") client = TestClient(app) # Build auth header from the first configured API key _config = get_config() _api_key = next(iter(_config.auth.api_keys.values()), "") AUTH_HEADERS = {"Authorization": f"Bearer {_api_key}"} if _api_key else {} def test_root_endpoint(): """Test root endpoint returns the HTML dashboard.""" response = client.get("/") assert response.status_code == 200 assert "text/html" in response.headers["content-type"] def test_health_check(): """Test health check endpoint.""" response = client.get("/health") assert response.status_code == 200 data = response.json() assert data["status"] == "healthy" assert data["version"] == __version__ assert "timestamp" in data def test_version_endpoint(): """Test version endpoint.""" response = client.get("/api/v1/version") assert response.status_code == 200 data = response.json() assert data["version"] == __version__ assert "python_version" in data assert data["api_version"] == "v1" @requires_display def test_get_displays(): """Test get displays endpoint (requires auth and a real display).""" response = client.get("/api/v1/config/displays", headers=AUTH_HEADERS) assert response.status_code == 200 data = response.json() assert "displays" in data assert "count" in data assert isinstance(data["displays"], list) assert data["count"] >= 0 # If displays are found, validate structure if data["count"] > 0: display = data["displays"][0] assert "index" in display assert "name" in display assert "width" in display assert "height" in display assert "is_primary" in display def test_openapi_docs(): """Test OpenAPI documentation is available.""" response = client.get("/openapi.json") assert response.status_code == 200 data = response.json() assert data["info"]["version"] == __version__ def test_swagger_ui(): """Test Swagger UI is available.""" response = client.get("/docs") assert response.status_code == 200 assert "text/html" in response.headers["content-type"]