trax/tests/test_service_protocols.py

196 lines
7.5 KiB
Python

"""Unit tests for service protocol definitions."""
import pytest
from typing import Any, Dict, List, Optional, Protocol, runtime_checkable
from pathlib import Path
from uuid import UUID
from src.services.protocols import (
YouTubeServiceProtocol,
MediaServiceProtocol,
TranscriptionServiceProtocol,
EnhancementServiceProtocol,
ExportServiceProtocol,
BatchProcessorProtocol,
ProgressCallback,
)
class TestProtocolDefinitions:
"""Test that all service protocols are properly defined."""
def test_youtube_service_protocol_definition(self):
"""Test YouTubeServiceProtocol has required methods."""
# Verify protocol is runtime checkable
assert hasattr(YouTubeServiceProtocol, '__subclasshook__')
# Verify required methods exist
methods = ['extract_metadata', 'batch_extract']
for method in methods:
assert hasattr(YouTubeServiceProtocol, method)
def test_media_service_protocol_definition(self):
"""Test MediaServiceProtocol has required methods."""
assert hasattr(MediaServiceProtocol, '__subclasshook__')
methods = [
'download_media', 'preprocess_audio', 'validate_file_size',
'check_audio_quality', 'get_media_info', 'create_media_file_record',
'update_media_file_status', 'get_media_file_by_id',
'get_pending_media_files', 'get_ready_media_files',
'process_media_pipeline', 'get_telemetry_data', 'clear_telemetry_data'
]
for method in methods:
assert hasattr(MediaServiceProtocol, method)
def test_transcription_service_protocol_definition(self):
"""Test TranscriptionServiceProtocol has required methods."""
assert hasattr(TranscriptionServiceProtocol, '__subclasshook__')
methods = [
'transcribe_file', 'transcribe_audio', 'create_transcription_job',
'get_job_status', 'cancel_job'
]
for method in methods:
assert hasattr(TranscriptionServiceProtocol, method)
def test_enhancement_service_protocol_definition(self):
"""Test EnhancementServiceProtocol has required methods."""
assert hasattr(EnhancementServiceProtocol, '__subclasshook__')
methods = [
'initialize', 'enhance_transcript', 'enhance_transcript_batch',
'enhance_transcription_result'
]
for method in methods:
assert hasattr(EnhancementServiceProtocol, method)
def test_export_service_protocol_definition(self):
"""Test ExportServiceProtocol has required methods."""
assert hasattr(ExportServiceProtocol, '__subclasshook__')
methods = [
'export_transcript', 'export_batch', 'get_supported_formats'
]
for method in methods:
assert hasattr(ExportServiceProtocol, method)
def test_batch_processor_protocol_definition(self):
"""Test BatchProcessorProtocol has required methods."""
assert hasattr(BatchProcessorProtocol, '__subclasshook__')
methods = [
'add_task', 'process_tasks', 'get_progress', 'cancel_task',
'get_task_status', 'get_completed_tasks'
]
for method in methods:
assert hasattr(BatchProcessorProtocol, method)
def test_progress_callback_protocol_definition(self):
"""Test ProgressCallback protocol definition."""
assert hasattr(ProgressCallback, '__subclasshook__')
assert hasattr(ProgressCallback, '__call__')
class TestProtocolTypeHints:
"""Test that protocol methods have proper type hints."""
def test_youtube_service_method_signatures(self):
"""Test YouTubeServiceProtocol method signatures."""
# This test ensures the protocol methods have the expected signatures
# We can't easily test this at runtime, but we can verify the protocol exists
assert YouTubeServiceProtocol is not None
# Test that it's a Protocol
assert issubclass(YouTubeServiceProtocol, Protocol)
def test_media_service_method_signatures(self):
"""Test MediaServiceProtocol method signatures."""
assert MediaServiceProtocol is not None
assert issubclass(MediaServiceProtocol, Protocol)
def test_transcription_service_method_signatures(self):
"""Test TranscriptionServiceProtocol method signatures."""
assert TranscriptionServiceProtocol is not None
assert issubclass(TranscriptionServiceProtocol, Protocol)
def test_enhancement_service_method_signatures(self):
"""Test EnhancementServiceProtocol method signatures."""
assert EnhancementServiceProtocol is not None
assert issubclass(EnhancementServiceProtocol, Protocol)
def test_export_service_method_signatures(self):
"""Test ExportServiceProtocol method signatures."""
assert ExportServiceProtocol is not None
assert issubclass(ExportServiceProtocol, Protocol)
def test_batch_processor_method_signatures(self):
"""Test BatchProcessorProtocol method signatures."""
assert BatchProcessorProtocol is not None
assert issubclass(BatchProcessorProtocol, Protocol)
class TestProtocolCompatibility:
"""Test that existing services are compatible with protocols."""
def test_media_service_compatibility(self):
"""Test that existing MediaService implements MediaServiceProtocol."""
from src.services.media_service import MediaService
# This test will fail if MediaService doesn't implement all required methods
# We're testing the interface compatibility, not the actual implementation
assert MediaService is not None
def test_transcription_service_compatibility(self):
"""Test that existing TranscriptionService implements TranscriptionServiceProtocol."""
from src.services.transcription_service import TranscriptionService
assert TranscriptionService is not None
def test_youtube_service_compatibility(self):
"""Test that existing YouTubeMetadataService implements YouTubeServiceProtocol."""
from src.services.youtube_service import YouTubeMetadataService
assert YouTubeMetadataService is not None
def test_enhancement_service_compatibility(self):
"""Test that existing DeepSeekEnhancementService implements EnhancementServiceProtocol."""
from src.services.enhancement.service import DeepSeekEnhancementService
assert DeepSeekEnhancementService is not None
class TestProtocolImportability:
"""Test that all protocols can be imported correctly."""
def test_protocol_imports(self):
"""Test that all protocols can be imported from the protocols module."""
from src.services.protocols import (
YouTubeServiceProtocol,
MediaServiceProtocol,
TranscriptionServiceProtocol,
EnhancementServiceProtocol,
ExportServiceProtocol,
BatchProcessorProtocol,
ProgressCallback,
)
# Verify all protocols are imported
protocols = [
YouTubeServiceProtocol,
MediaServiceProtocol,
TranscriptionServiceProtocol,
EnhancementServiceProtocol,
ExportServiceProtocol,
BatchProcessorProtocol,
ProgressCallback,
]
for protocol in protocols:
assert protocol is not None
assert hasattr(protocol, '__subclasshook__')
if __name__ == "__main__":
pytest.main([__file__])