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

179 lines
5.3 KiB
Python

"""
创建 Workspace Use Case 测试
"""
from unittest.mock import Mock
import pytest
from packages.application.workspace import (
CreateWorkspaceRequest,
CreateWorkspaceUseCase,
)
from packages.domain.entities import User
class TestCreateWorkspaceUseCase:
"""创建工作空间测试"""
@pytest.fixture
def mock_workspace_repo(self):
repo = Mock()
repo.save = Mock()
return repo
@pytest.fixture
def mock_member_repo(self):
repo = Mock()
repo.save = Mock()
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 CreateWorkspaceUseCase(
workspace_repository=mock_workspace_repo,
workspace_member_repository=mock_member_repo,
user_repository=mock_user_repo,
)
@pytest.fixture
def test_user(self):
return User(
id="user-123",
email="test@example.com",
username="testuser",
display_name="Test User",
)
def test_create_workspace_success_free_plan(
self, use_case, mock_workspace_repo, mock_member_repo, mock_user_repo, test_user
):
"""测试创建免费工作空间"""
mock_user_repo.find_by_id.return_value = test_user
request = CreateWorkspaceRequest(
name="My Workspace",
owner_user_id="user-123",
subscription_plan="free",
)
response, error = use_case.execute(request)
assert error is None
assert response is not None
assert response.name == "My Workspace"
assert response.subscription_plan == "free"
assert response.max_projects == 3
assert response.max_storage_gb == 10
# 验证保存了 workspace
mock_workspace_repo.save.assert_called_once()
workspace = mock_workspace_repo.save.call_args[0][0]
assert workspace.name == "My Workspace"
assert workspace.owner_user_id == "user-123"
# 验证创建了 owner 成员
mock_member_repo.save.assert_called_once()
member = mock_member_repo.save.call_args[0][0]
assert member.user_id == "user-123"
assert member.role == "owner"
def test_create_workspace_pro_plan(
self, use_case, mock_workspace_repo, mock_member_repo, mock_user_repo, test_user
):
"""测试创建 Pro 工作空间"""
mock_user_repo.find_by_id.return_value = test_user
request = CreateWorkspaceRequest(
name="Pro Workspace",
owner_user_id="user-123",
subscription_plan="pro",
)
response, error = use_case.execute(request)
assert error is None
assert response is not None
assert response.subscription_plan == "pro"
assert response.max_projects == 999999 # unlimited
assert response.max_storage_gb == 100
def test_create_workspace_enterprise_plan(
self, use_case, mock_workspace_repo, mock_member_repo, mock_user_repo, test_user
):
"""测试创建 Enterprise 工作空间"""
mock_user_repo.find_by_id.return_value = test_user
request = CreateWorkspaceRequest(
name="Enterprise Workspace",
owner_user_id="user-123",
subscription_plan="enterprise",
)
response, error = use_case.execute(request)
assert error is None
assert response is not None
assert response.subscription_plan == "enterprise"
assert response.max_projects == 999999
assert response.max_storage_gb == 1000
def test_create_workspace_missing_name(self, use_case):
"""测试缺少名称"""
request = CreateWorkspaceRequest(
name="",
owner_user_id="user-123",
)
response, error = use_case.execute(request)
assert response is None
assert error == "Workspace name is required"
def test_create_workspace_name_too_long(self, use_case):
"""测试名称过长"""
request = CreateWorkspaceRequest(
name="A" * 101,
owner_user_id="user-123",
)
response, error = use_case.execute(request)
assert response is None
assert error == "Workspace name is too long (max 100 characters)"
def test_create_workspace_user_not_found(self, use_case, mock_user_repo):
"""测试用户不存在"""
mock_user_repo.find_by_id.return_value = None
request = CreateWorkspaceRequest(
name="My Workspace",
owner_user_id="nonexistent-user",
)
response, error = use_case.execute(request)
assert response is None
assert error == "Owner user not found"
def test_create_workspace_invalid_plan(self, use_case, mock_user_repo, test_user):
"""测试无效的订阅计划"""
mock_user_repo.find_by_id.return_value = test_user
request = CreateWorkspaceRequest(
name="My Workspace",
owner_user_id="user-123",
subscription_plan="invalid_plan",
)
response, error = use_case.execute(request)
assert response is None
assert "Invalid subscription plan" in error