This commit is contained in:
2026-03-12 18:47:17 -04:00
parent 23943443e3
commit 19e7c94c2e
8 changed files with 65 additions and 46 deletions

View File

@@ -6,6 +6,7 @@ import os
import json
from pathlib import Path
from unittest.mock import patch
from src import paths
def test_track_proposal_editing(app_instance):
@@ -30,7 +31,7 @@ def test_track_proposal_editing(app_instance):
assert app_instance.proposed_tracks[0]['title'] == "New Title"
def test_conductor_setup_scan(app_instance, tmp_path):
def test_conductor_setup_scan(app_instance, tmp_path, monkeypatch):
"""
Verifies that the conductor setup scan properly iterates through the conductor directory,
counts files and lines, and identifies active tracks.
@@ -44,6 +45,9 @@ def test_conductor_setup_scan(app_instance, tmp_path):
(cond_dir / "tracks").mkdir(exist_ok=True)
(cond_dir / "tracks" / "track1").mkdir(exist_ok=True)
monkeypatch.setenv('SLOP_CONDUCTOR_DIR', str((tmp_path / 'conductor').resolve()))
paths.reset_resolved()
app_instance._cb_run_conductor_setup()
# ANTI-SIMPLIFICATION: Assert that the summary output correctly counts files/lines/tracks

View File

@@ -58,6 +58,9 @@ def test_gui_updates_on_event(app_instance: App) -> None:
mock_stats = {"percentage": 50.0, "current": 500, "limit": 1000}
app_instance.last_md = "mock_md"
with patch('src.ai_client.get_token_stats', return_value=mock_stats):
# Drain the queue
while not app_instance.event_queue.empty():
app_instance.event_queue.get()
# Simulate receiving an event from the API client thread
app_instance._on_api_event(payload={"text": "test"})

View File

@@ -37,6 +37,10 @@ def test_user_request_integration_flow(mock_app: App) -> None:
disc_text="History",
base_dir="."
)
while not app.controller.event_queue.empty():
app.controller.event_queue.get()
# 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.
@@ -87,6 +91,10 @@ def test_user_request_error_handling(mock_app: App) -> None:
disc_text="",
base_dir="."
)
while not app.controller.event_queue.empty():
app.controller.event_queue.get()
app.controller._handle_request_event(event)
# Manually consume from queue

View File

@@ -54,7 +54,7 @@ def test_mma_dashboard_refresh(app_instance: Any) -> None:
assert len(app.tracks) == 2
assert app.tracks[0]["id"] == "track_1"
assert app.tracks[1]["id"] == "track_2"
mock_pm.get_all_tracks.assert_called_with(app.ui_files_base_dir)
mock_pm.get_all_tracks.assert_called_with(app.active_project_root)
def test_mma_dashboard_initialization_refresh(app_instance: Any) -> None:

View File

@@ -10,26 +10,31 @@ def reset_paths():
paths.reset_resolved()
def test_default_paths():
assert paths.get_conductor_dir() == Path("conductor")
assert paths.get_logs_dir() == Path("logs/sessions")
assert paths.get_scripts_dir() == Path("scripts/generated")
# config path should now be an absolute path relative to src/paths.py
root_dir = Path(paths.__file__).resolve().parent.parent
assert paths.get_conductor_dir() == root_dir / "conductor"
assert paths.get_logs_dir() == root_dir / "logs/sessions"
assert paths.get_scripts_dir() == root_dir / "scripts/generated"
# config path should now be an absolute path relative to src/paths.py
assert paths.get_config_path() == root_dir / "config.toml"
assert paths.get_tracks_dir() == Path("conductor/tracks")
assert paths.get_archive_dir() == Path("conductor/archive")
assert paths.get_tracks_dir() == root_dir / "conductor/tracks"
assert paths.get_archive_dir() == root_dir / "conductor/archive"
def test_env_var_overrides(monkeypatch):
monkeypatch.setenv("SLOP_CONDUCTOR_DIR", "custom_conductor")
monkeypatch.setenv("SLOP_LOGS_DIR", "custom_logs")
monkeypatch.setenv("SLOP_SCRIPTS_DIR", "custom_scripts")
def test_env_var_overrides(tmp_path, monkeypatch):
root_dir = Path(paths.__file__).resolve().parent.parent
assert paths.get_conductor_dir() == Path("custom_conductor")
assert paths.get_logs_dir() == Path("custom_logs")
assert paths.get_scripts_dir() == Path("custom_scripts")
assert paths.get_tracks_dir() == Path("custom_conductor/tracks")
# Relative env var (resolved against root_dir)
monkeypatch.setenv("SLOP_CONDUCTOR_DIR", "custom_conductor")
assert paths.get_conductor_dir() == (root_dir / "custom_conductor").resolve()
paths.reset_resolved()
# Absolute env var
abs_logs = (tmp_path / "abs_logs").resolve()
monkeypatch.setenv("SLOP_LOGS_DIR", str(abs_logs))
assert paths.get_logs_dir() == abs_logs
def test_config_overrides(tmp_path, monkeypatch):
root_dir = Path(paths.__file__).resolve().parent.parent
config_file = tmp_path / "custom_config.toml"
content = """
[paths]
@@ -40,20 +45,12 @@ scripts_dir = "cfg_scripts"
config_file.write_text(content)
monkeypatch.setenv("SLOP_CONFIG", str(config_file))
# Need to update the _CONFIG_PATH in paths.py since it's set at import
# Actually, the get_config_path() uses _CONFIG_PATH which is Path(os.environ.get("SLOP_CONFIG", "config.toml"))
# But it's defined at module level. Let's see if we can reload it or if monkeypatching early enough works.
# In src/paths.py: _CONFIG_PATH: Path = Path(os.environ.get("SLOP_CONFIG", "config.toml"))
# This is set when src.paths is first imported.
# For the test to work, we might need to manually set paths._CONFIG_PATH or reload the module.
# paths._CONFIG_PATH = config_file # No longer needed
assert paths.get_conductor_dir() == Path("cfg_conductor")
assert paths.get_logs_dir() == Path("cfg_logs")
assert paths.get_scripts_dir() == Path("cfg_scripts")
assert paths.get_conductor_dir() == (root_dir / "cfg_conductor").resolve()
assert paths.get_logs_dir() == root_dir / "cfg_logs"
assert paths.get_scripts_dir() == root_dir / "cfg_scripts"
def test_precedence(tmp_path, monkeypatch):
root_dir = Path(paths.__file__).resolve().parent.parent
config_file = tmp_path / "custom_config.toml"
content = """
[paths]
@@ -63,7 +60,5 @@ conductor_dir = "cfg_conductor"
monkeypatch.setenv("SLOP_CONFIG", str(config_file))
monkeypatch.setenv("SLOP_CONDUCTOR_DIR", "env_conductor")
# paths._CONFIG_PATH = config_file # No longer needed
# Env var should take precedence over config
assert paths.get_conductor_dir() == Path("env_conductor")
assert paths.get_conductor_dir() == (root_dir / "env_conductor").resolve()