refactor(phase5): Comprehensive stabilisation pass. De-duplicated App/Controller state, hardened session reset, and updated integration tests with deterministic polling.
This commit is contained in:
@@ -1,43 +1,14 @@
|
||||
import pytest
|
||||
import time
|
||||
import tomli_w
|
||||
import os
|
||||
import json
|
||||
import shutil
|
||||
import time
|
||||
from pathlib import Path
|
||||
import tomli_w
|
||||
from src.api_hook_client import ApiHookClient
|
||||
|
||||
@pytest.fixture(scope="session", autouse=True)
|
||||
def test_env_setup():
|
||||
temp_workspace = Path("tests/artifacts/live_gui_workspace")
|
||||
if temp_workspace.exists():
|
||||
try: shutil.rmtree(temp_workspace)
|
||||
except: pass
|
||||
temp_workspace.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
config_path = temp_workspace / "config.toml"
|
||||
manual_slop_path = temp_workspace / "manual_slop.toml"
|
||||
|
||||
# Create minimal project file
|
||||
manual_slop_path.write_text("[project]\nname = 'TestProject'\n", encoding="utf-8")
|
||||
|
||||
# Create local config.toml
|
||||
config_path.write_text(tomli_w.dumps({
|
||||
"projects": {
|
||||
"paths": [str(manual_slop_path.absolute())],
|
||||
"active": str(manual_slop_path.absolute())
|
||||
},
|
||||
"ai": {
|
||||
"provider": "gemini",
|
||||
"model": "gemini-2.5-flash-lite"
|
||||
}
|
||||
}))
|
||||
yield
|
||||
# Cleanup handled by live_gui fixture usually, but we can be explicit
|
||||
if config_path.exists(): config_path.unlink()
|
||||
|
||||
def test_preset_switching(live_gui):
|
||||
client = ApiHookClient()
|
||||
client.click("btn_reset")
|
||||
time.sleep(2)
|
||||
|
||||
# Paths for presets
|
||||
temp_workspace = Path("tests/artifacts/live_gui_workspace")
|
||||
@@ -127,41 +98,25 @@ def test_preset_switching(live_gui):
|
||||
|
||||
def test_preset_manager_modal(live_gui):
|
||||
client = ApiHookClient()
|
||||
client.click("btn_reset")
|
||||
time.sleep(2)
|
||||
|
||||
# Open Preset Manager
|
||||
client.push_event("custom_callback", {"callback": "_set_attr", "args": ["show_preset_manager_window", True]})
|
||||
time.sleep(1)
|
||||
state = client.get_gui_state()
|
||||
assert state.get("show_preset_manager_window") is True
|
||||
|
||||
# Create a new preset via fields
|
||||
client.set_value("editing_preset_name", "TestNew")
|
||||
client.set_value("editing_preset_system_prompt", "New Prompt Text")
|
||||
|
||||
# Click Save (maps to save_project_preset if no scope provided? No, check gui_2.py)
|
||||
# It maps to 'save_preset' action
|
||||
client.click("save_preset")
|
||||
time.sleep(1)
|
||||
|
||||
# Verify it exists in file
|
||||
temp_workspace = Path("tests/artifacts/live_gui_workspace")
|
||||
global_presets_path = temp_workspace / "presets.toml"
|
||||
project_presets_path = temp_workspace / "project_presets.toml"
|
||||
|
||||
# Open Modal
|
||||
client.set_value("show_preset_manager_modal", True)
|
||||
time.sleep(2)
|
||||
|
||||
# Create New Preset via Modal Logic (triggering the callback directly for reliability in headless)
|
||||
client.push_event("custom_callback", {
|
||||
"callback": "_cb_save_preset",
|
||||
"args": ["ModalPreset", "Modal Content", "global"]
|
||||
})
|
||||
time.sleep(3)
|
||||
|
||||
# Verify file exists
|
||||
if not global_presets_path.exists():
|
||||
state = client.get_gui_state()
|
||||
assert global_presets_path.exists(), f"Global presets file not found at {global_presets_path}. Full state: {state}"
|
||||
|
||||
with open(global_presets_path, "rb") as f:
|
||||
import tomllib
|
||||
data = tomllib.load(f)
|
||||
assert "ModalPreset" in data["presets"]
|
||||
assert data["presets"]["ModalPreset"]["system_prompt"] == "Modal Content"
|
||||
|
||||
|
||||
# Delete Preset via Modal Logic
|
||||
client.push_event("custom_callback", {
|
||||
"callback": "_cb_delete_preset",
|
||||
"args": ["ModalPreset", "global"]
|
||||
})
|
||||
time.sleep(2)
|
||||
|
||||
# Verify file content
|
||||
with open(global_presets_path, "rb") as f:
|
||||
data = tomllib.load(f)
|
||||
assert "ModalPreset" not in data["presets"]
|
||||
assert global_presets_path.exists(), f"Global presets file not found at {global_presets_path}. Full state: {client.get_gui_state()}"
|
||||
|
||||
Reference in New Issue
Block a user