fix(phase3): Resolve remaining test failures and stabilize GUI
- Fixed ullcontext NameError in gui_2.py. - Corrected TestMMAApprovalIndicators to call real rendering methods on mock app. - Updated est_history_manager.py to provide required context_files argument to UISnapshot. - Stabilized est_z_negative_flows.py with robust polling for terminal response status and corrected field names. - Cleaned up debug logging in ag_engine.py and pp_controller.py.
This commit is contained in:
+2
-2
@@ -17,7 +17,7 @@ import threading
|
|||||||
import time
|
import time
|
||||||
import tomli_w
|
import tomli_w
|
||||||
import typing
|
import typing
|
||||||
# from contextlib import ExitStack, nullcontext
|
from contextlib import ExitStack, nullcontext
|
||||||
from defer import defer
|
from defer import defer
|
||||||
from imgui_bundle import imgui, hello_imgui, immapp, imgui_node_editor as ed, imgui_color_text_edit as ced
|
from imgui_bundle import imgui, hello_imgui, immapp, imgui_node_editor as ed, imgui_color_text_edit as ced
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -771,7 +771,7 @@ class App:
|
|||||||
try:
|
try:
|
||||||
self._render_main_interface()
|
self._render_main_interface()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"ERROR in _gui_func: {e}")
|
sys.stderr.write(f"ERROR in _gui_func: {e}\n")
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
||||||
if pushed_prior_tint:
|
if pushed_prior_tint:
|
||||||
|
|||||||
+2
-3
@@ -18,7 +18,7 @@ def _get_sentence_transformers():
|
|||||||
from sentence_transformers import SentenceTransformer
|
from sentence_transformers import SentenceTransformer
|
||||||
_SENTENCE_TRANSFORMERS = SentenceTransformer
|
_SENTENCE_TRANSFORMERS = SentenceTransformer
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
sys.stderr.write(f"[DEBUG RAG] FAILED to import sentence_transformers: {e}\n")
|
sys.stderr.write(f"FAILED to import sentence_transformers: {e}\n")
|
||||||
sys.stderr.flush()
|
sys.stderr.flush()
|
||||||
raise e
|
raise e
|
||||||
return _SENTENCE_TRANSFORMERS
|
return _SENTENCE_TRANSFORMERS
|
||||||
@@ -51,7 +51,7 @@ class LocalEmbeddingProvider(BaseEmbeddingProvider):
|
|||||||
if ST:
|
if ST:
|
||||||
self.model = ST(model_name)
|
self.model = ST(model_name)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
sys.stderr.write(f"[DEBUG RAG] LocalEmbeddingProvider failed to load model {model_name}: {e}. Using dummy embeddings.\n")
|
sys.stderr.write(f"LocalEmbeddingProvider failed to load model {model_name}: {e}. Using dummy embeddings.\n")
|
||||||
sys.stderr.flush()
|
sys.stderr.flush()
|
||||||
|
|
||||||
def embed(self, texts: List[str]) -> List[List[float]]:
|
def embed(self, texts: List[str]) -> List[List[float]]:
|
||||||
@@ -108,7 +108,6 @@ class RAGEngine:
|
|||||||
def _init_vector_store(self):
|
def _init_vector_store(self):
|
||||||
vs_config = self.config.vector_store
|
vs_config = self.config.vector_store
|
||||||
if vs_config.provider == 'chroma':
|
if vs_config.provider == 'chroma':
|
||||||
# Use absolute path to avoid confusion during directory cleanup/change
|
|
||||||
db_path = os.path.abspath(os.path.join(self.base_dir, ".slop_cache", "rag_chroma"))
|
db_path = os.path.abspath(os.path.join(self.base_dir, ".slop_cache", "rag_chroma"))
|
||||||
os.makedirs(db_path, exist_ok=True)
|
os.makedirs(db_path, exist_ok=True)
|
||||||
chroma_module = _get_chromadb()
|
chroma_module = _get_chromadb()
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ class TestHistoryManager:
|
|||||||
auto_add_history=True,
|
auto_add_history=True,
|
||||||
disc_entries=[{"role": "user", "content": "hello"}],
|
disc_entries=[{"role": "user", "content": "hello"}],
|
||||||
files=[{"path": "a.txt"}],
|
files=[{"path": "a.txt"}],
|
||||||
|
context_files=[],
|
||||||
screenshots=["screenshot.png"],
|
screenshots=["screenshot.png"],
|
||||||
)
|
)
|
||||||
d = snap.to_dict()
|
d = snap.to_dict()
|
||||||
@@ -85,6 +86,7 @@ class TestHistoryManager:
|
|||||||
assert restored.auto_add_history == snap.auto_add_history
|
assert restored.auto_add_history == snap.auto_add_history
|
||||||
assert restored.disc_entries == snap.disc_entries
|
assert restored.disc_entries == snap.disc_entries
|
||||||
assert restored.files == snap.files
|
assert restored.files == snap.files
|
||||||
|
assert restored.context_files == snap.context_files
|
||||||
assert restored.screenshots == snap.screenshots
|
assert restored.screenshots == snap.screenshots
|
||||||
|
|
||||||
def test_push_clears_redo_stack(self):
|
def test_push_clears_redo_stack(self):
|
||||||
|
|||||||
@@ -61,6 +61,21 @@ def _make_app(**kwargs):
|
|||||||
mock_controller = MagicMock()
|
mock_controller = MagicMock()
|
||||||
mock_controller.engine = mock_engine
|
mock_controller.engine = mock_engine
|
||||||
app.controller = mock_controller
|
app.controller = mock_controller
|
||||||
|
|
||||||
|
# Ensure real methods are called for the dashboard rendering components
|
||||||
|
app._render_mma_dashboard = lambda: App._render_mma_dashboard(app)
|
||||||
|
app._render_mma_focus_selector = lambda: App._render_mma_focus_selector(app)
|
||||||
|
app._render_mma_track_summary = lambda: App._render_mma_track_summary(app)
|
||||||
|
app._render_mma_epic_planner = lambda: App._render_mma_epic_planner(app)
|
||||||
|
app._render_mma_conductor_setup = lambda: App._render_mma_conductor_setup(app)
|
||||||
|
app._render_mma_track_browser = lambda: App._render_mma_track_browser(app)
|
||||||
|
app._render_mma_global_controls = lambda: App._render_mma_global_controls(app)
|
||||||
|
app._render_mma_usage_section = lambda: App._render_mma_usage_section(app)
|
||||||
|
app._render_ticket_queue = lambda: App._render_ticket_queue(app)
|
||||||
|
app._render_window_if_open = lambda name, func, condition=True: func() if condition else None
|
||||||
|
app._render_mma_ticket_editor = lambda: App._render_mma_ticket_editor(app)
|
||||||
|
app._render_mma_agent_streams = lambda: App._render_mma_agent_streams(app)
|
||||||
|
|
||||||
return app
|
return app
|
||||||
|
|
||||||
def _make_imgui_mock():
|
def _make_imgui_mock():
|
||||||
|
|||||||
@@ -25,12 +25,19 @@ def test_mock_malformed_json(live_gui) -> None:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# Trigger generation
|
# Trigger generation
|
||||||
client.set_value("system_prompt_input", "Trigger malformed")
|
client.set_value("ai_input", "Trigger malformed")
|
||||||
client.click("btn_gen_send")
|
client.click("btn_gen_send")
|
||||||
|
|
||||||
# Wait for response
|
# Wait for terminal response
|
||||||
event = client.wait_for_event("response", timeout=15)
|
event = None
|
||||||
assert event is not None, "Did not receive response event"
|
start = time.time()
|
||||||
|
while time.time() - start < 30:
|
||||||
|
ev = client.wait_for_event("response", timeout=5)
|
||||||
|
if ev and ev.get("payload", {}).get("status") != "streaming...":
|
||||||
|
event = ev
|
||||||
|
break
|
||||||
|
|
||||||
|
assert event is not None, "Did not receive terminal response event"
|
||||||
assert event["payload"]["status"] == "error"
|
assert event["payload"]["status"] == "error"
|
||||||
assert "JSONDecodeError" in event["payload"]["text"] or "json" in event["payload"]["text"].lower()
|
assert "JSONDecodeError" in event["payload"]["text"] or "json" in event["payload"]["text"].lower()
|
||||||
finally:
|
finally:
|
||||||
@@ -60,12 +67,19 @@ def test_mock_error_result(live_gui) -> None:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# Trigger generation
|
# Trigger generation
|
||||||
client.set_value("system_prompt_input", "Trigger error")
|
client.set_value("ai_input", "Trigger error")
|
||||||
client.click("btn_gen_send")
|
client.click("btn_gen_send")
|
||||||
|
|
||||||
# Wait for response
|
# Wait for terminal response
|
||||||
event = client.wait_for_event("response", timeout=15)
|
event = None
|
||||||
assert event is not None, "Did not receive response event"
|
start = time.time()
|
||||||
|
while time.time() - start < 30:
|
||||||
|
ev = client.wait_for_event("response", timeout=5)
|
||||||
|
if ev and ev.get("payload", {}).get("status") != "streaming...":
|
||||||
|
event = ev
|
||||||
|
break
|
||||||
|
|
||||||
|
assert event is not None, "Did not receive terminal response event"
|
||||||
assert event["payload"]["status"] == "error"
|
assert event["payload"]["status"] == "error"
|
||||||
assert "Mock simulated error" in event["payload"]["text"]
|
assert "Mock simulated error" in event["payload"]["text"]
|
||||||
finally:
|
finally:
|
||||||
@@ -95,13 +109,19 @@ def test_mock_timeout(live_gui) -> None:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# Trigger generation
|
# Trigger generation
|
||||||
client.set_value("system_prompt_input", "Trigger timeout")
|
client.set_value("ai_input", "Trigger timeout")
|
||||||
client.click("btn_gen_send")
|
client.click("btn_gen_send")
|
||||||
|
|
||||||
# Wait for response. Note: gemini_cli_adapter has a 60s timeout,
|
# Wait for terminal response
|
||||||
# but the mock might not actually hang for 60s if we adjust it or we wait for 65s here.
|
event = None
|
||||||
event = client.wait_for_event("response", timeout=70)
|
start = time.time()
|
||||||
assert event is not None, "Did not receive response event"
|
while time.time() - start < 80:
|
||||||
|
ev = client.wait_for_event("response", timeout=5)
|
||||||
|
if ev and ev.get("payload", {}).get("status") != "streaming...":
|
||||||
|
event = ev
|
||||||
|
break
|
||||||
|
|
||||||
|
assert event is not None, "Did not receive terminal response event"
|
||||||
assert event["payload"]["status"] == "error"
|
assert event["payload"]["status"] == "error"
|
||||||
assert "timeout" in event["payload"]["text"].lower()
|
assert "timeout" in event["payload"]["text"].lower()
|
||||||
finally:
|
finally:
|
||||||
|
|||||||
Reference in New Issue
Block a user