""" 修改成员角色 Use Case 测试 """ import pytest from unittest.mock import Mock from packages.application.workspace.update_member_role_use_case import ( UpdateMemberRoleUseCase, UpdateMemberRoleRequest, ) from packages.domain.entities import ( Workspace, WorkspaceMember, WorkspaceMemberRole, ) class TestUpdateMemberRoleUseCase: """修改成员角色测试""" @pytest.fixture def mock_workspace_repo(self): repo = Mock() repo.find_by_id = Mock(return_value=None) return repo @pytest.fixture def mock_member_repo(self): repo = Mock() repo.find_by_workspace_and_user = Mock(return_value=None) repo.save = Mock() return repo @pytest.fixture def use_case(self, mock_workspace_repo, mock_member_repo): return UpdateMemberRoleUseCase( workspace_repository=mock_workspace_repo, workspace_member_repository=mock_member_repo, ) @pytest.fixture def test_workspace(self): return Workspace( id="workspace-123", name="Test Workspace", owner_user_id="owner-id", ) def test_update_role_success_by_owner( self, use_case, mock_workspace_repo, mock_member_repo, test_workspace, ): """测试 Owner 修改成员角色成功""" mock_workspace_repo.find_by_id.return_value = test_workspace owner_member = WorkspaceMember( id="member-1", workspace_id="workspace-123", user_id="owner-id", role=WorkspaceMemberRole.OWNER, ) target_member = WorkspaceMember( id="member-2", workspace_id="workspace-123", user_id="target-id", role=WorkspaceMemberRole.MEMBER, ) mock_member_repo.find_by_workspace_and_user.side_effect = [owner_member, target_member] request = UpdateMemberRoleRequest( workspace_id="workspace-123", requester_user_id="owner-id", target_user_id="target-id", new_role="admin", ) response, error = use_case.execute(request) assert error is None assert response is not None assert response.user_id == "target-id" assert response.old_role == "member" assert response.new_role == "admin" # 验证更新了角色 assert target_member.role == "admin" mock_member_repo.save.assert_called_once() def test_update_role_success_by_admin( self, use_case, mock_workspace_repo, mock_member_repo, test_workspace, ): """测试 Admin 修改普通成员角色成功""" mock_workspace_repo.find_by_id.return_value = test_workspace admin_member = WorkspaceMember( id="member-1", workspace_id="workspace-123", user_id="admin-id", role=WorkspaceMemberRole.ADMIN, ) target_member = WorkspaceMember( id="member-2", workspace_id="workspace-123", user_id="target-id", role=WorkspaceMemberRole.VIEWER, ) mock_member_repo.find_by_workspace_and_user.side_effect = [admin_member, target_member] request = UpdateMemberRoleRequest( workspace_id="workspace-123", requester_user_id="admin-id", target_user_id="target-id", new_role="member", ) response, error = use_case.execute(request) assert error is None assert response is not None def test_update_role_cannot_change_owner( self, use_case, mock_workspace_repo, mock_member_repo, test_workspace, ): """测试不能修改 Owner 角色""" mock_workspace_repo.find_by_id.return_value = test_workspace admin_member = WorkspaceMember( id="member-1", workspace_id="workspace-123", user_id="admin-id", role=WorkspaceMemberRole.ADMIN, ) owner_member = WorkspaceMember( id="member-2", workspace_id="workspace-123", user_id="owner-id", role=WorkspaceMemberRole.OWNER, ) mock_member_repo.find_by_workspace_and_user.side_effect = [admin_member, owner_member] request = UpdateMemberRoleRequest( workspace_id="workspace-123", requester_user_id="admin-id", target_user_id="owner-id", new_role="member", ) response, error = use_case.execute(request) assert response is None assert error == "Cannot change the owner's role" def test_update_role_admin_cannot_change_admin( self, use_case, mock_workspace_repo, mock_member_repo, test_workspace, ): """测试 Admin 不能修改另一个 Admin 角色""" mock_workspace_repo.find_by_id.return_value = test_workspace admin_member1 = WorkspaceMember( id="member-1", workspace_id="workspace-123", user_id="admin-id-1", role=WorkspaceMemberRole.ADMIN, ) admin_member2 = WorkspaceMember( id="member-2", workspace_id="workspace-123", user_id="admin-id-2", role=WorkspaceMemberRole.ADMIN, ) mock_member_repo.find_by_workspace_and_user.side_effect = [admin_member1, admin_member2] request = UpdateMemberRoleRequest( workspace_id="workspace-123", requester_user_id="admin-id-1", target_user_id="admin-id-2", new_role="member", ) response, error = use_case.execute(request) assert response is None assert error == "Admins cannot change other admins' roles" def test_update_role_cannot_change_self( self, use_case, mock_workspace_repo, mock_member_repo, test_workspace, ): """测试不能修改自己的角色""" mock_workspace_repo.find_by_id.return_value = test_workspace admin_member = WorkspaceMember( id="member-1", workspace_id="workspace-123", user_id="admin-id", role=WorkspaceMemberRole.ADMIN, ) mock_member_repo.find_by_workspace_and_user.return_value = admin_member request = UpdateMemberRoleRequest( workspace_id="workspace-123", requester_user_id="admin-id", target_user_id="admin-id", new_role="member", ) response, error = use_case.execute(request) assert response is None assert error == "Cannot change your own role" def test_update_role_invalid_role(self, use_case): """测试无效角色(不能改为 owner)""" request = UpdateMemberRoleRequest( workspace_id="workspace-123", requester_user_id="admin-id", target_user_id="target-id", new_role="owner", ) response, error = use_case.execute(request) assert response is None assert "Invalid role" in error def test_update_role_already_has_role( self, use_case, mock_workspace_repo, mock_member_repo, test_workspace, ): """测试角色相同""" mock_workspace_repo.find_by_id.return_value = test_workspace owner_member = WorkspaceMember( id="member-1", workspace_id="workspace-123", user_id="owner-id", role=WorkspaceMemberRole.OWNER, ) target_member = WorkspaceMember( id="member-2", workspace_id="workspace-123", user_id="target-id", role=WorkspaceMemberRole.ADMIN, ) mock_member_repo.find_by_workspace_and_user.side_effect = [owner_member, target_member] request = UpdateMemberRoleRequest( workspace_id="workspace-123", requester_user_id="owner-id", target_user_id="target-id", new_role="admin", ) response, error = use_case.execute(request) assert response is None assert "already has the admin role" in error def test_update_role_no_permission( self, use_case, mock_workspace_repo, mock_member_repo, test_workspace, ): """测试普通成员没有权限""" mock_workspace_repo.find_by_id.return_value = test_workspace regular_member = WorkspaceMember( id="member-1", workspace_id="workspace-123", user_id="user-id", role=WorkspaceMemberRole.MEMBER, ) mock_member_repo.find_by_workspace_and_user.return_value = regular_member request = UpdateMemberRoleRequest( workspace_id="workspace-123", requester_user_id="user-id", target_user_id="target-id", new_role="admin", ) response, error = use_case.execute(request) assert response is None assert error == "Only owners and admins can change member roles"