#!/usr/bin/env python3
"""Tests for scitex_writer._project._validate."""
import pytest
from scitex_writer._project._validate import validate_structure
class TestValidateStructureSuccess:
"""Tests for validate_structure when structure is valid."""
def test_passes_with_all_required_directories(self, tmp_path):
"""Verify validate_structure passes with complete structure."""
(tmp_path / "01_manuscript").mkdir()
(tmp_path / "02_supplementary").mkdir()
(tmp_path / "03_revision").mkdir()
# Should not raise
validate_structure(tmp_path)
def test_passes_with_extra_directories(self, tmp_path):
"""Verify validate_structure passes when extra directories exist."""
(tmp_path / "01_manuscript").mkdir()
(tmp_path / "02_supplementary").mkdir()
(tmp_path / "03_revision").mkdir()
(tmp_path / "scripts").mkdir()
(tmp_path / "shared").mkdir()
# Should not raise
validate_structure(tmp_path)
class TestValidateStructureFailure:
"""Tests for validate_structure when structure is invalid."""
def test_raises_when_manuscript_missing(self, tmp_path):
"""Verify raises RuntimeError when 01_manuscript is missing."""
(tmp_path / "02_supplementary").mkdir()
(tmp_path / "03_revision").mkdir()
with pytest.raises(RuntimeError, match="01_manuscript"):
validate_structure(tmp_path)
def test_raises_when_supplementary_missing(self, tmp_path):
"""Verify raises RuntimeError when 02_supplementary is missing."""
(tmp_path / "01_manuscript").mkdir()
(tmp_path / "03_revision").mkdir()
with pytest.raises(RuntimeError, match="02_supplementary"):
validate_structure(tmp_path)
def test_raises_when_revision_missing(self, tmp_path):
"""Verify raises RuntimeError when 03_revision is missing."""
(tmp_path / "01_manuscript").mkdir()
(tmp_path / "02_supplementary").mkdir()
with pytest.raises(RuntimeError, match="03_revision"):
validate_structure(tmp_path)
def test_raises_when_all_missing(self, tmp_path):
"""Verify raises RuntimeError when all required dirs are missing."""
with pytest.raises(RuntimeError, match="01_manuscript"):
validate_structure(tmp_path)
def test_error_message_contains_path(self, tmp_path):
"""Verify error message contains the expected directory path."""
with pytest.raises(RuntimeError) as exc_info:
validate_structure(tmp_path)
assert "expected at:" in str(exc_info.value)
class TestValidateStructureEdgeCases:
"""Tests for validate_structure edge cases."""
def test_file_instead_of_directory(self, tmp_path):
"""Verify raises when file exists instead of directory."""
(tmp_path / "01_manuscript").write_text("not a directory")
(tmp_path / "02_supplementary").mkdir()
(tmp_path / "03_revision").mkdir()
# File exists but is not a directory - exists() still returns True
# This may or may not be an issue depending on expected behavior
validate_structure(tmp_path)
def test_nested_project_directory(self, tmp_path):
"""Verify works with nested project directory."""
nested = tmp_path / "projects" / "my_paper"
nested.mkdir(parents=True)
(nested / "01_manuscript").mkdir()
(nested / "02_supplementary").mkdir()
(nested / "03_revision").mkdir()
validate_structure(nested)
if __name__ == "__main__":
import os
import pytest
pytest.main([os.path.abspath(__file__)])