""" 获取成员列表 Use Case 测试 """ from datetime import datetime, timezone from unittest.mock import Mock import pytest from packages.application.workspace.list_members_use_case import ( ListMembersRequest, ListMembersUseCase, ) from packages.domain.entities import ( User, Workspace, WorkspaceMember, WorkspaceMemberRole, ) class TestListMembersUseCase: """获取成员列表测试""" @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.find_by_workspace = Mock(return_value=[]) return repo @pytest.fixture def mock_user_repo(self): repo = Mock() repo.find_by_id = Mock(return_value=None) return repo @pytest.fixture def use_case(self, mock_workspace_repo, mock_member_repo, mock_user_repo): return ListMembersUseCase( workspace_repository=mock_workspace_repo, workspace_member_repository=mock_member_repo, user_repository=mock_user_repo, ) @pytest.fixture def test_workspace(self): return Workspace( id="workspace-123", name="Test Workspace", owner_user_id="owner-id", ) def test_list_members_success( self, use_case, mock_workspace_repo, mock_member_repo, mock_user_repo, test_workspace, ): """测试获取成员列表成功""" mock_workspace_repo.find_by_id.return_value = test_workspace # 请求者是 Admin requester_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 = requester_member # 3 个成员 member1 = WorkspaceMember( id="member-1", workspace_id="workspace-123", user_id="owner-id", role=WorkspaceMemberRole.OWNER, invited_by=None, ) member2 = WorkspaceMember( id="member-2", workspace_id="workspace-123", user_id="admin-id", role=WorkspaceMemberRole.ADMIN, invited_by="owner-id", ) member3 = WorkspaceMember( id="member-3", workspace_id="workspace-123", user_id="user-id", role=WorkspaceMemberRole.MEMBER, invited_by="admin-id", ) mock_member_repo.find_by_workspace.return_value = [member1, member2, member3] # 用户信息 user1 = User( id="owner-id", email="owner@test.com", username="owner", display_name="Owner User", ) user2 = User( id="admin-id", email="admin@test.com", username="admin", display_name="Admin User", ) user3 = User( id="user-id", email="user@test.com", username="user", display_name="Regular User", ) mock_user_repo.find_by_id.side_effect = [user1, user2, user3] request = ListMembersRequest( workspace_id="workspace-123", requester_user_id="admin-id", ) response, error = use_case.execute(request) assert error is None assert response is not None assert len(response.members) == 3 # 验证第一个成员(Owner) m1 = response.members[0] assert m1.user_id == "owner-id" assert m1.username == "owner" assert m1.email == "owner@test.com" assert m1.role == "owner" assert m1.invited_by is None # 验证第二个成员(Admin) m2 = response.members[1] assert m2.user_id == "admin-id" assert m2.role == "admin" assert m2.invited_by == "owner-id" # 验证第三个成员(Member) m3 = response.members[2] assert m3.user_id == "user-id" assert m3.role == "member" assert m3.invited_by == "admin-id" def test_list_members_workspace_not_found( self, use_case, mock_workspace_repo, ): """测试工作空间不存在""" mock_workspace_repo.find_by_id.return_value = None request = ListMembersRequest( workspace_id="nonexistent", requester_user_id="user-id", ) response, error = use_case.execute(request) assert response is None assert error == "Workspace not found" def test_list_members_requester_not_member( self, use_case, mock_workspace_repo, mock_member_repo, test_workspace, ): """测试请求者不是成员""" mock_workspace_repo.find_by_id.return_value = test_workspace mock_member_repo.find_by_workspace_and_user.return_value = None request = ListMembersRequest( workspace_id="workspace-123", requester_user_id="outsider-id", ) response, error = use_case.execute(request) assert response is None assert error == "You are not a member of this workspace" def test_list_members_empty_workspace( self, use_case, mock_workspace_repo, mock_member_repo, test_workspace, ): """测试空工作空间(理论上不应该发生)""" mock_workspace_repo.find_by_id.return_value = test_workspace requester_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 = requester_member mock_member_repo.find_by_workspace.return_value = [] request = ListMembersRequest( workspace_id="workspace-123", requester_user_id="user-id", ) response, error = use_case.execute(request) assert error is None assert response is not None assert len(response.members) == 0 def test_list_members_missing_workspace_id(self, use_case): """测试缺少工作空间 ID""" request = ListMembersRequest( workspace_id="", requester_user_id="user-id", ) response, error = use_case.execute(request) assert response is None assert error == "Workspace ID is required" def test_list_members_missing_requester_id(self, use_case): """测试缺少请求者 ID""" request = ListMembersRequest( workspace_id="workspace-123", requester_user_id="", ) response, error = use_case.execute(request) assert response is None assert error == "Requester user ID is required"