254 lines
7.0 KiB
Python
254 lines
7.0 KiB
Python
"""
|
||
获取成员列表 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"
|