diff --git a/tests/test_integrations.py b/tests/test_integrations.py index 5cc8671..df6931b 100644 --- a/tests/test_integrations.py +++ b/tests/test_integrations.py @@ -422,6 +422,113 @@ test_cockpit_container_exists() test_cockpit_container_name() +# ============================================================================= +# Cockpit Question Passing Tests +# ============================================================================= + +print("\n### Cockpit Question Passing Tests ###") + +@test("DockerTmuxAdapter inherits from TmuxCLIController") +def test_cockpit_adapter_inheritance(): + from cockpit import DockerTmuxAdapter + from claude_code_tools.tmux_cli_controller import TmuxCLIController + assert issubclass(DockerTmuxAdapter, TmuxCLIController) + +@test("DockerTmuxController alias works") +def test_cockpit_alias(): + from cockpit import DockerTmuxAdapter, DockerTmuxController + assert DockerTmuxController is DockerTmuxAdapter + +@test("DockerTmuxAdapter.extract_response parses output correctly") +def test_cockpit_extract_response(): + from cockpit import DockerTmuxAdapter + adapter = DockerTmuxAdapter('test-container') + + # Simulated tmux output + output = '''root@host:/workspace# echo 'test' | claude --print -p +This is Claude's response. +It has multiple lines. +root@host:/workspace#''' + + response = adapter.extract_response(output, command_marker="claude --print") + assert "This is Claude's response" in response + assert "multiple lines" in response + # Should not include shell prompts + assert "root@host" not in response + +@test("DockerTmuxAdapter.extract_response detects questions") +def test_cockpit_extract_response_question(): + from cockpit import DockerTmuxAdapter + adapter = DockerTmuxAdapter('test-container') + + output = '''root@host:/workspace# echo 'task' | claude --print -p +I understand. Before I proceed, what authentication method would you prefer? +root@host:/workspace#''' + + response = adapter.extract_response(output, command_marker="claude --print") + # Response should contain the question + assert "what authentication method" in response + # Verify it ends with ? + lines = [l.strip() for l in response.split('\n') if l.strip()] + assert lines[-1].endswith('?') + +@test("Question detection identifies questions correctly") +def test_cockpit_question_detection(): + # Test the question detection logic used in cockpit + test_cases = [ + ("What file should I modify?", True), + ("I completed the task.", False), + ("Should I proceed with the changes?", True), + ("Done.", False), + ("Which approach do you prefer?", True), + ("Task finished successfully", False), + ] + + for text, expected in test_cases: + is_question = text.strip().endswith('?') + assert is_question == expected, f"Failed for: {text}" + +@test("load_state returns default state for new project") +def test_cockpit_load_state_default(): + from cockpit import load_state + # Use a project name that won't exist + state = load_state('nonexistent-test-project-xyz') + assert state['awaiting_response'] == False + assert state['last_question'] is None + assert state['status'] == 'not_started' + +@test("Cockpit state tracks awaiting_response flag") +def test_cockpit_awaiting_response_tracking(): + import json + import tempfile + from pathlib import Path + + # Create a mock state to verify structure + mock_state = { + "project": "test", + "session_id": "test-uuid", + "status": "running", + "session_started": True, + "awaiting_response": True, + "last_question": "What should I do next?", + "last_output": "Previous output" + } + + # Verify all required fields exist + assert 'awaiting_response' in mock_state + assert 'last_question' in mock_state + assert mock_state['awaiting_response'] == True + assert mock_state['last_question'].endswith('?') + +test_cockpit_adapter_inheritance() +test_cockpit_alias() +test_cockpit_extract_response() +test_cockpit_extract_response_question() +test_cockpit_question_detection() +test_cockpit_load_state_default() +test_cockpit_awaiting_response_tracking() + + # ============================================================================= # KG Lookup Tests # =============================================================================