import asyncio import json import pytest from src import main @pytest.mark.anyio async def test_context_returns_fallback_when_gitea_exceeds_deadline(monkeypatch): cancelled = asyncio.Event() async def hanging_current_user(): try: await asyncio.Event().wait() finally: cancelled.set() async def empty_collection(): return [] monkeypatch.setattr(main, "CONTEXT_TIMEOUT_SECONDS", 0.01) monkeypatch.setattr(main, "current_user", hanging_current_user) monkeypatch.setattr(main, "repos", empty_collection) monkeypatch.setattr(main, "issues", empty_collection) monkeypatch.setattr(main, "pull_requests", empty_collection) response = await main.context() assert response.status_code == 200 assert response.headers["retry-after"] == "1" assert b'"repos":[]' in response.body assert b'"error":"Gitea context request timed out after 0.01s"' in response.body assert cancelled.is_set() @pytest.mark.anyio async def test_context_normalizes_nullable_issue_collections(monkeypatch): async def user(): return {"id": 1, "login": "timmy"} async def empty_collection(): return [] async def issue_collection(): return [{ "id": 50, "number": 50, "title": "Nullable metadata", "state": "open", "labels": None, "assignees": None, "html_url": "https://forge.example/issues/50", }] monkeypatch.setattr(main, "current_user", user) monkeypatch.setattr(main, "repos", empty_collection) monkeypatch.setattr(main, "issues", issue_collection) monkeypatch.setattr(main, "pull_requests", empty_collection) response = await main.context() issue = json.loads(response.body)["issues"][0] assert issue["labels"] == [] assert issue["assignees"] == []