import pytest import tomli_w from pathlib import Path from src.tool_presets import ToolPresetManager from src.models import ToolPreset from src import paths @pytest.fixture def temp_paths(tmp_path, monkeypatch): global_dir = tmp_path / "global" global_dir.mkdir() project_dir = tmp_path / "project" project_dir.mkdir() global_presets = global_dir / "tool_presets.toml" project_presets = project_dir / "project_tool_presets.toml" monkeypatch.setattr(paths, "get_global_tool_presets_path", lambda: global_presets) monkeypatch.setattr(paths, "get_project_tool_presets_path", lambda _: project_presets) return { "global_dir": global_dir, "project_dir": project_dir, "global_presets": global_presets, "project_presets": project_presets } def test_load_all_merged(temp_paths): # Setup global presets global_data = { "default": { "categories": { "file": {"read": True}, "shell": {"run": False} } }, "global_only": { "categories": {"web": {"search": True}} } } with open(temp_paths["global_presets"], "wb") as f: tomli_w.dump(global_data, f) # Setup project presets (overrides 'default') project_data = { "default": { "categories": { "file": {"read": True}, "shell": {"run": True} # Override } }, "project_only": { "categories": {"git": {"commit": True}} } } with open(temp_paths["project_presets"], "wb") as f: tomli_w.dump(project_data, f) manager = ToolPresetManager(project_root=temp_paths["project_dir"]) all_presets = manager.load_all() assert "default" in all_presets assert all_presets["default"].categories["shell"]["run"] is True # Overridden assert "global_only" in all_presets assert "project_only" in all_presets assert all_presets["global_only"].categories["web"]["search"] is True assert all_presets["project_only"].categories["git"]["commit"] is True def test_save_preset_global(temp_paths): manager = ToolPresetManager() preset = ToolPreset(name="new_global", categories={"test": {"ok": True}}) manager.save_preset(preset, scope="global") assert temp_paths["global_presets"].exists() loaded = manager._load_from_path(temp_paths["global_presets"]) assert "new_global" in loaded assert loaded["new_global"].categories == {"test": {"ok": True}} def test_save_preset_project(temp_paths): manager = ToolPresetManager(project_root=temp_paths["project_dir"]) preset = ToolPreset(name="new_project", categories={"test": {"ok": False}}) manager.save_preset(preset, scope="project") assert temp_paths["project_presets"].exists() loaded = manager._load_from_path(temp_paths["project_presets"]) assert "new_project" in loaded assert loaded["new_project"].categories == {"test": {"ok": False}} def test_delete_preset_global(temp_paths): # Initial global setup global_data = { "to_delete": {"categories": {}}, "keep": {"categories": {}} } with open(temp_paths["global_presets"], "wb") as f: tomli_w.dump(global_data, f) manager = ToolPresetManager() manager.delete_preset("to_delete", scope="global") loaded = manager._load_from_path(temp_paths["global_presets"]) assert "to_delete" not in loaded assert "keep" in loaded def test_delete_preset_project(temp_paths): # Initial project setup project_data = { "to_delete": {"categories": {}}, "keep": {"categories": {}} } with open(temp_paths["project_presets"], "wb") as f: tomli_w.dump(project_data, f) manager = ToolPresetManager(project_root=temp_paths["project_dir"]) manager.delete_preset("to_delete", scope="project") loaded = manager._load_from_path(temp_paths["project_presets"]) assert "to_delete" not in loaded assert "keep" in loaded def test_save_project_no_root_raises(temp_paths): manager = ToolPresetManager(project_root=None) preset = ToolPreset(name="fail", categories={}) with pytest.raises(ValueError, match="Project root not set"): manager.save_preset(preset, scope="project") def test_delete_project_no_root_raises(temp_paths): manager = ToolPresetManager(project_root=None) with pytest.raises(ValueError, match="Project root not set"): manager.delete_preset("any", scope="project") def test_invalid_scope_raises(temp_paths): manager = ToolPresetManager() preset = ToolPreset(name="fail", categories={}) with pytest.raises(ValueError, match="Invalid scope"): manager.save_preset(preset, scope="invalid") with pytest.raises(ValueError, match="Invalid scope"): manager.delete_preset("any", scope="invalid")