import pytest import time import os import sys import requests from api_hook_client import ApiHookClient def test_gemini_cli_full_integration(live_gui): """ Integration test for the Gemini CLI provider and tool bridge. """ client = ApiHookClient("http://127.0.0.1:8999") # 1. Setup paths and configure the GUI mock_script = os.path.abspath("tests/mock_gemini_cli.py") # Wrap in quotes for shell execution if path has spaces cli_cmd = f'"{sys.executable}" "{mock_script}"' # Set provider and binary path via GUI hooks # Note: Using set_value which now triggers the property setter in gui_2.py print(f"[TEST] Setting current_provider to gemini_cli") client.set_value("current_provider", "gemini_cli") print(f"[TEST] Setting gcli_path to {cli_cmd}") client.set_value("gcli_path", cli_cmd) # Verify settings were applied assert client.get_value("current_provider") == "gemini_cli" assert client.get_value("gcli_path") == cli_cmd # Clear events client.get_events() # 2. Trigger a message in the GUI print("[TEST] Sending user message...") client.set_value("ai_input", "Please read test.txt") client.click("btn_gen_send") # 3. Monitor for the 'ask_received' event print("[TEST] Waiting for ask_received event...") request_id = None timeout = 30 start_time = time.time() while time.time() - start_time < timeout: events = client.get_events() if events: print(f"[TEST] Received {len(events)} events: {[e.get('type') for e in events]}") for ev in events: if ev.get("type") == "ask_received": request_id = ev.get("request_id") print(f"[TEST] Found request_id: {request_id}") break if request_id: break time.sleep(0.5) assert request_id is not None, "Timed out waiting for 'ask_received' event from the bridge" # 4. Respond to the permission request print("[TEST] Responding to ask with approval") resp = requests.post( "http://127.0.0.1:8999/api/ask/respond", json={ "request_id": request_id, "response": {"approved": True} } ) assert resp.status_code == 200 # 5. Verify that the final response is displayed in the GUI print("[TEST] Waiting for final message in history...") final_message_received = False start_time = time.time() while time.time() - start_time < timeout: session = client.get_session() entries = session.get("session", {}).get("entries", []) for entry in entries: content = entry.get("content", "") if "Hello from mock!" in content: print(f"[TEST] Success! Found message: {content[:50]}...") final_message_received = True break if final_message_received: break time.sleep(1.0) assert final_message_received, "Final message from mock CLI was not found in the GUI history"