This is an automated email from the ASF dual-hosted git repository.

jerryshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 41cb729b6e [#3767] refactor(client-python): Share metalake operation 
test fixtures (#11993)
41cb729b6e is described below

commit 41cb729b6ee1e00037ee7b52ae7379a437e727e8
Author: Henry Chen <[email protected]>
AuthorDate: Thu Jul 16 19:30:49 2026 +0800

    [#3767] refactor(client-python): Share metalake operation test fixtures 
(#11993)
    
    ### What changes were proposed in this pull request?
    
    - Add shared Python client unit test fixtures for metalake operation
    tests.
    - Move repeated user, group, and role DTO builders into
    `operation_test_fixtures.py`.
    - Share the `GravitinoClient` test instance creation and `get_metalake`
    mock setup across user, group, and role delegate tests.
    - Update metalake user/group/role unit tests to reuse the shared helpers
    instead of duplicating setup code.
    
    ### Why are the changes needed?
    
    The metalake user, group, and role operation unit tests duplicated
    similar DTO construction and client mock setup code. This contributes to
    the Python client's duplicate-code pylint cleanup work and makes the
    tests harder to keep consistent.
    
    Centralizing these fixtures reduces repeated test boilerplate while
    keeping the tested behavior unchanged.
    
    Related to #3767.
    
    ### Does this PR introduce *any* user-facing change?
    
    No.
    
    ### How was this patch tested?
    
    - `PYTHONPATH=.
    /private/tmp/gravitino-client-python-test-venv/bin/python -m unittest
    tests.unittests.client.test_metalake_user_operations
    tests.unittests.client.test_metalake_group_operations
    tests.unittests.client.test_metalake_role_operations`
      - Result: `Ran 54 tests`, `OK`
    - `PYTHONPATH=. PYLINTHOME=/private/tmp/gravitino-pylint-cache
    /private/tmp/gravitino-client-python-test-venv/bin/pylint
    --rcfile=pylintrc --persistent=n
    tests/unittests/client/operation_test_fixtures.py
    tests/unittests/client/test_metalake_user_operations.py
    tests/unittests/client/test_metalake_group_operations.py
    tests/unittests/client/test_metalake_role_operations.py`
      - Result: `10.00/10`
    - `git diff --check`
---
 .../unittests/client/operation_test_fixtures.py    |  89 +++++++++++
 .../client/test_metalake_group_operations.py       |  73 +++------
 .../client/test_metalake_role_operations.py        | 167 ++++++---------------
 .../client/test_metalake_user_operations.py        |  73 +++------
 4 files changed, 174 insertions(+), 228 deletions(-)

diff --git 
a/clients/client-python/tests/unittests/client/operation_test_fixtures.py 
b/clients/client-python/tests/unittests/client/operation_test_fixtures.py
new file mode 100644
index 0000000000..63cdcb96df
--- /dev/null
+++ b/clients/client-python/tests/unittests/client/operation_test_fixtures.py
@@ -0,0 +1,89 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+from unittest.mock import patch
+
+from gravitino.client.gravitino_client import GravitinoClient
+from gravitino.dto.audit_dto import AuditDTO
+from gravitino.dto.authorization.group_dto import GroupDTO
+from gravitino.dto.authorization.role_dto import RoleDTO
+from gravitino.dto.authorization.user_dto import UserDTO
+from tests.unittests import mock_base
+
+
+def build_default_audit() -> AuditDTO:
+    return mock_base.build_audit_info()
+
+
+def build_admin_audit() -> AuditDTO:
+    return AuditDTO(_creator="admin", _create_time="2024-01-01T00:00:00Z")
+
+
+def build_user_dto(
+    name: str = "alice",
+    roles: list | None = None,
+    audit: AuditDTO | None = None,
+) -> UserDTO:
+    return (
+        UserDTO.builder()
+        .with_name(name)
+        .with_roles(roles if roles is not None else [])
+        .with_audit(audit or build_default_audit())
+        .build()
+    )
+
+
+def build_group_dto(
+    name: str = "engineers",
+    roles: list | None = None,
+    audit: AuditDTO | None = None,
+) -> GroupDTO:
+    return (
+        GroupDTO.builder()
+        .with_name(name)
+        .with_roles(roles if roles is not None else [])
+        .with_audit(audit or build_default_audit())
+        .build()
+    )
+
+
+def build_role_dto(
+    name: str = "admin_role",
+    props: dict | None = None,
+    sec_objs: list | None = None,
+    audit: AuditDTO | None = None,
+) -> RoleDTO:
+    return (
+        RoleDTO.builder()
+        .with_name(name)
+        .with_properties(props)
+        .with_securable_objects(sec_objs or [])
+        .with_audit(audit or build_admin_audit())
+        .build()
+    )
+
+
+def make_gravitino_client() -> GravitinoClient:
+    return GravitinoClient.__new__(GravitinoClient)
+
+
+def mock_get_metalake():
+    return patch.object(
+        GravitinoClient,
+        "get_metalake",
+        return_value=mock_base.mock_load_metalake(),
+    )
diff --git 
a/clients/client-python/tests/unittests/client/test_metalake_group_operations.py
 
b/clients/client-python/tests/unittests/client/test_metalake_group_operations.py
index 4aa5963a6b..388b053ef6 100644
--- 
a/clients/client-python/tests/unittests/client/test_metalake_group_operations.py
+++ 
b/clients/client-python/tests/unittests/client/test_metalake_group_operations.py
@@ -18,8 +18,6 @@
 import unittest
 from unittest.mock import patch
 
-from gravitino.client.gravitino_client import GravitinoClient
-from gravitino.dto.authorization.group_dto import GroupDTO
 from gravitino.dto.requests.group_add_request import GroupAddRequest
 from gravitino.dto.responses.remove_response import RemoveResponse
 from gravitino.dto.responses.group_response import (
@@ -35,16 +33,11 @@ from gravitino.exceptions.base import (
 )
 from gravitino.exceptions.handlers.group_error_handler import 
GROUP_ERROR_HANDLER
 from tests.unittests import mock_base
-
-
-def _build_group_dto(name: str = "engineers", roles: list | None = None) -> 
GroupDTO:
-    return (
-        GroupDTO.builder()
-        .with_name(name)
-        .with_roles(roles if roles is not None else [])
-        .with_audit(mock_base.build_audit_info())
-        .build()
-    )
+from tests.unittests.client.operation_test_fixtures import (
+    build_group_dto,
+    make_gravitino_client,
+    mock_get_metalake,
+)
 
 
 class TestMetalakeGroupOperations(unittest.TestCase):
@@ -53,7 +46,7 @@ class TestMetalakeGroupOperations(unittest.TestCase):
 
     def test_add_group(self):
         metalake = mock_base.mock_load_metalake()
-        group = _build_group_dto()
+        group = build_group_dto()
         mock_resp = mock_base.mock_http_response(GroupResponse(0, 
group).to_json())
 
         with patch(
@@ -87,7 +80,7 @@ class TestMetalakeGroupOperations(unittest.TestCase):
 
     def test_get_group(self):
         metalake = mock_base.mock_load_metalake()
-        group = _build_group_dto(roles=["role_a", "role_b"])
+        group = build_group_dto(roles=["role_a", "role_b"])
         mock_resp = mock_base.mock_http_response(GroupResponse(0, 
group).to_json())
 
         with patch(
@@ -139,7 +132,7 @@ class TestMetalakeGroupOperations(unittest.TestCase):
 
     def test_list_groups(self):
         metalake = mock_base.mock_load_metalake()
-        groups = [_build_group_dto("alice"), _build_group_dto("bob")]
+        groups = [build_group_dto("alice"), build_group_dto("bob")]
         mock_resp = mock_base.mock_http_response(GroupListResponse(0, 
groups).to_json())
 
         with patch(
@@ -185,20 +178,12 @@ class TestMetalakeGroupOperations(unittest.TestCase):
 class TestGravitinoClientGroupDelegates(unittest.TestCase):
     """Verify that GravitinoClient correctly delegates Group operations."""
 
-    def _make_client(self):
-        client = GravitinoClient.__new__(GravitinoClient)
-        return client
-
     def test_client_add_group(self):
-        client = self._make_client()
-        group = _build_group_dto()
+        client = make_gravitino_client()
+        group = build_group_dto()
         mock_resp = mock_base.mock_http_response(GroupResponse(0, 
group).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.post", 
return_value=mock_resp
             ),
@@ -207,29 +192,21 @@ class 
TestGravitinoClientGroupDelegates(unittest.TestCase):
             self.assertEqual("engineers", result.name())
 
     def test_client_get_group(self):
-        client = self._make_client()
-        group = _build_group_dto(roles=["r1"])
+        client = make_gravitino_client()
+        group = build_group_dto(roles=["r1"])
         mock_resp = mock_base.mock_http_response(GroupResponse(0, 
group).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch("gravitino.utils.http_client.HTTPClient.get", 
return_value=mock_resp),
         ):
             result = client.get_group("engineers")
             self.assertEqual(["r1"], result.roles())
 
     def test_client_remove_group(self):
-        client = self._make_client()
+        client = make_gravitino_client()
         mock_resp = mock_base.mock_http_response(RemoveResponse(0, 
True).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.delete", 
return_value=mock_resp
             ),
@@ -237,31 +214,23 @@ class 
TestGravitinoClientGroupDelegates(unittest.TestCase):
             self.assertTrue(client.remove_group("engineers"))
 
     def test_client_list_groups(self):
-        client = self._make_client()
-        groups = [_build_group_dto("alice"), _build_group_dto("bob")]
+        client = make_gravitino_client()
+        groups = [build_group_dto("alice"), build_group_dto("bob")]
         mock_resp = mock_base.mock_http_response(GroupListResponse(0, 
groups).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch("gravitino.utils.http_client.HTTPClient.get", 
return_value=mock_resp),
         ):
             result = client.list_groups()
             self.assertEqual(["alice", "bob"], [u.name() for u in result])
 
     def test_client_list_group_names(self):
-        client = self._make_client()
+        client = make_gravitino_client()
         mock_resp = mock_base.mock_http_response(
             GroupNamesListResponse(0, ["alice", "bob"]).to_json()
         )
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch("gravitino.utils.http_client.HTTPClient.get", 
return_value=mock_resp),
         ):
             result = client.list_group_names()
diff --git 
a/clients/client-python/tests/unittests/client/test_metalake_role_operations.py 
b/clients/client-python/tests/unittests/client/test_metalake_role_operations.py
index 50a2b34270..89905ce3f8 100644
--- 
a/clients/client-python/tests/unittests/client/test_metalake_role_operations.py
+++ 
b/clients/client-python/tests/unittests/client/test_metalake_role_operations.py
@@ -21,13 +21,8 @@ from unittest.mock import patch
 from gravitino.api.authorization.privileges import Privilege
 from gravitino.api.authorization.securable_objects import SecurableObjects
 from gravitino.api.metadata_object import MetadataObject
-from gravitino.client.gravitino_client import GravitinoClient
-from gravitino.dto.audit_dto import AuditDTO
-from gravitino.dto.authorization.group_dto import GroupDTO
 from gravitino.dto.authorization.privilege_dto import PrivilegeDTO
-from gravitino.dto.authorization.role_dto import RoleDTO
 from gravitino.dto.authorization.securable_object_dto import SecurableObjectDTO
-from gravitino.dto.authorization.user_dto import UserDTO
 from gravitino.dto.requests.role_create_request import RoleCreateRequest
 from gravitino.dto.requests.role_grant_request import RoleGrantRequest
 from gravitino.dto.requests.role_revoke_request import RoleRevokeRequest
@@ -49,45 +44,13 @@ from gravitino.exceptions.handlers.permission_error_handler 
import (
 )
 from gravitino.exceptions.handlers.role_error_handler import ROLE_ERROR_HANDLER
 from tests.unittests import mock_base
-
-
-def _audit() -> AuditDTO:
-    return AuditDTO(_creator="admin", _create_time="2024-01-01T00:00:00Z")
-
-
-def _build_role_dto(
-    name: str = "admin_role",
-    props: dict | None = None,
-    sec_objs: list | None = None,
-) -> RoleDTO:
-    return (
-        RoleDTO.builder()
-        .with_name(name)
-        .with_properties(props)
-        .with_securable_objects(sec_objs or [])
-        .with_audit(_audit())
-        .build()
-    )
-
-
-def _build_user_dto(name: str = "alice", roles: list | None = None) -> UserDTO:
-    return (
-        UserDTO.builder()
-        .with_name(name)
-        .with_roles(roles or [])
-        .with_audit(_audit())
-        .build()
-    )
-
-
-def _build_group_dto(name: str = "engineers", roles: list | None = None) -> 
GroupDTO:
-    return (
-        GroupDTO.builder()
-        .with_name(name)
-        .with_roles(roles if roles is not None else [])
-        .with_audit(_audit())
-        .build()
-    )
+from tests.unittests.client.operation_test_fixtures import (
+    build_group_dto,
+    build_role_dto,
+    build_user_dto,
+    make_gravitino_client,
+    mock_get_metalake,
+)
 
 
 class TestMetalakeRoleOperations(unittest.TestCase):
@@ -117,7 +80,7 @@ class TestMetalakeRoleOperations(unittest.TestCase):
                 [PrivilegeDTO(Privilege.Name.USE_CATALOG, 
Privilege.Condition.ALLOW)],
             )
         ]
-        role = _build_role_dto(sec_objs=sec_objs)
+        role = build_role_dto(sec_objs=sec_objs)
         mock_resp = mock_base.mock_http_response(RoleResponse(0, 
role).to_json())
 
         with patch(
@@ -164,7 +127,7 @@ class TestMetalakeRoleOperations(unittest.TestCase):
 
     def test_get_role(self):
         metalake = mock_base.mock_load_metalake()
-        role = _build_role_dto(props={"k": "v"})
+        role = build_role_dto(props={"k": "v"})
         mock_resp = mock_base.mock_http_response(RoleResponse(0, 
role).to_json())
 
         with patch(
@@ -237,7 +200,7 @@ class TestMetalakeRoleOperations(unittest.TestCase):
 
     def test_grant_roles_to_user(self):
         metalake = mock_base.mock_load_metalake()
-        user = _build_user_dto(roles=["admin_role"])
+        user = build_user_dto(roles=["admin_role"])
         mock_resp = mock_base.mock_http_response(UserResponse(0, 
user).to_json())
 
         with patch(
@@ -260,7 +223,7 @@ class TestMetalakeRoleOperations(unittest.TestCase):
 
     def test_revoke_roles_from_user(self):
         metalake = mock_base.mock_load_metalake()
-        user = _build_user_dto(roles=[])
+        user = build_user_dto(roles=[])
         mock_resp = mock_base.mock_http_response(UserResponse(0, 
user).to_json())
 
         with patch(
@@ -282,7 +245,7 @@ class TestMetalakeRoleOperations(unittest.TestCase):
 
     def test_grant_roles_to_group(self):
         metalake = mock_base.mock_load_metalake()
-        group = _build_group_dto(roles=["admin_role"])
+        group = build_group_dto(roles=["admin_role"])
         mock_resp = mock_base.mock_http_response(GroupResponse(0, 
group).to_json())
 
         with patch(
@@ -304,7 +267,7 @@ class TestMetalakeRoleOperations(unittest.TestCase):
 
     def test_revoke_roles_from_group(self):
         metalake = mock_base.mock_load_metalake()
-        group = _build_group_dto(roles=[])
+        group = build_group_dto(roles=[])
         mock_resp = mock_base.mock_http_response(GroupResponse(0, 
group).to_json())
 
         with patch(
@@ -333,7 +296,7 @@ class TestMetalakeRoleOperations(unittest.TestCase):
                 PrivilegeDTO(Privilege.Name.CREATE_SCHEMA, 
Privilege.Condition.ALLOW),
             ],
         )
-        role = _build_role_dto(sec_objs=[sec_obj])
+        role = build_role_dto(sec_objs=[sec_obj])
         mock_resp = mock_base.mock_http_response(RoleResponse(0, 
role).to_json())
 
         with patch(
@@ -365,7 +328,7 @@ class TestMetalakeRoleOperations(unittest.TestCase):
 
     def test_revoke_privileges_from_role(self):
         metalake = mock_base.mock_load_metalake()
-        role = _build_role_dto(sec_objs=[])
+        role = build_role_dto(sec_objs=[])
         mock_resp = mock_base.mock_http_response(RoleResponse(0, 
role).to_json())
 
         with patch(
@@ -396,20 +359,12 @@ class TestMetalakeRoleOperations(unittest.TestCase):
 class TestGravitinoClientRoleDelegates(unittest.TestCase):
     """Verify that GravitinoClient correctly delegates Role operations."""
 
-    def _make_client(self):
-        client = GravitinoClient.__new__(GravitinoClient)
-        return client
-
     def test_client_create_role(self):
-        client = self._make_client()
-        role = _build_role_dto()
+        client = make_gravitino_client()
+        role = build_role_dto()
         mock_resp = mock_base.mock_http_response(RoleResponse(0, 
role).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.post",
                 return_value=mock_resp,
@@ -419,15 +374,11 @@ class TestGravitinoClientRoleDelegates(unittest.TestCase):
             self.assertEqual("admin_role", result.name())
 
     def test_client_get_role(self):
-        client = self._make_client()
-        role = _build_role_dto(props={"k": "v"})
+        client = make_gravitino_client()
+        role = build_role_dto(props={"k": "v"})
         mock_resp = mock_base.mock_http_response(RoleResponse(0, 
role).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.get",
                 return_value=mock_resp,
@@ -437,14 +388,10 @@ class TestGravitinoClientRoleDelegates(unittest.TestCase):
             self.assertEqual({"k": "v"}, result.properties())
 
     def test_client_delete_role(self):
-        client = self._make_client()
+        client = make_gravitino_client()
         mock_resp = mock_base.mock_http_response(DropResponse(0, 
True).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.delete",
                 return_value=mock_resp,
@@ -453,16 +400,12 @@ class TestGravitinoClientRoleDelegates(unittest.TestCase):
             self.assertTrue(client.delete_role("admin_role"))
 
     def test_client_list_role_names(self):
-        client = self._make_client()
+        client = make_gravitino_client()
         mock_resp = mock_base.mock_http_response(
             RoleNamesListResponse(0, ["role1", "role2"]).to_json()
         )
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.get",
                 return_value=mock_resp,
@@ -472,15 +415,11 @@ class TestGravitinoClientRoleDelegates(unittest.TestCase):
             self.assertEqual(["role1", "role2"], result)
 
     def test_client_grant_roles_to_user(self):
-        client = self._make_client()
-        user = _build_user_dto(roles=["admin_role"])
+        client = make_gravitino_client()
+        user = build_user_dto(roles=["admin_role"])
         mock_resp = mock_base.mock_http_response(UserResponse(0, 
user).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.put",
                 return_value=mock_resp,
@@ -490,15 +429,11 @@ class TestGravitinoClientRoleDelegates(unittest.TestCase):
             self.assertEqual(["admin_role"], result.roles())
 
     def test_client_revoke_roles_from_user(self):
-        client = self._make_client()
-        user = _build_user_dto(roles=[])
+        client = make_gravitino_client()
+        user = build_user_dto(roles=[])
         mock_resp = mock_base.mock_http_response(UserResponse(0, 
user).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.put",
                 return_value=mock_resp,
@@ -508,15 +443,11 @@ class TestGravitinoClientRoleDelegates(unittest.TestCase):
             self.assertEqual([], result.roles())
 
     def test_client_grant_roles_to_group(self):
-        client = self._make_client()
-        group = _build_group_dto(roles=["admin_role"])
+        client = make_gravitino_client()
+        group = build_group_dto(roles=["admin_role"])
         mock_resp = mock_base.mock_http_response(GroupResponse(0, 
group).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.put",
                 return_value=mock_resp,
@@ -526,15 +457,11 @@ class TestGravitinoClientRoleDelegates(unittest.TestCase):
             self.assertEqual(["admin_role"], result.roles())
 
     def test_client_revoke_roles_from_group(self):
-        client = self._make_client()
-        group = _build_group_dto(roles=[])
+        client = make_gravitino_client()
+        group = build_group_dto(roles=[])
         mock_resp = mock_base.mock_http_response(GroupResponse(0, 
group).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.put",
                 return_value=mock_resp,
@@ -544,15 +471,11 @@ class TestGravitinoClientRoleDelegates(unittest.TestCase):
             self.assertEqual([], result.roles())
 
     def test_client_grant_privileges_to_role(self):
-        client = self._make_client()
-        role = _build_role_dto()
+        client = make_gravitino_client()
+        role = build_role_dto()
         mock_resp = mock_base.mock_http_response(RoleResponse(0, 
role).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.put",
                 return_value=mock_resp,
@@ -570,15 +493,11 @@ class TestGravitinoClientRoleDelegates(unittest.TestCase):
             self.assertEqual("admin_role", result.name())
 
     def test_client_revoke_privileges_from_role(self):
-        client = self._make_client()
-        role = _build_role_dto()
+        client = make_gravitino_client()
+        role = build_role_dto()
         mock_resp = mock_base.mock_http_response(RoleResponse(0, 
role).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.put",
                 return_value=mock_resp,
diff --git 
a/clients/client-python/tests/unittests/client/test_metalake_user_operations.py 
b/clients/client-python/tests/unittests/client/test_metalake_user_operations.py
index da0b67e53f..d7c2eadaf0 100644
--- 
a/clients/client-python/tests/unittests/client/test_metalake_user_operations.py
+++ 
b/clients/client-python/tests/unittests/client/test_metalake_user_operations.py
@@ -18,8 +18,6 @@
 import unittest
 from unittest.mock import patch
 
-from gravitino.client.gravitino_client import GravitinoClient
-from gravitino.dto.authorization.user_dto import UserDTO
 from gravitino.dto.requests.user_add_request import UserAddRequest
 from gravitino.dto.responses.remove_response import RemoveResponse
 from gravitino.dto.responses.user_response import (
@@ -35,16 +33,11 @@ from gravitino.exceptions.base import (
 )
 from gravitino.exceptions.handlers.user_error_handler import USER_ERROR_HANDLER
 from tests.unittests import mock_base
-
-
-def _build_user_dto(name: str = "alice", roles: list | None = None) -> UserDTO:
-    return (
-        UserDTO.builder()
-        .with_name(name)
-        .with_roles(roles if roles is not None else [])
-        .with_audit(mock_base.build_audit_info())
-        .build()
-    )
+from tests.unittests.client.operation_test_fixtures import (
+    build_user_dto,
+    make_gravitino_client,
+    mock_get_metalake,
+)
 
 
 class TestMetalakeUserOperations(unittest.TestCase):
@@ -53,7 +46,7 @@ class TestMetalakeUserOperations(unittest.TestCase):
 
     def test_add_user(self):
         metalake = mock_base.mock_load_metalake()
-        user = _build_user_dto()
+        user = build_user_dto()
         mock_resp = mock_base.mock_http_response(UserResponse(0, 
user).to_json())
 
         with patch(
@@ -87,7 +80,7 @@ class TestMetalakeUserOperations(unittest.TestCase):
 
     def test_get_user(self):
         metalake = mock_base.mock_load_metalake()
-        user = _build_user_dto(roles=["role_a", "role_b"])
+        user = build_user_dto(roles=["role_a", "role_b"])
         mock_resp = mock_base.mock_http_response(UserResponse(0, 
user).to_json())
 
         with patch(
@@ -139,7 +132,7 @@ class TestMetalakeUserOperations(unittest.TestCase):
 
     def test_list_users(self):
         metalake = mock_base.mock_load_metalake()
-        users = [_build_user_dto("alice"), _build_user_dto("bob")]
+        users = [build_user_dto("alice"), build_user_dto("bob")]
         mock_resp = mock_base.mock_http_response(UserListResponse(0, 
users).to_json())
 
         with patch(
@@ -185,20 +178,12 @@ class TestMetalakeUserOperations(unittest.TestCase):
 class TestGravitinoClientUserDelegates(unittest.TestCase):
     """Verify that GravitinoClient correctly delegates User operations."""
 
-    def _make_client(self):
-        client = GravitinoClient.__new__(GravitinoClient)
-        return client
-
     def test_client_add_user(self):
-        client = self._make_client()
-        user = _build_user_dto()
+        client = make_gravitino_client()
+        user = build_user_dto()
         mock_resp = mock_base.mock_http_response(UserResponse(0, 
user).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.post", 
return_value=mock_resp
             ),
@@ -207,29 +192,21 @@ class TestGravitinoClientUserDelegates(unittest.TestCase):
             self.assertEqual("alice", result.name())
 
     def test_client_get_user(self):
-        client = self._make_client()
-        user = _build_user_dto(roles=["r1"])
+        client = make_gravitino_client()
+        user = build_user_dto(roles=["r1"])
         mock_resp = mock_base.mock_http_response(UserResponse(0, 
user).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch("gravitino.utils.http_client.HTTPClient.get", 
return_value=mock_resp),
         ):
             result = client.get_user("alice")
             self.assertEqual(["r1"], result.roles())
 
     def test_client_remove_user(self):
-        client = self._make_client()
+        client = make_gravitino_client()
         mock_resp = mock_base.mock_http_response(RemoveResponse(0, 
True).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch(
                 "gravitino.utils.http_client.HTTPClient.delete", 
return_value=mock_resp
             ),
@@ -237,31 +214,23 @@ class TestGravitinoClientUserDelegates(unittest.TestCase):
             self.assertTrue(client.remove_user("alice"))
 
     def test_client_list_users(self):
-        client = self._make_client()
-        users = [_build_user_dto("alice"), _build_user_dto("bob")]
+        client = make_gravitino_client()
+        users = [build_user_dto("alice"), build_user_dto("bob")]
         mock_resp = mock_base.mock_http_response(UserListResponse(0, 
users).to_json())
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch("gravitino.utils.http_client.HTTPClient.get", 
return_value=mock_resp),
         ):
             result = client.list_users()
             self.assertEqual(["alice", "bob"], [u.name() for u in result])
 
     def test_client_list_user_names(self):
-        client = self._make_client()
+        client = make_gravitino_client()
         mock_resp = mock_base.mock_http_response(
             UserNamesListResponse(0, ["alice", "bob"]).to_json()
         )
         with (
-            patch.object(
-                GravitinoClient,
-                "get_metalake",
-                return_value=mock_base.mock_load_metalake(),
-            ),
+            mock_get_metalake(),
             patch("gravitino.utils.http_client.HTTPClient.get", 
return_value=mock_resp),
         ):
             result = client.list_user_names()

Reply via email to