#!/usr/bin/env python3
"""Tests for scitex_writer._project._create."""
from unittest.mock import patch
import pytest
from scitex_writer._project._create import ensure_project_exists
class TestEnsureProjectExistsExisting:
"""Tests for ensure_project_exists when project already exists."""
def test_returns_existing_directory(self, tmp_path):
"""Verify returns existing project directory."""
project_dir = tmp_path / "my_paper"
project_dir.mkdir()
result = ensure_project_exists(project_dir, "my_paper")
assert result == project_dir
def test_does_not_call_clone_for_existing(self, tmp_path):
"""Verify clone is not called when project exists."""
project_dir = tmp_path / "my_paper"
project_dir.mkdir()
with patch("scitex_writer._project._create.clone_writer_project") as mock_clone:
ensure_project_exists(project_dir, "my_paper")
mock_clone.assert_not_called()
def test_existing_directory_with_contents(self, tmp_path):
"""Verify returns existing directory with contents."""
project_dir = tmp_path / "my_paper"
project_dir.mkdir()
(project_dir / "01_manuscript").mkdir()
(project_dir / "file.tex").write_text("content")
result = ensure_project_exists(project_dir, "my_paper")
assert result == project_dir
assert (result / "01_manuscript").exists()
class TestEnsureProjectExistsNew:
"""Tests for ensure_project_exists when creating new project."""
def test_calls_clone_with_correct_args(self, tmp_path):
"""Verify clone is called with correct arguments."""
project_dir = tmp_path / "new_paper"
def mock_clone_side_effect(*args, **kwargs):
# Simulate clone creating the directory
project_dir.mkdir(parents=True, exist_ok=True)
return True
with patch(
"scitex_writer._project._create.clone_writer_project",
side_effect=mock_clone_side_effect,
) as mock_clone:
ensure_project_exists(project_dir, "new_paper")
mock_clone.assert_called_once_with(str(project_dir), "child", None, None)
def test_passes_git_strategy(self, tmp_path):
"""Verify git_strategy is passed to clone."""
project_dir = tmp_path / "new_paper"
def mock_clone_side_effect(*args, **kwargs):
project_dir.mkdir(parents=True, exist_ok=True)
return True
with patch(
"scitex_writer._project._create.clone_writer_project",
side_effect=mock_clone_side_effect,
) as mock_clone:
ensure_project_exists(project_dir, "new_paper", git_strategy="standalone")
mock_clone.assert_called_once_with(
str(project_dir), "standalone", None, None
)
def test_passes_branch(self, tmp_path):
"""Verify branch parameter is passed to clone."""
project_dir = tmp_path / "new_paper"
def mock_clone_side_effect(*args, **kwargs):
project_dir.mkdir(parents=True, exist_ok=True)
return True
with patch(
"scitex_writer._project._create.clone_writer_project",
side_effect=mock_clone_side_effect,
) as mock_clone:
ensure_project_exists(project_dir, "new_paper", branch="develop")
mock_clone.assert_called_once_with(
str(project_dir), "child", "develop", None
)
def test_passes_tag(self, tmp_path):
"""Verify tag parameter is passed to clone."""
project_dir = tmp_path / "new_paper"
def mock_clone_side_effect(*args, **kwargs):
project_dir.mkdir(parents=True, exist_ok=True)
return True
with patch(
"scitex_writer._project._create.clone_writer_project",
side_effect=mock_clone_side_effect,
) as mock_clone:
ensure_project_exists(project_dir, "new_paper", tag="v1.0.0")
mock_clone.assert_called_once_with(
str(project_dir), "child", None, "v1.0.0"
)
def test_returns_created_directory(self, tmp_path):
"""Verify returns the created project directory."""
project_dir = tmp_path / "new_paper"
def mock_clone_side_effect(*args, **kwargs):
project_dir.mkdir(parents=True, exist_ok=True)
return True
with patch(
"scitex_writer._project._create.clone_writer_project",
side_effect=mock_clone_side_effect,
):
result = ensure_project_exists(project_dir, "new_paper")
assert result == project_dir
class TestEnsureProjectExistsFailure:
"""Tests for ensure_project_exists failure cases."""
def test_raises_when_clone_fails(self, tmp_path):
"""Verify raises RuntimeError when clone returns False."""
project_dir = tmp_path / "new_paper"
with patch("scitex_writer._project._create.clone_writer_project") as mock_clone:
mock_clone.return_value = False
with pytest.raises(RuntimeError, match="Could not create"):
ensure_project_exists(project_dir, "new_paper")
def test_raises_when_directory_not_created(self, tmp_path):
"""Verify raises RuntimeError when directory not created after clone."""
project_dir = tmp_path / "new_paper"
with patch("scitex_writer._project._create.clone_writer_project") as mock_clone:
mock_clone.return_value = True
# Don't create directory - simulate clone not creating it
with pytest.raises(RuntimeError, match="was not created"):
ensure_project_exists(project_dir, "new_paper")
class TestEnsureProjectExistsGitStrategy:
"""Tests for ensure_project_exists git_strategy parameter."""
def test_git_strategy_none(self, tmp_path):
"""Verify git_strategy=None is passed correctly."""
project_dir = tmp_path / "new_paper"
def mock_clone_side_effect(*args, **kwargs):
project_dir.mkdir(parents=True, exist_ok=True)
return True
with patch(
"scitex_writer._project._create.clone_writer_project",
side_effect=mock_clone_side_effect,
) as mock_clone:
ensure_project_exists(project_dir, "new_paper", git_strategy=None)
mock_clone.assert_called_once_with(str(project_dir), None, None, None)
def test_default_git_strategy_is_child(self, tmp_path):
"""Verify default git_strategy is 'child'."""
project_dir = tmp_path / "new_paper"
def mock_clone_side_effect(*args, **kwargs):
project_dir.mkdir(parents=True, exist_ok=True)
return True
with patch(
"scitex_writer._project._create.clone_writer_project",
side_effect=mock_clone_side_effect,
) as mock_clone:
ensure_project_exists(project_dir, "new_paper")
call_args = mock_clone.call_args[0]
assert call_args[1] == "child"
if __name__ == "__main__":
import os
import pytest
pytest.main([os.path.abspath(__file__)])