Tests still imported and patched the old bin.* package (renamed to myclaude.* earlier), breaking collection. Point them at myclaude.* and add coverage for the new claude-flag passthrough and --list session listing.
106 lines
3.8 KiB
Python
106 lines
3.8 KiB
Python
"""Tests for myclaude.project_root."""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
from myclaude.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_env_var_expands_tilde(self, tmp_path: Path) -> None:
|
|
"""MYCLAUDE_PROJECT_ROOT should expand ~ to home directory."""
|
|
home = tmp_path / "home"
|
|
home.mkdir()
|
|
fake_root = home / "fake_repo"
|
|
fake_root.mkdir()
|
|
(fake_root / "pyproject.toml").write_text('name = "myclaude"\n')
|
|
|
|
with patch.dict(
|
|
os.environ,
|
|
{
|
|
"MYCLAUDE_PROJECT_ROOT": "~/fake_repo",
|
|
"HOME": str(home),
|
|
},
|
|
):
|
|
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),
|
|
patch("pathlib.Path.cwd", side_effect=OSError),
|
|
patch(
|
|
"myclaude.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."""
|
|
home = tmp_path / "home"
|
|
home.mkdir()
|
|
with (
|
|
patch.dict(os.environ, {}, clear=True),
|
|
patch(
|
|
"myclaude.project_root.get_myclaude_project_root",
|
|
return_value=tmp_path / ".myclaude",
|
|
),
|
|
patch("pathlib.Path.home", return_value=home),
|
|
):
|
|
result = get_workspace_root()
|
|
assert result == home / "workspace"
|
|
assert result.is_dir()
|