Files
myagents/tests/test_project_root.py
T
Zhengshou Lai ab597d1d02 refactor: rename source dir to bin, reorganize templates, remove personal info
- Rename myclaude/ source directory → bin/
- Update all Python imports (myclaude.* → bin.*) and mock patch paths
- Update pyproject.toml: entry point and packages config
- Move workspace_template/ → templates/workspace/ for future extensibility
- Migrate .claude/skills/ to global ~/.claude/skills/ and remove local copies
- Remove SessionStart hook (sync-global.sh) from settings.local.json
- Remove unrelated script rename_funcs_to_snake.py
- Remove personal info (name, org, paths) from CLAUDE.md, README.md, settings
- Update .gitignore with standard Python/runtime exclusions
- Clean .DS_Store, __pycache__, .mypy_cache, .pytest_cache, .ruff_cache,
  .playwright-mcp runtime files
2026-04-26 09:37:13 +08:00

81 lines
3.3 KiB
Python

"""Tests for myclaude.project_root."""
import os
from pathlib import Path
from unittest.mock import patch
from bin.project_root import get_myclaude_project_root, get_workspace_root
class TestGetMyclaudeProjectRoot:
"""Tests for get_myclaude_project_root."""
def test_env_var_takes_priority(self, tmp_path: Path) -> None:
"""MYCLAUDE_PROJECT_ROOT env var should be used when set."""
fake_root = tmp_path / "fake_repo"
fake_root.mkdir()
(fake_root / "pyproject.toml").write_text('name = "myclaude"\n')
with patch.dict(os.environ, {"MYCLAUDE_PROJECT_ROOT": str(fake_root)}):
result = get_myclaude_project_root()
assert result == fake_root.resolve()
def test_fallback_when_not_in_repo(self) -> None:
"""When not in a repo, fallback to ~/.myclaude."""
with patch.dict(os.environ, {}, clear=True):
with patch("pathlib.Path.cwd", side_effect=OSError):
with patch("bin.project_root._pyproject_names_myclaude", return_value=False):
result = get_myclaude_project_root()
assert result == Path.home() / ".myclaude"
class TestGetWorkspaceRoot:
"""Tests for get_workspace_root."""
def test_env_var_takes_priority(self, tmp_path: Path) -> None:
"""MYCLAUDE_WORKSPACE_ROOT env var should be used when set."""
custom = tmp_path / "custom_workspace"
with patch.dict(os.environ, {"MYCLAUDE_WORKSPACE_ROOT": str(custom)}):
result = get_workspace_root()
assert result == custom.resolve()
assert result.is_dir()
def test_creates_directory_if_missing(self, tmp_path: Path) -> None:
"""Should create the workspace directory if it doesn't exist."""
new_ws = tmp_path / "new_workspace"
assert not new_ws.exists()
with patch.dict(os.environ, {"MYCLAUDE_WORKSPACE_ROOT": str(new_ws)}):
result = get_workspace_root()
assert result == new_ws.resolve()
assert result.is_dir()
def test_defaults_to_project_workspace(self, tmp_path: Path) -> None:
"""When project_root/workspace exists, use it."""
project_root = tmp_path / "myclaude"
project_root.mkdir()
workspace = project_root / "workspace"
workspace.mkdir()
(project_root / "pyproject.toml").write_text('name = "myclaude"\n')
with patch.dict(os.environ, {"MYCLAUDE_PROJECT_ROOT": str(project_root)}, clear=True):
result = get_workspace_root()
assert result == workspace.resolve()
def test_defaults_to_home_workspace(self, tmp_path: Path) -> None:
"""When no env var and no project workspace, default to ~/workspace."""
with (
patch.dict(os.environ, {}, clear=True),
patch("bin.project_root.get_myclaude_project_root", return_value=tmp_path / ".myclaude"),
patch.dict(os.environ, {}, clear=True),
):
with patch.dict(os.environ, {}, clear=True):
# Ensure HOME is set for Path.home()
home = tmp_path / "home"
home.mkdir()
with patch("pathlib.Path.home", return_value=home):
result = get_workspace_root()
assert result == home / "workspace"
assert result.is_dir()