diff --git a/src/main.py b/src/main.py index 6082fda..001422a 100644 --- a/src/main.py +++ b/src/main.py @@ -124,3 +124,13 @@ async def event_stream(): ) }, ) + except Exception: + return JSONResponse( + {"error": "Gitea event stream is temporarily unavailable"}, + status_code=503, + headers={ + "Retry-After": str( + max(1, math.ceil(EVENT_STREAM_TIMEOUT_SECONDS)) + ) + }, + ) diff --git a/tests/test_event_stream.py b/tests/test_event_stream.py index a369485..d72f036 100644 --- a/tests/test_event_stream.py +++ b/tests/test_event_stream.py @@ -74,6 +74,22 @@ async def test_event_stream_returns_retryable_response_when_gitea_exceeds_deadli assert cancelled.is_set() +@pytest.mark.anyio +async def test_event_stream_returns_retryable_response_when_gitea_request_fails(monkeypatch): + async def failing_activity_events(): + raise ConnectionError("connection refused") + + monkeypatch.setattr(main, "activity_events", failing_activity_events) + + response = await main.event_stream() + + assert response.status_code == 503 + assert response.headers["retry-after"] == "5" + assert json.loads(response.body) == { + "error": "Gitea event stream is temporarily unavailable" + } + + @pytest.mark.anyio async def test_activity_events_fetches_feed_for_authenticated_user(monkeypatch): paths = []