trax/tests/test_service_factories.py

280 lines
13 KiB
Python

"""Unit tests for service factory functions."""
import pytest
from unittest.mock import MagicMock, patch
from typing import Dict, Any
from src.services.factories import (
create_youtube_service,
create_media_service,
create_transcription_service,
create_enhancement_service,
create_export_service,
create_batch_processor,
create_service_container,
create_minimal_service_container,
validate_service_container,
get_service_dependencies,
)
class TestServiceFactories:
"""Test service factory functions."""
def test_create_youtube_service_basic(self):
"""Test YouTube service factory function basic functionality."""
# Test that the function can be called without errors
# We'll use a mock repository to avoid database dependencies
mock_repository = MagicMock()
with patch('src.services.factories.YouTubeRepository', return_value=mock_repository):
with patch('src.services.factories.YouTubeMetadataService') as mock_service_class:
mock_service_instance = MagicMock()
mock_service_class.return_value = mock_service_instance
service = create_youtube_service()
# Verify service was created
mock_service_class.assert_called_once()
assert service == mock_service_instance
def test_create_media_service_basic(self):
"""Test media service factory function basic functionality."""
# Test that the function can be called without errors
with patch('src.services.factories.MediaDownloadService') as mock_download:
with patch('src.services.factories.MediaPreprocessingService') as mock_preprocessing:
with patch('src.services.factories.MediaDatabaseService') as mock_database:
with patch('src.services.factories.MediaService') as mock_service_class:
mock_service_instance = MagicMock()
mock_service_class.return_value = mock_service_instance
service = create_media_service()
# Verify service was created
mock_service_class.assert_called_once()
assert service == mock_service_instance
def test_create_transcription_service_basic(self):
"""Test transcription service factory function basic functionality."""
# Test that the function can be called without errors
mock_repository = MagicMock()
with patch('src.services.factories.create_transcription_repository', return_value=mock_repository):
with patch('src.services.factories.TranscriptionService') as mock_service_class:
mock_service_instance = MagicMock()
mock_service_class.return_value = mock_service_instance
service = create_transcription_service()
# Verify service was created
mock_service_class.assert_called_once()
assert service == mock_service_instance
def test_create_enhancement_service_basic(self):
"""Test enhancement service factory function basic functionality."""
# Test that the function can be called without errors
mock_config = MagicMock()
with patch('src.services.factories.EnhancementConfig', return_value=mock_config):
with patch('src.services.factories.DeepSeekEnhancementService') as mock_service_class:
mock_service_instance = MagicMock()
mock_service_class.return_value = mock_service_instance
service = create_enhancement_service()
# Verify service was created
mock_service_class.assert_called_once()
assert service == mock_service_instance
def test_create_export_service_basic(self):
"""Test export service factory function basic functionality."""
# Test that the function can be called without errors
with patch('src.services.factories.ExportService') as mock_service_class:
mock_service_instance = MagicMock()
mock_service_class.return_value = mock_service_instance
service = create_export_service()
# Verify service was created
mock_service_class.assert_called_once()
assert service == mock_service_instance
def test_create_batch_processor_basic(self):
"""Test batch processor factory function basic functionality."""
# Test that the function can be called without errors
mock_services = {
'media_service': MagicMock(),
'transcription_service': MagicMock(),
'enhancement_service': MagicMock(),
'export_service': MagicMock(),
}
with patch('src.services.factories.create_media_service', return_value=mock_services['media_service']):
with patch('src.services.factories.create_transcription_service', return_value=mock_services['transcription_service']):
with patch('src.services.factories.create_enhancement_service', return_value=mock_services['enhancement_service']):
with patch('src.services.factories.create_export_service', return_value=mock_services['export_service']):
with patch('src.services.factories.BatchProcessor') as mock_processor_class:
mock_processor_instance = MagicMock()
mock_processor_class.return_value = mock_processor_instance
processor = create_batch_processor()
# Verify processor was created
mock_processor_class.assert_called_once()
assert processor == mock_processor_instance
def test_create_service_container_basic(self):
"""Test service container factory function basic functionality."""
# Test that the function can be called without errors
mock_services = {
'youtube_service': MagicMock(),
'media_service': MagicMock(),
'transcription_service': MagicMock(),
'enhancement_service': MagicMock(),
'export_service': MagicMock(),
'batch_processor': MagicMock(),
}
with patch('src.services.factories.YouTubeRepository'):
with patch('src.services.factories.create_transcription_repository'):
with patch('src.services.factories.create_media_repository'):
with patch('src.services.factories.create_youtube_service', return_value=mock_services['youtube_service']):
with patch('src.services.factories.create_media_service', return_value=mock_services['media_service']):
with patch('src.services.factories.create_transcription_service', return_value=mock_services['transcription_service']):
with patch('src.services.factories.create_enhancement_service', return_value=mock_services['enhancement_service']):
with patch('src.services.factories.create_export_service', return_value=mock_services['export_service']):
with patch('src.services.factories.create_batch_processor', return_value=mock_services['batch_processor']):
services = create_service_container()
# Verify all services were created
assert len(services) == 6
assert all(key in services for key in mock_services.keys())
def test_create_minimal_service_container_basic(self):
"""Test minimal service container factory function basic functionality."""
# Test that the function can be called without errors
mock_services = {
'youtube_service': MagicMock(),
'media_service': MagicMock(),
'transcription_service': MagicMock(),
}
with patch('src.services.factories.create_youtube_service', return_value=mock_services['youtube_service']):
with patch('src.services.factories.create_media_service', return_value=mock_services['media_service']):
with patch('src.services.factories.create_transcription_service', return_value=mock_services['transcription_service']):
services = create_minimal_service_container()
# Verify only core services were created
assert len(services) == 3
assert all(key in services for key in mock_services.keys())
class TestServiceValidation:
"""Test service validation utilities."""
def test_validate_service_container_with_valid_services(self):
"""Test service container validation with valid services."""
# Create mock services that implement their protocols
mock_youtube_service = MagicMock()
mock_media_service = MagicMock()
mock_transcription_service = MagicMock()
# Mock the required methods for each service
mock_youtube_service.extract_metadata = MagicMock()
mock_youtube_service.batch_extract = MagicMock()
mock_media_service.download_media = MagicMock()
mock_media_service.preprocess_audio = MagicMock()
mock_media_service.validate_file_size = MagicMock()
mock_media_service.check_audio_quality = MagicMock()
mock_media_service.get_media_info = MagicMock()
mock_media_service.create_media_file_record = MagicMock()
mock_media_service.update_media_file_status = MagicMock()
mock_media_service.get_media_file_by_id = MagicMock()
mock_media_service.get_pending_media_files = MagicMock()
mock_media_service.get_ready_media_files = MagicMock()
mock_media_service.process_media_pipeline = MagicMock()
mock_media_service.get_telemetry_data = MagicMock()
mock_media_service.clear_telemetry_data = MagicMock()
mock_transcription_service.transcribe_file = MagicMock()
mock_transcription_service.transcribe_audio = MagicMock()
mock_transcription_service.create_transcription_job = MagicMock()
mock_transcription_service.get_job_status = MagicMock()
mock_transcription_service.cancel_job = MagicMock()
services = {
"youtube_service": mock_youtube_service,
"media_service": mock_media_service,
"transcription_service": mock_transcription_service,
}
# Test validation
result = validate_service_container(services)
assert result is True
def test_validate_service_container_with_invalid_services(self):
"""Test service container validation with invalid services."""
# Create mock services that don't implement their protocols
mock_invalid_service = MagicMock()
# Missing required methods
services = {
"youtube_service": mock_invalid_service,
}
# Test validation
result = validate_service_container(services)
assert result is False
def test_get_service_dependencies(self):
"""Test getting service dependencies."""
# Test YouTube service dependencies
deps = get_service_dependencies("youtube_service")
assert "repository" in deps
assert deps["repository"] == "YouTubeRepositoryProtocol"
# Test media service dependencies
deps = get_service_dependencies("media_service")
assert "download_service" in deps
assert "preprocessing_service" in deps
assert "database_service" in deps
# Test unknown service
deps = get_service_dependencies("unknown_service")
assert deps == {}
def test_get_service_dependencies_all_services(self):
"""Test getting dependencies for all known services."""
services = [
"youtube_service",
"media_service",
"transcription_service",
"enhancement_service",
"export_service",
"batch_processor"
]
for service_name in services:
deps = get_service_dependencies(service_name)
assert isinstance(deps, dict)
# Each service should have at least some dependencies or config
assert len(deps) > 0
class TestFactoryIntegration:
"""Test integration between factory functions."""
def test_factory_functions_work_together(self):
"""Test that factory functions can work together."""
# Test that we can get dependencies for each service
service_names = ["youtube_service", "media_service", "transcription_service"]
for service_name in service_names:
deps = get_service_dependencies(service_name)
assert isinstance(deps, dict)
if __name__ == "__main__":
pytest.main([__file__])