diff --git a/src/main.py b/src/main.py index 714be72..e4270c7 100644 --- a/src/main.py +++ b/src/main.py @@ -107,7 +107,23 @@ async def context() -> JSONResponse: and all(field in r for field in ("id", "name", "full_name", "html_url")) ] issue_models = [ - Issue(id=i["id"], number=i["number"], title=i["title"], state=i["state"], labels=[l.get("name", "") for l in (i.get("labels") or [])], assignees=[a.get("login", "") for a in (i.get("assignees") or [])], url=i["html_url"]) + Issue( + id=i["id"], + number=i["number"], + title=i["title"], + state=i["state"], + labels=[ + label.get("name", "") + for label in (i.get("labels") or []) + if isinstance(label, dict) + ], + assignees=[ + assignee.get("login", "") + for assignee in (i.get("assignees") or []) + if isinstance(assignee, dict) + ], + url=i["html_url"], + ) for i in (issues_data or [])[:50] if isinstance(i, dict) and all( diff --git a/tests/test_context_timeout.py b/tests/test_context_timeout.py index d3e2b22..5fbc2bb 100644 --- a/tests/test_context_timeout.py +++ b/tests/test_context_timeout.py @@ -65,6 +65,37 @@ async def test_context_normalizes_nullable_issue_collections(monkeypatch): assert issue["assignees"] == [] +@pytest.mark.anyio +async def test_context_skips_malformed_nested_issue_metadata(monkeypatch): + async def user(): + return {"id": 1, "login": "timmy"} + + async def empty_collection(): + return [] + + async def issue_collection(): + return [{ + "id": 85, + "number": 85, + "title": "Malformed nested metadata", + "state": "open", + "labels": [None, {"name": "bug"}, "invalid"], + "assignees": [None, {"login": "timmy"}, "invalid"], + "html_url": "https://forge.example/issues/85", + }] + + 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"] == ["bug"] + assert issue["assignees"] == ["timmy"] + + @pytest.mark.anyio async def test_context_normalizes_nullable_repository_description(monkeypatch): async def user():