334 lines
9.2 KiB
Python
334 lines
9.2 KiB
Python
"""
|
||
修改成员角色 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"
|