[WIP] Add tests and coverage
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
"""
|
||||
Pytest-based test suite for the gallery generator container.
|
||||
Clean, focused tests using pytest conventions.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
import sys
|
||||
import tempfile
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
# Add project root to Python path for container testing
|
||||
if Path('/src').exists():
|
||||
sys.path.insert(0, '/src')
|
||||
else:
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def temp_dir():
|
||||
"""Create a temporary directory for tests."""
|
||||
temp_path = tempfile.mkdtemp()
|
||||
yield temp_path
|
||||
shutil.rmtree(temp_path, ignore_errors=True)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_pdf_content():
|
||||
"""Mock PDF content for testing."""
|
||||
return (b'%PDF-1.4\n1 0 obj\n<<\n/Type /Catalog\n/Pages 2 0 R\n>>'
|
||||
b'\nendobj\nxref\n0 3\n0000000000 65535 f \ntrailer\n<<\n'
|
||||
b'/Size 3\n/Root 1 0 R\n>>\nstartxref\n9\n%%EOF')
|
||||
|
||||
|
||||
class TestEnvironment:
|
||||
"""Test container environment and dependencies."""
|
||||
|
||||
def test_python_version(self):
|
||||
"""Test Python version is correct."""
|
||||
assert sys.version_info.major == 3
|
||||
assert sys.version_info.minor >= 10
|
||||
|
||||
def test_required_packages(self):
|
||||
"""Test required packages are available."""
|
||||
import jinja2
|
||||
import yaml
|
||||
import coverage
|
||||
assert jinja2.__version__
|
||||
assert yaml.__version__
|
||||
assert coverage.__version__
|
||||
|
||||
|
||||
class TestCoreModules:
|
||||
"""Test core application modules."""
|
||||
|
||||
def test_generate_gallery_import(self):
|
||||
"""Test main module imports correctly."""
|
||||
try:
|
||||
import generate_gallery
|
||||
assert hasattr(generate_gallery, 'main')
|
||||
except ImportError:
|
||||
pytest.skip("generate_gallery not available in test environment")
|
||||
|
||||
def test_config_module(self):
|
||||
"""Test config module functionality."""
|
||||
try:
|
||||
from orchestration.config import Config
|
||||
assert hasattr(Config, 'from_yaml')
|
||||
except ImportError:
|
||||
pytest.skip("Config module not available")
|
||||
|
||||
def test_logger_module(self):
|
||||
"""Test logger module functionality."""
|
||||
try:
|
||||
from orchestration.logger import create_logger
|
||||
logger = create_logger('test')
|
||||
assert logger.name == 'test'
|
||||
except ImportError:
|
||||
pytest.skip("Logger module not available")
|
||||
|
||||
|
||||
class TestUtilityFunctions:
|
||||
"""Test utility functions."""
|
||||
|
||||
def test_file_operations(self, temp_dir):
|
||||
"""Test basic file operations."""
|
||||
test_file = Path(temp_dir) / 'test.txt'
|
||||
test_file.write_text('test content')
|
||||
assert test_file.exists()
|
||||
assert test_file.read_text() == 'test content'
|
||||
|
||||
def test_directory_operations(self, temp_dir):
|
||||
"""Test directory operations."""
|
||||
test_subdir = Path(temp_dir) / 'subdir'
|
||||
test_subdir.mkdir()
|
||||
assert test_subdir.is_dir()
|
||||
|
||||
|
||||
class TestPDFProcessing:
|
||||
"""Test PDF-related functionality."""
|
||||
|
||||
def test_mock_pdf_creation(self, temp_dir, mock_pdf_content):
|
||||
"""Test creating mock PDF files."""
|
||||
pdf_path = Path(temp_dir) / 'test.pdf'
|
||||
pdf_path.write_bytes(mock_pdf_content)
|
||||
assert pdf_path.exists()
|
||||
assert pdf_path.stat().st_size > 0
|
||||
|
||||
def test_imagemagick_available(self):
|
||||
"""Test ImageMagick is available in container."""
|
||||
import subprocess
|
||||
try:
|
||||
result = subprocess.run(['convert', '-version'],
|
||||
capture_output=True, text=True)
|
||||
assert result.returncode == 0
|
||||
assert 'ImageMagick' in result.stdout
|
||||
except FileNotFoundError:
|
||||
pytest.skip("ImageMagick not available")
|
||||
|
||||
|
||||
class TestMetadataSystem:
|
||||
"""Test metadata handling."""
|
||||
|
||||
def test_yaml_processing(self, temp_dir):
|
||||
"""Test YAML metadata processing."""
|
||||
import yaml
|
||||
|
||||
metadata = {
|
||||
'title': 'Test Gallery',
|
||||
'description': 'Test description',
|
||||
'plots': ['plot1.pdf', 'plot2.pdf']
|
||||
}
|
||||
|
||||
yaml_path = Path(temp_dir) / 'metadata.yaml'
|
||||
with open(yaml_path, 'w') as f:
|
||||
yaml.dump(metadata, f)
|
||||
|
||||
# Read back and verify
|
||||
with open(yaml_path, 'r') as f:
|
||||
loaded = yaml.safe_load(f)
|
||||
|
||||
assert loaded['title'] == 'Test Gallery'
|
||||
assert len(loaded['plots']) == 2
|
||||
|
||||
def test_metadata_module(self):
|
||||
"""Test metadata module if available."""
|
||||
try:
|
||||
from orchestration.metadata import load_metadata_file
|
||||
# Test with minimal functionality
|
||||
assert callable(load_metadata_file)
|
||||
except ImportError:
|
||||
pytest.skip("Metadata module not available")
|
||||
|
||||
|
||||
class TestGalleryGeneration:
|
||||
"""Test gallery generation workflow."""
|
||||
|
||||
def test_template_processing(self, temp_dir):
|
||||
"""Test Jinja2 template processing."""
|
||||
from jinja2 import Template
|
||||
|
||||
template_content = """
|
||||
<html>
|
||||
<title>{{ title }}</title>
|
||||
<body>
|
||||
{% for plot in plots %}
|
||||
<img src="{{ plot }}" alt="Plot {{ loop.index }}">
|
||||
{% endfor %}
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
template = Template(template_content)
|
||||
result = template.render(
|
||||
title='Test Gallery',
|
||||
plots=['plot1.png', 'plot2.png']
|
||||
)
|
||||
|
||||
assert 'Test Gallery' in result
|
||||
assert 'plot1.png' in result
|
||||
assert 'plot2.png' in result
|
||||
|
||||
def test_gallery_workflow(self, temp_dir, mock_pdf_content):
|
||||
"""Test complete gallery workflow simulation."""
|
||||
# Create mock directory structure
|
||||
input_dir = Path(temp_dir) / 'input'
|
||||
output_dir = Path(temp_dir) / 'output'
|
||||
input_dir.mkdir()
|
||||
output_dir.mkdir()
|
||||
|
||||
# Create mock PDF
|
||||
pdf_path = input_dir / 'test.pdf'
|
||||
pdf_path.write_bytes(mock_pdf_content)
|
||||
|
||||
# Create metadata
|
||||
import yaml
|
||||
metadata = {'title': 'Test', 'description': 'Test gallery'}
|
||||
meta_path = input_dir / 'metadata.yaml'
|
||||
with open(meta_path, 'w') as f:
|
||||
yaml.dump(metadata, f)
|
||||
|
||||
# Verify setup
|
||||
assert pdf_path.exists()
|
||||
assert meta_path.exists()
|
||||
assert output_dir.exists()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pytest.main([__file__, '-v'])
|
||||
Reference in New Issue
Block a user