""" 创建 Workspace Use Case 测试 """ import pytest from unittest.mock import Mock from packages.application.workspace import ( CreateWorkspaceUseCase, CreateWorkspaceRequest, ) 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