import asyncio import json import pytest from src import main def test_health_endpoint_reports_service_liveness_without_gitea_access(): assert any(getattr(route, "path", None) == "/healthz" for route in main.app.routes) assert main.health() == {"status": "ok", "service": "stackchain-dashboard"} @pytest.mark.anyio async def test_readiness_endpoint_reports_connected_gitea_user(monkeypatch): async def connected_user(): return {"login": "timmy"} monkeypatch.setattr(main, "current_user", connected_user) response = await main.readiness() assert any(getattr(route, "path", None) == "/readyz" for route in main.app.routes) assert response == { "status": "ready", "service": "stackchain-dashboard", "gitea_user": "timmy", } @pytest.mark.anyio async def test_readiness_endpoint_returns_503_when_gitea_is_unavailable(monkeypatch): async def unavailable_user(): raise RuntimeError("connection refused") monkeypatch.setattr(main, "current_user", unavailable_user) response = await main.readiness() assert response.status_code == 503 assert b'"status":"not_ready"' in response.body assert b'"error":"connection refused"' in response.body @pytest.mark.anyio async def test_readiness_endpoint_returns_503_for_null_current_user_payload(monkeypatch): async def null_user(): return None monkeypatch.setattr(main, "current_user", null_user) response = await main.readiness() assert response.status_code == 503 assert json.loads(response.body) == { "status": "not_ready", "service": "stackchain-dashboard", "error": "Gitea current-user response did not include a login", } @pytest.mark.anyio async def test_readiness_endpoint_times_out_and_cancels_stalled_gitea_check(monkeypatch): cancelled = asyncio.Event() async def hanging_user(): try: await asyncio.sleep(0.05) return {"login": "too-late"} finally: cancelled.set() monkeypatch.setattr(main, "READINESS_TIMEOUT_SECONDS", 0.01, raising=False) monkeypatch.setattr(main, "current_user", hanging_user) response = await main.readiness() assert response.status_code == 503 assert response.headers["retry-after"] == "1" assert json.loads(response.body) == { "status": "not_ready", "service": "stackchain-dashboard", "error": "Gitea readiness check timed out after 0.01s", } assert cancelled.is_set()