280 lines
13 KiB
Python
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__])
|