import pytest import time import sys import os import shutil import tempfile from pathlib import Path sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "src"))) from src import api_hook_client @pytest.mark.integration def test_rag_full_lifecycle_sim(live_gui): client = api_hook_client.ApiHookClient() assert client.wait_for_server(timeout=15), "Hook server did not start" # 1. Setup mock project data test_dir = tempfile.mkdtemp() try: (Path(test_dir) / "test_file.txt").write_text("This is a test file about RAG integration. It should be indexed.") (Path(test_dir) / "other_file.py").write_text("# This is another file\ndef hello():\n print('world')") # 2. Configure project through Hook API client.set_value('files_base_dir', test_dir) client.set_value('rag_enabled', True) client.set_value('rag_source', 'mock') # Use mock to avoid sentence-transformers dependency in CI # 3. Verify initial status status = client.get_value('rag_status') assert status in ['idle', 'ready'], f"Unexpected initial status: {status}" # 4. Trigger Rebuild Index print("[SIM] Triggering index rebuild...") client.click('btn_rebuild_rag_index') # 5. Wait for status transition # Wait for 'indexing...' found_indexing = False for _ in range(20): status = client.get_value('rag_status') if status == 'indexing...': found_indexing = True break time.sleep(0.1) print(f"[SIM] Found indexing: {found_indexing}") # Wait for 'ready' success = False for _ in range(50): status = client.get_value('rag_status') if status == 'ready': success = True break if "error" in status.lower(): pytest.fail(f"RAG indexing failed: {status}") time.sleep(0.2) assert success, f"RAG indexing timed out. Final status: {status}" print("[SIM] RAG indexing SUCCESS.") # 6. Verify retrieval visualization # We simulate a response that has RAG context prepended # Since we are testing GUI visualization, we'll manually inject a message into the discussion # that contains the RAG marker, then verify the GUI state if possible. # However, verifying ImGui internal render state via Hook API is limited to exposed fields. # We've already verified the wiring of settings and status. # One final check: toggle RAG off and verify client.set_value('rag_enabled', False) assert client.get_value('rag_enabled') is False finally: shutil.rmtree(test_dir) @pytest.mark.integration def test_rag_settings_persistence_sim(live_gui): client = api_hook_client.ApiHookClient() assert client.wait_for_server(timeout=15) # Change settings client.set_value('rag_chunk_size', 1234) client.set_value('rag_chunk_overlap', 56) # Verify they were set in the controller assert client.get_value('rag_chunk_size') == 1234 assert client.get_value('rag_chunk_overlap') == 56 print("[SIM] RAG settings persistence simulation PASSED.")