File size: 4,136 Bytes
f1ba2d2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | """
Tests for YouTube handler functionality.
"""
import unittest
from unittest.mock import patch, MagicMock
import sys
import os
# Add src to path for imports
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
from src.utils.youtube_handler import YouTubeHandler
class TestYouTubeHandler(unittest.TestCase):
"""Test cases for YouTubeHandler class."""
def setUp(self):
"""Set up test fixtures."""
self.handler = YouTubeHandler()
def test_validate_youtube_url_valid(self):
"""Test URL validation with valid URLs."""
valid_urls = [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://youtu.be/dQw4w9WgXcQ",
"http://youtube.com/watch?v=dQw4w9WgXcQ",
"https://m.youtube.com/watch?v=dQw4w9WgXcQ"
]
for url in valid_urls:
with self.subTest(url=url):
self.assertTrue(self.handler.validate_youtube_url(url))
def test_validate_youtube_url_invalid(self):
"""Test URL validation with invalid URLs."""
invalid_urls = [
"https://www.google.com",
"not_a_url",
"https://vimeo.com/123456",
"",
None
]
for url in invalid_urls:
with self.subTest(url=url):
if url is not None:
self.assertFalse(self.handler.validate_youtube_url(url))
@patch('src.utils.youtube_handler.YouTube')
def test_extract_video_id_success(self, mock_youtube):
"""Test successful video ID extraction."""
mock_yt = MagicMock()
mock_yt.video_id = "dQw4w9WgXcQ"
mock_youtube.return_value = mock_yt
video_id = self.handler.extract_video_id("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
self.assertEqual(video_id, "dQw4w9WgXcQ")
@patch('src.utils.youtube_handler.YouTube')
def test_extract_video_id_failure(self, mock_youtube):
"""Test video ID extraction failure."""
mock_youtube.side_effect = Exception("Invalid URL")
video_id = self.handler.extract_video_id("invalid_url")
self.assertIsNone(video_id)
@patch('src.utils.youtube_handler.YouTube')
def test_get_video_metadata_success(self, mock_youtube):
"""Test successful video metadata retrieval."""
mock_yt = MagicMock()
mock_yt.title = "Test Video"
mock_yt.author = "Test Author"
mock_yt.length = 300
mock_yt.views = 1000
mock_yt.video_id = "dQw4w9WgXcQ"
mock_youtube.return_value = mock_yt
metadata = self.handler.get_video_metadata("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
self.assertEqual(metadata['title'], "Test Video")
self.assertEqual(metadata['author'], "Test Author")
self.assertEqual(metadata['length'], 300)
self.assertEqual(metadata['views'], 1000)
self.assertEqual(metadata['video_id'], "dQw4w9WgXcQ")
@patch('src.utils.youtube_handler.YouTube')
def test_get_video_metadata_failure(self, mock_youtube):
"""Test video metadata retrieval failure."""
mock_youtube.side_effect = Exception("Network error")
metadata = self.handler.get_video_metadata("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
self.assertEqual(metadata, {})
def test_save_transcript_to_file(self):
"""Test transcript file saving."""
test_text = "This is a test transcript."
test_file = "test_transcript.txt"
try:
result = self.handler.save_transcript_to_file(test_text, test_file)
self.assertTrue(result)
# Verify file was created and contains correct content
with open(test_file, 'r', encoding='utf-8') as f:
content = f.read()
self.assertEqual(content, test_text)
finally:
# Clean up
if os.path.exists(test_file):
os.remove(test_file)
if __name__ == '__main__':
unittest.main()
|