diff --git a/src/aegis_gitea_mcp/tools/read_tools.py b/src/aegis_gitea_mcp/tools/read_tools.py index 594112a..ca439a2 100644 --- a/src/aegis_gitea_mcp/tools/read_tools.py +++ b/src/aegis_gitea_mcp/tools/read_tools.py @@ -272,9 +272,9 @@ async def get_issue_tool(gitea: GiteaClient, arguments: dict[str, Any]) -> dict[ "title": limit_text(str(issue.get("title", ""))), "body": limit_text(str(issue.get("body", ""))), "state": issue.get("state", ""), - "author": issue.get("user", {}).get("login", ""), - "labels": [label.get("name", "") for label in issue.get("labels", [])], - "assignees": [assignee.get("login", "") for assignee in issue.get("assignees", [])], + "author": (issue.get("user") or {}).get("login", ""), + "labels": [label.get("name", "") for label in (issue.get("labels") or [])], + "assignees": [assignee.get("login", "") for assignee in (issue.get("assignees") or [])], "created_at": issue.get("created_at", ""), "updated_at": issue.get("updated_at", ""), "url": issue.get("html_url", ""), diff --git a/tests/test_tools_extended.py b/tests/test_tools_extended.py index 8828c1c..5749c75 100644 --- a/tests/test_tools_extended.py +++ b/tests/test_tools_extended.py @@ -265,6 +265,34 @@ async def test_extended_read_tools_failure_mode() -> None: await list_commits_tool(ErrorGitea(), {"owner": "acme", "repo": "app"}) +@pytest.mark.asyncio +async def test_get_issue_tolerates_null_collections() -> None: + """Regression for #13: Gitea may return null for labels/assignees/user. + + `.get(key, [])` returns None when the key is present with a null value, so + iterating the result raised `'NoneType' object is not iterable`. + """ + + class NullFieldsGitea(StubGitea): + async def get_issue(self, owner, repo, index): + return { + "number": index, + "title": "Issue", + "body": "Body", + "state": "open", + "user": None, + "labels": None, + "assignees": None, + } + + result = await get_issue_tool( + NullFieldsGitea(), {"owner": "acme", "repo": "app", "issue_number": 1} + ) + assert result["author"] == "" + assert result["labels"] == [] + assert result["assignees"] == [] + + @pytest.mark.asyncio @pytest.mark.parametrize( "tool,args,expected_key",