test(04-02): add failing tests for special command handling

- Test Orchestrator initializes with UserContextManager
- Test _handle_new_project creates session before executing
- Test _handle_new_project updates user context
- Test _handle_new_project executes command in session
- Test _handle_new_project returns success card
- Test handle_message routes new-project command
- Test empty project name returns error

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 18:45:16 +08:00
parent 25ab3315da
commit acc52fbd8c
+180
View File
@@ -545,3 +545,183 @@ class TestIntegrationFlows:
# Verify result is a confirmation card
assert "schema" in result
class TestSpecialCommands:
"""Tests for special command handling (new-project, use)."""
@pytest.fixture
def orchestrator_with_mocks(self):
"""Create orchestrator with mocked dependencies for special commands."""
from gsd_openclaw.orchestrator import Orchestrator
mock_tmux_manager = MagicMock()
mock_formatter = MagicMock()
mock_executor = MagicMock()
orchestrator = Orchestrator(
tmux_manager=mock_tmux_manager,
formatter=mock_formatter
)
orchestrator.executor = mock_executor
return orchestrator
def test_orchestrator_initializes_with_user_context_manager(self, orchestrator_with_mocks):
"""Orchestrator should initialize with UserContextManager instance."""
orch = orchestrator_with_mocks
# Should have user_context_managers dict
assert hasattr(orch, 'user_context_managers')
assert isinstance(orch.user_context_managers, dict)
def test_new_project_creates_session_before_executing(self, orchestrator_with_mocks):
"""_handle_new_project should create tmux session before executing command."""
from gsd_openclaw.tmux_session import TmuxSession
orch = orchestrator_with_mocks
mock_session = MagicMock(spec=TmuxSession)
mock_session.session_id = "test-123"
mock_session.tmux_session = MagicMock()
orch.tmux_manager.create_session.return_value = mock_session
orch.tmux_manager.get_session.return_value = None
orch.executor.execute.return_value = CommandResult(
output="Project created successfully",
completed=True,
has_error=False,
error_type=None
)
orch.formatter.format_success.return_value = {"card": "success"}
result = orch._handle_new_project("user1", "my-project")
# Verify session was created first
orch.tmux_manager.create_session.assert_called_once_with("my-project")
def test_new_project_updates_user_context(self, orchestrator_with_mocks):
"""_handle_new_project should update user context with new project."""
from gsd_openclaw.tmux_session import TmuxSession
orch = orchestrator_with_mocks
mock_session = MagicMock(spec=TmuxSession)
mock_session.session_id = "test-123"
mock_session.tmux_session = MagicMock()
orch.tmux_manager.create_session.return_value = mock_session
orch.tmux_manager.get_session.return_value = None
orch.executor.execute.return_value = CommandResult(
output="Project created successfully",
completed=True,
has_error=False,
error_type=None
)
orch.formatter.format_success.return_value = {"card": "success"}
result = orch._handle_new_project("user1", "my-project")
# Verify user context was updated
user_ctx = orch._get_user_context_manager("user1")
assert user_ctx.get_current_project() == "my-project"
def test_new_project_executes_command_in_session(self, orchestrator_with_mocks):
"""_handle_new_project should execute the command in the new session."""
from gsd_openclaw.tmux_session import TmuxSession
orch = orchestrator_with_mocks
mock_session = MagicMock(spec=TmuxSession)
mock_session.session_id = "test-123"
mock_session.tmux_session = MagicMock()
orch.tmux_manager.create_session.return_value = mock_session
orch.tmux_manager.get_session.return_value = None
orch.executor.execute.return_value = CommandResult(
output="Project initialized",
completed=True,
has_error=False,
error_type=None
)
orch.formatter.format_success.return_value = {"card": "success"}
result = orch._handle_new_project("user1", "my-project")
# Verify command was executed
orch.executor.execute.assert_called_once()
call_args = orch.executor.execute.call_args
assert call_args[0][0] == mock_session
assert "/gsd:new-project my-project" in call_args[0][1]
def test_new_project_returns_success_card(self, orchestrator_with_mocks):
"""_handle_new_project should return formatted success card."""
from gsd_openclaw.tmux_session import TmuxSession
orch = orchestrator_with_mocks
mock_session = MagicMock(spec=TmuxSession)
mock_session.session_id = "test-123"
mock_session.tmux_session = MagicMock()
orch.tmux_manager.create_session.return_value = mock_session
orch.tmux_manager.get_session.return_value = None
orch.executor.execute.return_value = CommandResult(
output="Project created",
completed=True,
has_error=False,
error_type=None
)
orch.formatter.format_success.return_value = {"card": "success"}
result = orch._handle_new_project("user1", "my-project")
orch.formatter.format_success.assert_called_once()
def test_handle_message_routes_new_project_command(self, orchestrator_with_mocks):
"""handle_message should route 'new-project' command to _handle_new_project."""
from gsd_openclaw.tmux_session import TmuxSession
orch = orchestrator_with_mocks
mock_session = MagicMock(spec=TmuxSession)
mock_session.session_id = "test-123"
mock_session.tmux_session = MagicMock()
orch.tmux_manager.create_session.return_value = mock_session
orch.tmux_manager.get_session.return_value = None
orch.executor.execute.return_value = CommandResult(
output="Project created",
completed=True,
has_error=False,
error_type=None
)
orch.formatter.format_success.return_value = {"card": "success"}
# Patch _handle_new_project to verify it's called
with patch.object(orch, '_handle_new_project', return_value={"card": "mocked"}) as mock_handler:
result = orch.handle_message(
user_id="user1",
message="/gsd:new-project test-project",
channel="test-channel",
context={}
)
mock_handler.assert_called_once_with("user1", "test-project")
def test_new_project_with_empty_name_returns_error(self, orchestrator_with_mocks):
"""_handle_new_project with empty project name should return error."""
orch = orchestrator_with_mocks
orch.formatter.format_error.return_value = {"card": "error"}
result = orch._handle_new_project("user1", "")
orch.formatter.format_error.assert_called_once()
call_args = orch.formatter.format_error.call_args
assert "Project name" in str(call_args)