feat(rag): wire RAG settings to Hook API and add simulation tests
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
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.")
|
||||
Reference in New Issue
Block a user