93 lines
3.4 KiB
Python
93 lines
3.4 KiB
Python
"""Integration tests for YouTube service interactions."""
|
|
|
|
import pytest
|
|
from pathlib import Path
|
|
|
|
from src.services.mocks import create_mock_youtube_service
|
|
from src.services.protocols import YouTubeServiceProtocol
|
|
|
|
|
|
class TestYouTubeServiceIntegration:
|
|
"""Test YouTube service interactions and workflows."""
|
|
|
|
@pytest.fixture
|
|
def youtube_service(self):
|
|
"""Create mock YouTube service for testing."""
|
|
return create_mock_youtube_service()
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_metadata_extraction_workflow(self, youtube_service):
|
|
"""Test complete metadata extraction workflow."""
|
|
url = "https://youtube.com/watch?v=mock123"
|
|
metadata = await youtube_service.extract_metadata(url)
|
|
|
|
assert metadata["title"] == "Mock YouTube Video"
|
|
assert metadata["duration"] == 120
|
|
assert metadata["channel"] == "Mock Channel"
|
|
assert metadata["description"] == "Mock video description"
|
|
assert metadata["upload_date"] == "2024-01-01"
|
|
assert metadata["view_count"] == 1000
|
|
assert metadata["like_count"] == 100
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_batch_metadata_extraction(self, youtube_service):
|
|
"""Test batch metadata extraction with multiple URLs."""
|
|
urls = [
|
|
"https://youtube.com/watch?v=video1",
|
|
"https://youtube.com/watch?v=video2",
|
|
"https://youtube.com/watch?v=video3"
|
|
]
|
|
|
|
results = await youtube_service.batch_extract(urls)
|
|
assert len(results) == 3
|
|
|
|
for result in results:
|
|
assert "success" in result
|
|
assert "url" in result
|
|
if result["success"]:
|
|
assert "data" in result
|
|
assert result["data"]["title"] == "Mock YouTube Video"
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_error_handling_in_batch_extraction(self, youtube_service):
|
|
"""Test error handling in batch extraction workflows."""
|
|
urls = [
|
|
"https://youtube.com/watch?v=valid1",
|
|
"https://youtube.com/watch?v=invalid",
|
|
"https://youtube.com/watch?v=valid2"
|
|
]
|
|
|
|
results = await youtube_service.batch_extract(urls)
|
|
assert len(results) == 3
|
|
|
|
# Check that some succeeded and some failed
|
|
success_count = sum(1 for r in results if r["success"])
|
|
assert success_count > 0
|
|
assert success_count < len(results)
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_metadata_structure_consistency(self, youtube_service):
|
|
"""Test that metadata structure is consistent across extractions."""
|
|
urls = [
|
|
"https://youtube.com/watch?v=test1",
|
|
"https://youtube.com/watch?v=test2"
|
|
]
|
|
|
|
for url in urls:
|
|
metadata = await youtube_service.extract_metadata(url)
|
|
required_fields = ["title", "duration", "channel", "description", "upload_date"]
|
|
for field in required_fields:
|
|
assert field in metadata
|
|
assert metadata[field] is not None
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_service_protocol_compliance(self, youtube_service):
|
|
"""Test that YouTube service properly implements its protocol."""
|
|
from src.services.protocols import validate_protocol_implementation, YouTubeServiceProtocol
|
|
|
|
assert validate_protocol_implementation(youtube_service, YouTubeServiceProtocol)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pytest.main([__file__])
|