refactor: remove YouTube download feature, extract TrackInfo dataclass, clean up config and hotkeys
This commit is contained in:
+8
-44
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Basic tests for YouTube Music to iPod Nano Transfer Tool
|
||||
Basic tests for neo-pod-desktop
|
||||
"""
|
||||
|
||||
import os
|
||||
@@ -8,55 +8,22 @@ import sys
|
||||
import unittest
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
# Add src directory to path
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "src"))
|
||||
|
||||
from youtube_downloader import YouTubeDownloader, TrackInfo
|
||||
from audio_converter import AudioConverter
|
||||
from metadata_handler import MetadataHandler
|
||||
from ipod_device import IPodDevice
|
||||
|
||||
|
||||
class TestYouTubeDownloader(unittest.TestCase):
|
||||
"""Test YouTube downloader functionality"""
|
||||
|
||||
def test_parse_artist_title(self):
|
||||
"""Test parsing artist and title from video title"""
|
||||
downloader = YouTubeDownloader()
|
||||
|
||||
# Test case 1: Artist - Title
|
||||
artist, title = downloader._parse_artist_title("Rick Astley - Never Gonna Give You Up")
|
||||
self.assertEqual(artist, "Rick Astley")
|
||||
self.assertEqual(title, "Never Gonna Give You Up")
|
||||
|
||||
# Test case 2: Artist: Title
|
||||
artist, title = downloader._parse_artist_title("Rick Astley: Never Gonna Give You Up")
|
||||
self.assertEqual(artist, "Rick Astley")
|
||||
self.assertEqual(title, "Never Gonna Give You Up")
|
||||
|
||||
# Test case 3: Artist | Title
|
||||
artist, title = downloader._parse_artist_title("Rick Astley | Never Gonna Give You Up")
|
||||
self.assertEqual(artist, "Rick Astley")
|
||||
self.assertEqual(title, "Never Gonna Give You Up")
|
||||
|
||||
# Test case 4: No pattern match
|
||||
artist, title = downloader._parse_artist_title("Never Gonna Give You Up")
|
||||
self.assertEqual(artist, "")
|
||||
self.assertEqual(title, "Never Gonna Give You Up")
|
||||
|
||||
|
||||
class TestAudioConverter(unittest.TestCase):
|
||||
"""Test audio converter functionality"""
|
||||
|
||||
|
||||
def test_sanitize_filename(self):
|
||||
"""Test filename sanitization"""
|
||||
converter = AudioConverter()
|
||||
|
||||
# Test case 1: Invalid characters
|
||||
|
||||
sanitized = converter._sanitize_filename('File: with "invalid" chars?')
|
||||
self.assertEqual(sanitized, 'File_ with _invalid_ chars_')
|
||||
|
||||
# Test case 2: Long filename
|
||||
|
||||
long_name = "A" * 150
|
||||
sanitized = converter._sanitize_filename(long_name)
|
||||
self.assertEqual(len(sanitized), 100)
|
||||
@@ -65,26 +32,23 @@ class TestAudioConverter(unittest.TestCase):
|
||||
|
||||
class TestMetadataHandler(unittest.TestCase):
|
||||
"""Test metadata handler functionality"""
|
||||
|
||||
|
||||
@patch('requests.get')
|
||||
def test_download_thumbnail(self, mock_get):
|
||||
"""Test thumbnail download"""
|
||||
# Mock response
|
||||
mock_response = MagicMock()
|
||||
mock_response.raise_for_status.return_value = None
|
||||
mock_response.content = b'fake_image_data'
|
||||
mock_get.return_value = mock_response
|
||||
|
||||
# Mock PIL Image
|
||||
|
||||
with patch('PIL.Image.open') as mock_image_open:
|
||||
mock_image = MagicMock()
|
||||
mock_image.save.return_value = None
|
||||
mock_image_open.return_value = mock_image
|
||||
|
||||
|
||||
handler = MetadataHandler()
|
||||
result = handler.download_thumbnail("https://example.com/image.jpg")
|
||||
|
||||
# Check that the function returned a path
|
||||
|
||||
self.assertIsNotNone(result)
|
||||
mock_get.assert_called_once_with("https://example.com/image.jpg", timeout=10)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user