From c97f1f584ed80da77e9314752a64efa76e050ae1 Mon Sep 17 00:00:00 2001 From: LuisFigueroaG Date: Fri, 30 Oct 2026 19:17:32 -0300 Subject: [PATCH] [Confluence] ConfluenceCloud: fix get_user Cloud.get_user requests /wiki/rest/api/user/{user_id}, but the v1 user API has no such endpoint, so the call always fails with a 404. Users are looked up with GET /wiki/rest/api/user?accountId=..., the same endpoint and query parameter the Server get_user_details_by_accountid uses. Send the account ID as the accountId query parameter instead. Extra params passed by the caller are kept. --- atlassian/confluence/cloud/__init__.py | 8 +++++-- tests/confluence/test_confluence_cloud.py | 27 ++++++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/atlassian/confluence/cloud/__init__.py b/atlassian/confluence/cloud/__init__.py index 24ad4b6a0..afad9f4d0 100644 --- a/atlassian/confluence/cloud/__init__.py +++ b/atlassian/confluence/cloud/__init__.py @@ -640,8 +640,12 @@ def get_users(self, **kwargs): return self.get("rest/api/user", **kwargs) def get_user(self, user_id, **kwargs): - """Get user by ID.""" - return self.get(f"rest/api/user/{user_id}", **kwargs) + """Get user by account ID. + + :param user_id: the user's account ID + """ + params = {**(kwargs.pop("params", None) or {}), "accountId": user_id} + return self.get("rest/api/user", params=params, **kwargs) def get_current_user(self, **kwargs): """Get current user.""" diff --git a/tests/confluence/test_confluence_cloud.py b/tests/confluence/test_confluence_cloud.py index da9ef56ae..ed2816a5e 100644 --- a/tests/confluence/test_confluence_cloud.py +++ b/tests/confluence/test_confluence_cloud.py @@ -694,10 +694,31 @@ def test_get_users(self, mock_get, confluence_cloud): @patch.object(ConfluenceCloud, "get") def test_get_user(self, mock_get, confluence_cloud): """Test get_user method.""" - mock_get.return_value = {"id": "user1", "name": "Test User"} + mock_get.return_value = {"accountId": "user1", "displayName": "Test User"} result = confluence_cloud.get_user("user1") - mock_get.assert_called_once_with("rest/api/user/user1", **{}) - assert result == {"id": "user1", "name": "Test User"} + mock_get.assert_called_once_with("rest/api/user", params={"accountId": "user1"}) + assert result == {"accountId": "user1", "displayName": "Test User"} + + @patch.object(ConfluenceCloud, "get") + def test_get_user_keeps_extra_params(self, mock_get, confluence_cloud): + mock_get.return_value = {"accountId": "user1"} + + assert confluence_cloud.get_user("user1", params={"expand": "personalSpace"}) == {"accountId": "user1"} + mock_get.assert_called_once_with("rest/api/user", params={"expand": "personalSpace", "accountId": "user1"}) + + def test_get_user_requests_wiki_user_endpoint(self, confluence_cloud): + response = Response() + response.status_code = 200 + response._content = b'{"accountId": "557058:f58131cb", "displayName": "Test User"}' + + with patch.object(confluence_cloud._session, "request", return_value=response) as mock_request: + assert confluence_cloud.get_user("557058:f58131cb") == { + "accountId": "557058:f58131cb", + "displayName": "Test User", + } + + url = mock_request.call_args.kwargs["url"] + assert url == "https://test.atlassian.net/wiki/rest/api/user?accountId=557058%3Af58131cb" @patch.object(ConfluenceCloud, "get") def test_get_current_user(self, mock_get, confluence_cloud):