90 lines
2.6 KiB
Python
90 lines
2.6 KiB
Python
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_hides_unexpected_upstream_error_details(monkeypatch):
|
|
async def unavailable_user():
|
|
raise RuntimeError("secret internal upstream detail")
|
|
|
|
monkeypatch.setattr(main, "current_user", unavailable_user)
|
|
|
|
response = await main.readiness()
|
|
|
|
assert response.status_code == 503
|
|
assert json.loads(response.body) == {
|
|
"status": "not_ready",
|
|
"service": "stackchain-dashboard",
|
|
"error": "Gitea readiness check is temporarily unavailable",
|
|
}
|
|
assert b"secret internal upstream detail" not 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()
|