""" Test scenario for Issue #144: Advanced Asset Processing and Optimization This test covers format optimization, asset transformation, content analysis, and similarity detection features. Issue #144: Phase 3 - Advanced Features and Performance """ import pytest from pathlib import Path from unittest.mock import Mock, patch, MagicMock import json from PIL import Image import io from markitect.assets import AssetManager from markitect.assets.optimizer import AssetOptimizer, OptimizationProfile, OptimizationResult from markitect.assets.optimizer import AssetTransformer as OptimizerTransformer from markitect.assets.transformer import AssetTransformer, ThumbnailGenerator from markitect.assets.analyzer import ContentAnalyzer, SimilarityDetector, AssetMetricsCollector from tests.test_utils import create_test_workspace, get_test_asset_config class TestAssetOptimizationAndProcessing: """Test advanced asset processing and optimization for Issue #144.""" def setup_method(self): """Set up test environment with sample assets.""" self.temp_dir = create_test_workspace("asset_optimization") self.assets_dir = self.temp_dir / "assets" self.test_files_dir = self.temp_dir / "test_files" self.assets_dir.mkdir() self.test_files_dir.mkdir() # Create sample image data self.create_test_images() self.create_test_documents() # Use test asset configuration to ensure isolated registry config = get_test_asset_config(self.temp_dir) self.asset_manager = AssetManager(config) def teardown_method(self): """Clean up temporary directories.""" import shutil shutil.rmtree(self.temp_dir, ignore_errors=True) def create_test_images(self): """Create test images with various properties.""" # Large PNG image large_image = Image.new('RGB', (2000, 1500), color='red') large_png_path = self.test_files_dir / "large_image.png" large_image.save(large_png_path, 'PNG') # High quality JPEG high_quality_image = Image.new('RGB', (1200, 800), color='blue') high_jpeg_path = self.test_files_dir / "high_quality.jpg" high_quality_image.save(high_jpeg_path, 'JPEG', quality=95) # SVG content svg_content = ''' ''' svg_path = self.test_files_dir / "diagram.svg" svg_path.write_text(svg_content) def create_test_documents(self): """Create test document files.""" # Simple PDF placeholder (would be real PDF in production) pdf_path = self.test_files_dir / "document.pdf" pdf_path.write_bytes(b"%PDF-1.4 mock pdf content") # Text document text_path = self.test_files_dir / "document.txt" text_path.write_text("This is a sample text document with content.") def test_asset_optimizer_initialization(self): """Test AssetOptimizer initialization with different profiles.""" # Default profile optimizer = AssetOptimizer() assert optimizer.profile == OptimizationProfile.BALANCED # Custom profile custom_profile = OptimizationProfile.AGGRESSIVE optimizer_aggressive = AssetOptimizer(profile=custom_profile) assert optimizer_aggressive.profile == OptimizationProfile.AGGRESSIVE def test_image_compression_optimization(self): """Test automatic image compression and format conversion.""" optimizer = AssetOptimizer(profile=OptimizationProfile.AGGRESSIVE) # Test PNG optimization png_path = self.test_files_dir / "large_image.png" result = optimizer.optimize_image(png_path) assert isinstance(result, OptimizationResult) assert result.original_size > result.optimized_size assert result.size_reduction_percent > 0 assert result.optimization_type == "image_compression" # Verify optimized file exists and is smaller assert result.optimized_path.exists() assert result.optimized_path.stat().st_size < png_path.stat().st_size def test_jpeg_quality_optimization(self): """Test JPEG quality optimization with configurable settings.""" optimizer = AssetOptimizer() jpeg_path = self.test_files_dir / "high_quality.jpg" result = optimizer.optimize_image( jpeg_path, target_quality=85, max_width=1000 ) assert result.original_size > result.optimized_size assert result.quality_maintained >= 85 # Verify image dimensions were reduced if needed with Image.open(result.optimized_path) as img: assert img.width <= 1000 def test_svg_optimization_and_minification(self): """Test SVG optimization and minification.""" optimizer = AssetOptimizer() svg_path = self.test_files_dir / "diagram.svg" result = optimizer.optimize_svg(svg_path) assert result.original_size > result.optimized_size # Verify comments and whitespace were removed optimized_content = result.optimized_path.read_text() assert "