ModalTranscriberMCP / tests /test_01_podcast_download.py
richard-su's picture
Upload folder using huggingface_hub
76f9cd2 verified
raw
history blame
7.92 kB
"""
Test podcast download functionality
ๆต‹่ฏ•ๆ’ญๅฎขไธ‹่ฝฝๅŠŸ่ƒฝ
"""
import pytest
import asyncio
import os
from pathlib import Path
from typing import Dict, Any
from src.tools.download_tools import download_apple_podcast_tool, download_xyz_podcast_tool
from src.services.podcast_download_service import PodcastDownloadService
from src.interfaces.podcast_downloader import PodcastPlatform
class TestPodcastDownload:
"""Test podcast download integration"""
@pytest.mark.asyncio
async def test_apple_podcast_info_extraction(self, podcast_download_service: PodcastDownloadService):
"""Test Apple podcast information extraction"""
print("\n๐ŸŽ Testing Apple Podcast info extraction...")
# Use a known working Apple Podcast URL
test_url = "https://podcasts.apple.com/us/podcast/the-tim-ferriss-show/id863897795"
try:
# Test platform detection
can_handle = podcast_download_service.can_handle_url(test_url)
assert can_handle, "Should be able to handle Apple Podcast URL"
# Test podcast info extraction
podcast_info = await podcast_download_service.extract_podcast_info(test_url)
assert podcast_info is not None
assert podcast_info.platform == PodcastPlatform.APPLE
assert podcast_info.title is not None
assert len(podcast_info.title) > 0
print(f"โœ… Successfully extracted Apple Podcast info:")
print(f" Title: {podcast_info.title}")
print(f" Platform: {podcast_info.platform}")
print(f" Episode ID: {podcast_info.episode_id}")
except Exception as e:
print(f"โŒ Apple Podcast info extraction failed: {str(e)}")
pytest.skip(f"Apple Podcast info extraction failed: {str(e)}")
@pytest.mark.asyncio
async def test_xiaoyuzhou_podcast_info_extraction(self, podcast_download_service: PodcastDownloadService):
"""Test XiaoYuZhou podcast information extraction"""
print("\n๐ŸŽต Testing XiaoYuZhou Podcast info extraction...")
# Use a test XYZ URL pattern
test_url = "https://www.xiaoyuzhoufm.com/episode/example123"
try:
# Test platform detection
can_handle = podcast_download_service.can_handle_url(test_url)
assert can_handle, "Should be able to handle XiaoYuZhou Podcast URL"
# Test podcast info extraction (might fail due to network/content)
try:
podcast_info = await podcast_download_service.extract_podcast_info(test_url)
assert podcast_info is not None
assert podcast_info.platform == PodcastPlatform.XIAOYUZHOU
print(f"โœ… Successfully extracted XiaoYuZhou Podcast info:")
print(f" Title: {podcast_info.title}")
print(f" Platform: {podcast_info.platform}")
print(f" Episode ID: {podcast_info.episode_id}")
except Exception as e:
print(f"โš ๏ธ XiaoYuZhou info extraction failed (expected for test URL): {str(e)}")
except Exception as e:
print(f"โŒ XiaoYuZhou platform detection failed: {str(e)}")
@pytest.mark.asyncio
async def test_apple_podcast_download_simulation(self, temp_dir: str):
"""Test Apple podcast download simulation (without actual download)"""
print("\n๐ŸŽ Testing Apple Podcast download simulation...")
# Use a known Apple Podcast URL for testing the download flow
test_url = "https://podcasts.apple.com/us/podcast/the-tim-ferriss-show/id863897795"
try:
# Test the download tool interface
result = await download_apple_podcast_tool(test_url)
print(f"๐Ÿ“‹ Download tool result:")
print(f" Status: {result.get('status', 'unknown')}")
print(f" Original URL: {result.get('original_url', 'N/A')}")
if result.get("status") == "success":
print(f" Audio file path: {result.get('audio_file_path', 'N/A')}")
print("โœ… Apple Podcast download simulation successful")
else:
print(f" Error: {result.get('error_message', 'Unknown error')}")
print("โš ๏ธ Apple Podcast download simulation failed (might be network-related)")
except Exception as e:
print(f"โŒ Apple Podcast download test failed: {str(e)}")
pytest.skip(f"Apple Podcast download test failed: {str(e)}")
@pytest.mark.asyncio
async def test_xiaoyuzhou_podcast_download_simulation(self, temp_dir: str):
"""Test XiaoYuZhou podcast download simulation"""
print("\n๐ŸŽต Testing XiaoYuZhou Podcast download simulation...")
# Use a test XYZ URL
test_url = "https://www.xiaoyuzhoufm.com/episode/example123"
try:
# Test the download tool interface
result = await download_xyz_podcast_tool(test_url)
print(f"๐Ÿ“‹ Download tool result:")
print(f" Status: {result.get('status', 'unknown')}")
print(f" Original URL: {result.get('original_url', 'N/A')}")
if result.get("status") == "success":
print(f" Audio file path: {result.get('audio_file_path', 'N/A')}")
print("โœ… XiaoYuZhou Podcast download simulation successful")
else:
print(f" Error: {result.get('error_message', 'Unknown error')}")
print("โš ๏ธ XiaoYuZhou Podcast download simulation failed (expected for test URL)")
except Exception as e:
print(f"โŒ XiaoYuZhou Podcast download test failed: {str(e)}")
# This is expected for test URLs, so we don't fail the test
@pytest.mark.asyncio
async def test_supported_platforms(self, podcast_download_service: PodcastDownloadService):
"""Test supported platforms detection"""
print("\n๐ŸŒ Testing supported platforms...")
platforms = podcast_download_service.get_supported_platforms()
assert PodcastPlatform.APPLE in platforms
assert PodcastPlatform.XIAOYUZHOU in platforms
print(f"โœ… Supported platforms: {[p.value for p in platforms]}")
@pytest.mark.asyncio
async def test_url_validation(self, podcast_download_service: PodcastDownloadService):
"""Test URL validation"""
print("\n๐Ÿ”— Testing URL validation...")
test_cases = [
("https://podcasts.apple.com/us/podcast/test", True, "Apple Podcast URL"),
("https://www.xiaoyuzhoufm.com/episode/test", True, "XiaoYuZhou URL"),
("https://example.com/podcast", False, "Generic URL"),
("invalid-url", False, "Invalid URL"),
]
for url, expected, description in test_cases:
result = podcast_download_service.can_handle_url(url)
assert result == expected, f"URL validation failed for {description}: {url}"
print(f"โœ… {description}: {'โœ“' if result else 'โœ—'}")
def test_download_tools_initialization(self):
"""Test download tools initialization"""
print("\n๐Ÿ”ง Testing download tools initialization...")
# Test that the tools can be imported
assert download_apple_podcast_tool is not None
assert download_xyz_podcast_tool is not None
print("โœ… Download tools initialized successfully")
if __name__ == "__main__":
# Run tests with verbose output
pytest.main([__file__, "-v", "-s"])