From 5de253b15b1ff8c8c5fb9d1785353c1e0750a46d Mon Sep 17 00:00:00 2001 From: Ed_ Date: Mon, 2 Mar 2026 10:15:36 -0500 Subject: [PATCH] =?UTF-8?q?test(mock):=20major=20mock=5Fgemini=5Fcli=20rew?= =?UTF-8?q?rite=20=E2=80=94=20robust=20is=5Fresume=20detection,=20tool=20t?= =?UTF-8?q?riggers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/mock_gemini_cli.py | 187 +++++++++++++++++++++++++++++++++------ 1 file changed, 158 insertions(+), 29 deletions(-) diff --git a/tests/mock_gemini_cli.py b/tests/mock_gemini_cli.py index 3097a37..bfc05a3 100644 --- a/tests/mock_gemini_cli.py +++ b/tests/mock_gemini_cli.py @@ -18,6 +18,117 @@ def main() -> None: if len(sys.argv) > 1 and sys.argv[1] in ["mcp", "extensions", "skills", "hooks"]: return + # Check for multi-round integration test triggers + is_resume = '--resume' in " ".join(sys.argv) or '"role": "tool"' in prompt or '"tool_call_id"' in prompt + is_resume_list = is_resume and 'list_directory' in prompt + is_resume_read = is_resume and 'read_file' in prompt + is_resume_powershell = is_resume and 'run_powershell' in prompt + + if 'List the files in the current directory' in prompt or 'List the files' in prompt or is_resume_list: + if not is_resume: + print(json.dumps({ + "type": "message", + "role": "assistant", + "content": "I will list the files in the current directory." + }), flush=True) + print(json.dumps({ + "type": "tool_use", + "name": "list_directory", + "id": "mock-list-dir-call", + "args": {"path": "."} + }), flush=True) + print(json.dumps({ + "type": "result", + "status": "success", + "stats": {"total_tokens": 10, "input_tokens": 5, "output_tokens": 5}, + "session_id": "mock-session-list-dir" + }), flush=True) + return + else: + print(json.dumps({ + "type": "message", + "role": "assistant", + "content": "Here are the files in the current directory: aggregate.py, ai_client.py, etc." + }), flush=True) + print(json.dumps({ + "type": "result", + "status": "success", + "stats": {"total_tokens": 20, "input_tokens": 10, "output_tokens": 10}, + "session_id": "mock-session-list-dir-res" + }), flush=True) + return + + if 'Read the first 10 lines' in prompt or is_resume_read: + if not is_resume: + print(json.dumps({ + "type": "message", + "role": "assistant", + "content": "I will read the first 10 lines of the file." + }), flush=True) + # Extract file name if present + file_path = "aggregate.py" + if "aggregate.py" in prompt: file_path = "aggregate.py" + print(json.dumps({ + "type": "tool_use", + "name": "read_file", + "id": "mock-read-file-call", + "args": {"path": file_path, "start_line": 1, "end_line": 10} + }), flush=True) + print(json.dumps({ + "type": "result", + "status": "success", + "stats": {"total_tokens": 10, "input_tokens": 5, "output_tokens": 5}, + "session_id": "mock-session-read-file" + }), flush=True) + return + else: + print(json.dumps({ + "type": "message", + "role": "assistant", + "content": "Here are the lines from the file: [Line 1, Line 2...]" + }), flush=True) + print(json.dumps({ + "type": "result", + "status": "success", + "stats": {"total_tokens": 20, "input_tokens": 10, "output_tokens": 10}, + "session_id": "mock-session-read-file-res" + }), flush=True) + return + + if 'Create a hello.ps1 script' in prompt or is_resume_powershell: + if not is_resume: + print(json.dumps({ + "type": "message", + "role": "assistant", + "content": "I will create the hello.ps1 script." + }), flush=True) + print(json.dumps({ + "type": "tool_use", + "name": "run_powershell", + "id": "mock-hello-call", + "args": {"script": "Write-Output 'Simulation Test'"} + }), flush=True) + print(json.dumps({ + "type": "result", + "status": "success", + "stats": {"total_tokens": 10, "input_tokens": 5, "output_tokens": 5}, + "session_id": "mock-session-hello" + }), flush=True) + return + else: + print(json.dumps({ + "type": "message", + "role": "assistant", + "content": "Script hello.ps1 created successfully. Output: Simulation Test" + }), flush=True) + print(json.dumps({ + "type": "result", + "status": "success", + "stats": {"total_tokens": 20, "input_tokens": 10, "output_tokens": 10}, + "session_id": "mock-session-hello-res" + }), flush=True) + return + # Check for specific simulation contexts # Use the full prompt string since context length can vary depending on history or project state if 'You are assigned to Ticket' in prompt: @@ -60,49 +171,67 @@ def main() -> None: }), flush=True) return - # Check for multi-round integration test triggers - is_resume = '--resume' in " ".join(sys.argv) or 'role: tool' in prompt or 'tool_call_id' in prompt if is_resume or 'Perform multi-round tool test' in prompt or 'Please read test.txt' in prompt or 'Deny me' in prompt: if not is_resume: # First round: emit tool call print(json.dumps({ - "type": "message", - "role": "assistant", - "content": "I need to check the directory first." - }), flush=True) + "type": "message", + "role": "assistant", + "content": "I need to check the directory first." + }), flush=True) print(json.dumps({ - "type": "tool_use", - "name": "run_powershell", - "id": "mock-call-1", - "args": {"script": "Get-ChildItem"} - }), flush=True) + "type": "tool_use", + "name": "run_powershell", + "id": "mock-call-1", + "args": {"script": "Get-ChildItem"} + }), flush=True) print(json.dumps({ - "type": "result", - "status": "success", - "stats": {"total_tokens": 10, "input_tokens": 10, "output_tokens": 0}, - "session_id": "mock-session-default" - }), flush=True) + "type": "result", + "status": "success", + "stats": {"total_tokens": 10, "input_tokens": 10, "output_tokens": 0}, + "session_id": "mock-session-default" + }), flush=True) return else: # Second round if "USER REJECTED" in prompt: print(json.dumps({ - "type": "message", - "role": "assistant", - "content": "Tool execution was denied. I cannot proceed." - }), flush=True) + "type": "message", + "role": "assistant", + "content": "Tool execution was denied. I cannot proceed." + }), flush=True) else: print(json.dumps({ - "type": "message", - "role": "assistant", - "content": "I have processed the tool results and here is the final answer." - }), flush=True) + "type": "message", + "role": "assistant", + "content": "I have processed the tool results and here is the final answer." + }), flush=True) print(json.dumps({ - "type": "result", - "status": "success", - "stats": {"total_tokens": 100, "input_tokens": 80, "output_tokens": 20}, - "session_id": "mock-session-final" - }), flush=True) + "type": "result", + "status": "success", + "stats": {"total_tokens": 100, "input_tokens": 80, "output_tokens": 20}, + "session_id": "mock-session-final" + }), flush=True) return + + # Default response + content = "I am a mock CLI and I have processed your request." + if 'Acknowledged' in prompt: + content = "Acknowledged." + elif 'What is the current date' in prompt: + content = "The current date is March 1, 2026." + + print(json.dumps({ + "type": "message", + "role": "assistant", + "content": content + }), flush=True) + print(json.dumps({ + "type": "result", + "status": "success", + "stats": {"total_tokens": 50, "input_tokens": 25, "output_tokens": 25}, + "session_id": "mock-session-default" + }), flush=True) + if __name__ == "__main__": main()