trax/tests/test_media_integration.py

156 lines
5.7 KiB
Python

"""Integration tests for media service interactions."""
import pytest
from pathlib import Path
from src.services.mocks import create_mock_media_service
from src.services.protocols import MediaServiceProtocol
class TestMediaServiceIntegration:
"""Test media service interactions and workflows."""
@pytest.fixture
def media_service(self):
"""Create mock media service for testing."""
return create_mock_media_service()
@pytest.mark.asyncio
async def test_media_download_workflow(self, media_service):
"""Test complete media download workflow."""
url = "https://example.com/test.mp3"
output_dir = Path("/tmp/test_output")
media_info = await media_service.download_media(url, output_dir)
assert media_info.file_path == output_dir / "mock_download.wav"
assert media_info.file_size == 1024000
assert media_info.duration == 120.5
assert media_info.format == "wav"
assert media_info.sample_rate == 16000
assert media_info.channels == 1
@pytest.mark.asyncio
async def test_audio_preprocessing_workflow(self, media_service):
"""Test audio preprocessing workflow."""
input_path = Path("/tmp/input.mp3")
output_path = Path("/tmp/output.wav")
success = await media_service.preprocess_audio(input_path, output_path)
assert success is True
@pytest.mark.asyncio
async def test_file_validation_operations(self, media_service):
"""Test file validation operations."""
# Test file size validation
is_valid = await media_service.validate_file_size(Path("/tmp/test.wav"), max_size_mb=1)
assert is_valid is True
# Test with larger max size
is_valid = await media_service.validate_file_size(Path("/tmp/test.wav"), max_size_mb=2)
assert is_valid is True
# Test with smaller max size (should fail)
is_valid = await media_service.validate_file_size(Path("/tmp/test.wav"), max_size_mb=0.5)
assert is_valid is False
@pytest.mark.asyncio
async def test_audio_quality_checks(self, media_service):
"""Test audio quality checking operations."""
quality_ok = await media_service.check_audio_quality(Path("/tmp/test.wav"))
assert quality_ok is True
@pytest.mark.asyncio
async def test_media_info_extraction(self, media_service):
"""Test media information extraction."""
info = await media_service.get_media_info(Path("/tmp/test.wav"))
assert info["file_path"] == "/tmp/mock_audio.wav"
assert info["file_size"] == 1024000
assert info["duration"] == 120.5
assert info["format"] == "wav"
assert info["sample_rate"] == 16000
assert info["channels"] == 1
@pytest.mark.asyncio
async def test_media_file_record_operations(self, media_service):
"""Test media file record operations."""
from src.services.protocols import MediaFileInfo
media_info = MediaFileInfo(
file_path=Path("/tmp/test.wav"),
file_size=1024000,
duration=120.5,
format="wav",
sample_rate=16000,
channels=1
)
# Test record creation
media_file = await media_service.create_media_file_record(media_info)
assert media_file is not None
assert hasattr(media_file, 'id')
assert hasattr(media_file, 'file_path')
assert hasattr(media_file, 'file_size')
# Test record retrieval
retrieved_file = await media_service.get_media_file_by_id(media_file.id)
assert retrieved_file is not None
assert retrieved_file.id == media_file.id
@pytest.mark.asyncio
async def test_media_pipeline_workflow(self, media_service):
"""Test complete media processing pipeline."""
url = "https://youtube.com/watch?v=test123"
output_dir = Path("/tmp/test_pipeline")
media_file = await media_service.process_media_pipeline(url, output_dir)
assert media_file is not None
assert hasattr(media_file, 'id')
assert hasattr(media_file, 'file_path')
assert hasattr(media_file, 'file_size')
@pytest.mark.asyncio
async def test_progress_callback_functionality(self, media_service):
"""Test progress callback functionality in media operations."""
progress_updates = []
def progress_callback(progress: float, message: str):
progress_updates.append((progress, message))
# Test download with progress callback
await media_service.download_media(
"https://example.com/test.mp3",
Path("/tmp"),
progress_callback
)
# Verify progress updates were called
assert len(progress_updates) > 0
assert progress_updates[0][0] == 0.25
assert progress_updates[-1][0] == 1.0
# Test preprocessing with progress callback
progress_updates.clear()
await media_service.preprocess_audio(
Path("/tmp/input.mp3"),
Path("/tmp/output.wav"),
progress_callback
)
assert len(progress_updates) > 0
assert progress_updates[0][0] == 0.33
assert progress_updates[-1][0] == 1.0
@pytest.mark.asyncio
async def test_service_protocol_compliance(self, media_service):
"""Test that media service properly implements its protocol."""
from src.services.protocols import validate_protocol_implementation, MediaServiceProtocol
assert validate_protocol_implementation(media_service, MediaServiceProtocol)
if __name__ == "__main__":
pytest.main([__file__])