WIP: PAIN2

This commit is contained in:
2026-03-05 14:43:45 -05:00
parent 0e3b479bd6
commit fca57841c6
8 changed files with 162 additions and 104 deletions

View File

@@ -21,7 +21,8 @@ def test_user_request_integration_flow(mock_app: App) -> None:
patch('src.ai_client.send', return_value=mock_response) as mock_send,
patch('src.ai_client.set_custom_system_prompt'),
patch('src.ai_client.set_model_params'),
patch('src.ai_client.set_agent_tools')
patch('src.ai_client.set_agent_tools'),
patch('src.app_controller.AppController._update_gcli_adapter')
):
# 1. Create and push a UserRequestEvent
event = UserRequestEvent(
@@ -32,25 +33,32 @@ def test_user_request_integration_flow(mock_app: App) -> None:
base_dir="."
)
# 2. Call the handler directly since start_services is mocked (no event loop thread)
# But _handle_request_event itself puts a 'response' event in the queue.
# Our mock_app fixture mocks start_services, so _process_event_queue is NOT running.
# We need to call it manually or not mock start_services.
# Let's call the handler
app.controller._handle_request_event(event)
# 3. Verify ai_client.send was called
assert mock_send.called, "ai_client.send was not called"
# 4. Wait for the response to propagate to _pending_gui_tasks and update UI
# We call _process_pending_gui_tasks manually to simulate a GUI frame update.
start_time = time.time()
success = False
while time.time() - start_time < 5:
app.controller._process_pending_gui_tasks()
if app.controller.ai_response == mock_response and app.controller.ai_status == "done":
success = True
break
time.sleep(0.1)
# 4. Now the 'response' event is in app.controller.event_queue
# But NO ONE is consuming it because _process_event_queue is in the mocked start_services thread.
# Let's manually run one tick of the event queue processing logic
# In _process_event_queue: event_name, payload = self.event_queue.get()
event_name, payload = app.controller.event_queue.get()
assert event_name == "response"
# Manually push it to _pending_gui_tasks as _process_event_queue would
app.controller._pending_gui_tasks.append({
"action": "handle_ai_response",
"payload": payload
})
# 5. Process the GUI tasks
app.controller._process_pending_gui_tasks()
if not success:
print(f"DEBUG: ai_status={app.controller.ai_status}, ai_response={app.controller.ai_response}")
assert success, f"UI state was not updated. ai_response: '{app.controller.ai_response}', status: '{app.controller.ai_status}'"
assert app.controller.ai_response == mock_response
assert app.controller.ai_status == "done"
@@ -64,7 +72,8 @@ def test_user_request_error_handling(mock_app: App) -> None:
patch('src.ai_client.send', side_effect=Exception("API Failure")),
patch('src.ai_client.set_custom_system_prompt'),
patch('src.ai_client.set_model_params'),
patch('src.ai_client.set_agent_tools')
patch('src.ai_client.set_agent_tools'),
patch('src.app_controller.AppController._update_gcli_adapter')
):
event = UserRequestEvent(
prompt="Trigger Error",
@@ -74,16 +83,21 @@ def test_user_request_error_handling(mock_app: App) -> None:
base_dir="."
)
app.controller._handle_request_event(event)
# Poll for error state by processing GUI tasks
start_time = time.time()
success = False
while time.time() - start_time < 5:
app.controller._process_pending_gui_tasks()
if app.controller.ai_status == "error" and "ERROR: API Failure" in app.controller.ai_response:
success = True
break
time.sleep(0.1)
assert success, f"Error state was not reflected in UI. status: {app.controller.ai_status}, response: {app.controller.ai_response}"
# Manually consume from queue
event_name, payload = app.controller.event_queue.get()
assert event_name == "response"
assert payload["status"] == "error"
# Manually push to GUI tasks
app.controller._pending_gui_tasks.append({
"action": "handle_ai_response",
"payload": payload
})
app.controller._process_pending_gui_tasks()
assert app.controller.ai_status == "error"
assert "ERROR: API Failure" in app.controller.ai_response
def test_api_gui_state_live(live_gui) -> None:
client = ApiHookClient()