fix(sim+api): proper wait loops, project switch endpoint, drop stale check
Three real fixes for the sim test + the live_gui coordination layer:
1. /api/project_switch_status endpoint in src/app_controller.py.
The wait helper had been calling this endpoint but it did not exist;
the helper always received a 404, fell back to {in_progress: False},
and returned immediately even when a switch was in flight. Added the
endpoint that reads _project_switch_in_progress, active_project_path,
and _project_switch_error from the controller.
2. simulation/sim_base.py: replace time.sleep(2.0)/time.sleep(1.5) in
the setup() with wait_io_pool_idle and wait_for_project_switch so
the test does not click btn_md_only while a project switch is in
flight. Also added the wait calls to sim_context.py for the same
reason.
3. src/app_controller.py _handle_md_only: removed the is_project_stale()
early-return. The stale state is a transient window during which the
previous code dropped the click on the floor with a misleading
'stale ui' status. The MD generation worker is safe to run from any
project state; the action handler now always proceeds.
4. tests/test_extended_sims.py: set current_model to 'gemini-cli' so
_do_generate does not raise KeyError('model') when the test
overrides provider to gemini_cli.
KNOWN ISSUE: test_context_sim_live still fails with status
'switching to: temp_livecontextsim' after a 60s wait. The click
appears to be re-triggering a project switch via the GUI's render
loop. Root cause investigation deferred; the sim is async and the
test path is fragile.
This commit is contained in:
+12
-3
@@ -368,10 +368,19 @@ class ApiHookClient:
|
||||
instead of blind-polling the project state.
|
||||
[C: tests/test_api_hooks_project_switch.py]
|
||||
"""
|
||||
# Try the dedicated endpoint first (added later; not in older subprocesses).
|
||||
result = self._make_request('GET', '/api/project_switch_status')
|
||||
if not result or not isinstance(result, dict):
|
||||
return {"in_progress": False, "path": None, "error": None}
|
||||
return result
|
||||
if result and isinstance(result, dict) and 'in_progress' in result:
|
||||
return result
|
||||
# Fallback: read from /api/gui/state which has existed since the
|
||||
# initial live_gui fixture. This way the wait helper works against
|
||||
# ANY live_gui subprocess, regardless of when it was spawned.
|
||||
state = self._make_request('GET', '/api/gui/state') or {}
|
||||
return {
|
||||
"in_progress": bool(state.get('_project_switch_in_progress', False)),
|
||||
"path": state.get('active_project_path'),
|
||||
"error": state.get('_project_switch_error'),
|
||||
}
|
||||
|
||||
def wait_for_project_switch(self, expected_path: str = None, timeout: float = 30.0, poll_interval: float = 0.2) -> dict[str, Any]:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user