from unittest.mock import patch, MagicMock from src.gemini_cli_adapter import GeminiCliAdapter from src import mcp_client def test_gemini_cli_context_bleed_prevention() -> None: import src.ai_client as ai_client ai_client._gemini_cli_adapter = None with patch('src.gemini_cli_adapter.subprocess.Popen') as mock_popen: adapter = GeminiCliAdapter() mock_process = MagicMock() stdout_output = ( '{"type": "message", "role": "user", "content": "Echoed user prompt"}' + "\n" + '{"type": "message", "role": "model", "content": "Model response"}' ) mock_process.communicate.return_value = (stdout_output, '') mock_process.returncode = 0 mock_popen.return_value = mock_process result = adapter.send("msg") assert result["text"] == "Model response" def test_gemini_cli_parameter_resilience() -> None: with patch('src.mcp_client.read_file', return_value="content") as mock_read: mcp_client.dispatch("read_file", {"file_path": "aliased.txt"}) mock_read.assert_called_once_with("aliased.txt") with patch('src.mcp_client.list_directory', return_value="files") as mock_list: mcp_client.dispatch("list_directory", {"dir_path": "aliased_dir"}) mock_list.assert_called_once_with("aliased_dir") def test_gemini_cli_loop_termination() -> None: import src.ai_client as ai_client ai_client._gemini_cli_adapter = None with patch('src.gemini_cli_adapter.subprocess.Popen') as mock_popen: mock_process = MagicMock() mock_process.communicate.return_value = ('{"type": "message", "content": "Final answer", "tool_calls": []}', "") mock_process.returncode = 0 mock_popen.return_value = mock_process ai_client.set_provider("gemini_cli", "gemini-2.0-flash") result = ai_client.send("context", "prompt") assert result == "Final answer"