Private
Public Access
0
0
Files
manual_slop/tests/test_handle_reset_session_clears_project.py
T
ed e0a3eb8c05 fix(app_controller): regression in test_context_sim_live from clearing active_project_path
Task 2 (_handle_reset_session reset) introduced a regression: setting self.active_project_path to empty caused an infinite re-switch loop in _do_project_switch because _flush_to_project writes to active_project_path (raises OSError on empty path), and the finally block re-submitted the failed switch on every iteration. Result: test_context_sim_live saw switching-to status for 5+ seconds and MD-only generation was blocked.

Fix: keep self.active_project_path as-is in _handle_reset_session. Only reset self.project (to a fresh default_project dict) and self.project_paths (to empty list). The stale project state issue is solved by replacing the project dict; the active_project_path stays valid for _flush_to_project.

- src/app_controller.py: refined _handle_reset_session project reset
- tests/test_handle_reset_session_clears_project.py: updated contract test to assert active_project_path is preserved
2026-06-08 12:24:10 -04:00

80 lines
3.1 KiB
Python

"""Red-phase test: _handle_reset_session must clear project state.
Background: the live_gui session-scoped fixture is shared across all 48 live
tests. Prior tests can leave stale `self.project` and `self.project_paths`
on the controller, which leaks into `test_full_live_workflow` and causes
it to fail with "Project not switched".
The fix: `_handle_reset_session` should reset `self.project` (to a fresh
default dict) and `self.project_paths` (empty list).
Note: `self.active_project_path` is INTENTIONALLY NOT cleared, because
`_do_project_switch` calls `_flush_to_project()` which writes to
`self.active_project_path`. An empty path would raise OSError and
create an infinite re-switch loop. (See the regression discovered
in test_context_sim_live on 2026-06-08.)
This test uses a real AppController() (per the test_view_presets pattern),
pollutes the state, then calls _handle_reset_session and asserts.
"""
import pytest
from src.app_controller import AppController
from src import project_manager
@pytest.fixture
def controller(tmp_path):
"""Build a real AppController with stale project state."""
proj_path = tmp_path / "stale_project.toml"
proj_path.write_text("[project]\nname = 'StaleProject'\n")
ctrl = AppController()
# Pollute with stale state mimicking what a prior live_gui test leaves behind
ctrl.project = {
"project": {"name": "StaleProject", "active_discussion": "main"},
"files": {"paths": [str(proj_path)]},
"discussion": {"discussions": {"main": {"history": ["stale msg"]}}},
}
ctrl.active_project_path = str(proj_path)
ctrl.project_paths = [str(proj_path)]
yield ctrl
def test_handle_reset_session_keeps_active_project_path(controller):
"""Active project path is intentionally NOT cleared.
`_do_project_switch` writes to it via `_flush_to_project`; clearing it
causes OSError on the next project switch. (Regression: test_context_sim_live
on 2026-06-08.)
"""
assert controller.active_project_path.endswith("stale_project.toml") # precondition
controller._handle_reset_session()
assert controller.active_project_path.endswith("stale_project.toml"), (
f"_handle_reset_session should NOT clear active_project_path "
f"(got {controller.active_project_path!r})"
)
def test_handle_reset_session_clears_project_paths(controller):
"""project_paths list must be cleared (or reset to defaults)."""
assert len(controller.project_paths) == 1 # precondition
controller._handle_reset_session()
assert controller.project_paths != [str(controller.active_project_path)], (
f"_handle_reset_session did not clear project_paths "
f"(still {controller.project_paths!r})"
)
def test_handle_reset_session_resets_project_to_valid_default(controller):
"""self.project must be a valid (non-stale) project dict after reset."""
assert controller.project["project"]["name"] == "StaleProject" # precondition
controller._handle_reset_session()
name = controller.project.get("project", {}).get("name", "")
assert name != "StaleProject", (
f"_handle_reset_session did not reset self.project (still {name!r})"
)
# And it must still be a usable project dict
assert isinstance(controller.project, dict)
assert "project" in controller.project