Files
xiaoxia-saas/tests/unit/test_list_members_use_case.py
T
Xiaoxia AI b79d6718d6
CI/CD Pipeline / Validate Code Quality And Tests (push) Failing after 21s
Deploy / Deploy Production (push) Has been cancelled
Deploy / Deploy Staging (push) Has been cancelled
style: normalize python formatting gates
2026-06-21 06:52:19 +08:00

254 lines
7.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
获取成员列表 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"