Files
xiaoxia-saas/tests/unit/test_update_member_role_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

334 lines
9.2 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 unittest.mock import Mock
import pytest
from packages.application.workspace.update_member_role_use_case import (
UpdateMemberRoleRequest,
UpdateMemberRoleUseCase,
)
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"