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()