| """ |
| Tests for YouTube handler functionality. |
| """ |
|
|
| import unittest |
| from unittest.mock import patch, MagicMock |
| import sys |
| import os |
|
|
| |
| 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) |
| |
| |
| with open(test_file, 'r', encoding='utf-8') as f: |
| content = f.read() |
| self.assertEqual(content, test_text) |
| |
| finally: |
| |
| if os.path.exists(test_file): |
| os.remove(test_file) |
|
|
| if __name__ == '__main__': |
| unittest.main() |
|
|