#!/usr/bin/env python3 """ Manual test script for YouTube TUI Tests all required functionality """ import subprocess import sys def print_section(title): """Print a section header""" print(f"\n{'=' * 60}") print(f" {title}") print("=" * 60) def print_test(name, result, details=""): """Print test result""" status = "✓ PASS" if result else "✗ FAIL" print(f"{status}: {name}") if details: print(f" {details}") def test_dependencies(): """Test that all required dependencies are installed""" print_section("1. Dependency Check") dependencies = [ ("textual", "textual>=8.0"), ("yt_dlp", "yt-dlp"), ("rich", "rich"), ("requests", "requests"), ] results = [] for package, version_spec in dependencies: try: result = subprocess.run( [ sys.executable, "-c", f"import {package}; print(getattr({package}, '__version__', 'unknown'))", ], capture_output=True, text=True, timeout=5, ) if result.returncode == 0: version = result.stdout.strip() print_test( package.replace("_", "-"), True, f"Version {version}" ) results.append((package.replace("_", "-"), True)) else: print_test( package.replace("_", "-"), False, "Could not get version" ) results.append((package.replace("_", "-"), False)) except Exception as e: print_test(package.replace("_", "-"), False, str(e)) results.append((package.replace("_", "-"), False)) return all(r[1] for r in results) def test_startup(): """Test basic startup of the application""" print_section("2. Basic Startup Test") # Test import try: result = subprocess.run( [ sys.executable, "-c", "from youtube_tui.app import YouTubeTUI; print('OK')", ], capture_output=True, text=True, timeout=10, ) import_ok = result.returncode == 0 and result.stdout.strip() == "OK" print_test("Import successful", import_ok) if not import_ok: print(f" Error: {result.stderr}") return import_ok except Exception as e: print_test("Import successful", False, str(e)) return False def test_app_creation(): """Test that the app can be instantiated""" print_section("3. App Creation Test") try: result = subprocess.run( [ sys.executable, "-c", """ from youtube_tui.app import YouTubeTUI app = YouTubeTUI() print(f"Version: {app.VERSION}") print(f"yt-dlp: {app.yt_dlp_version}") print(f"Search history: {len(app.search_history)} items") print("OK") """, ], capture_output=True, text=True, timeout=10, ) if result.returncode == 0: lines = result.stdout.strip().split("\n") for line in lines: if ( line.startswith("Version:") or line.startswith("yt-dlp:") or line.startswith("Search history:") ): print(f" {line}") print_test("App creation successful", True) return True else: print_test("App creation successful", False, result.stderr) return False except Exception as e: print_test("App creation successful", False, str(e)) return False def test_unit_tests(): """Run the built-in unit tests""" print_section("4. Unit Tests") try: result = subprocess.run( [sys.executable, "youtube_tui/test_tui.py"], capture_output=True, text=True, timeout=30, cwd="/Users/user/Projects/youtube-cli", ) print(result.stdout) if result.stderr: print("STDERR:", result.stderr) # Parse test results if "Total:" in result.stdout: total_line = [ line for line in result.stdout.split("\n") if "Total:" in line ][0] print(f" {total_line}") passed = "✓ PASS" in result.stdout print_test("Unit tests", passed) return passed else: print_test("Unit tests", False, "Could not parse test results") return False except Exception as e: print_test("Unit tests", False, str(e)) return False def test_keyboard_shortcuts(): """Test keyboard shortcut handling""" print_section("5. Keyboard Shortcuts") try: result = subprocess.run( [ sys.executable, "-c", """ from youtube_tui.app import YouTubeTUI app = YouTubeTUI() # Test that shortcuts are registered shortcuts = [ ('escape', 'quit'), ('ctrl+f', 'search'), ('ctrl+r', 'refresh'), ('ctrl+p', 'command_palette'), ('ctrl+h', 'help'), ('ctrl+t', 'toggle_theme'), ] print("Keyboard shortcuts registered:") for key, action in shortcuts: print(f" {key}: {action}") print("OK") """, ], capture_output=True, text=True, timeout=10, ) if result.returncode == 0: print(result.stdout) print_test("Keyboard shortcuts", True) return True else: print_test("Keyboard shortcuts", False, result.stderr) return False except Exception as e: print_test("Keyboard shortcuts", False, str(e)) return False def test_video_model(): """Test Video model functionality""" print_section("6. Video Model Test") try: result = subprocess.run( [ sys.executable, "-c", """ from youtube_tui.models.video import Video # Test basic video creation video = Video( video_id="dQw4w9WgXcQ", title="Test Video", channel="Test Channel", channel_id="UC123", duration="3:45", view_count="1000000", upload_date="20230101", description="Test description", ) print(f"Video ID: {video.video_id}") print(f"Title: {video.title}") print(f"Display Title: {video.display_title}") print(f"URL: {video.url}") print(f"Is Short: {video.is_short}") print(f"Duration: {video.duration}") print(f"View Count: {video.view_count}") # Test from_dict video2 = Video.from_dict({ "video_id": "abc123", "title": "Another Video", "channel": "Another Channel", "channel_id": "UC456", "duration": "5:30", "view_count": "500000", "upload_date": "20230201", "description": "Another description", }) print(f"from_dict() works: {video2.title}") # Test to_dict video_dict = video.to_dict() print(f"to_dict() keys: {list(video_dict.keys())}") print("OK") """, ], capture_output=True, text=True, timeout=10, ) if result.returncode == 0: print(result.stdout) print_test("Video model", True) return True else: print_test("Video model", False, result.stderr) return False except Exception as e: print_test("Video model", False, str(e)) return False def test_search_history(): """Test search history functionality""" print_section("7. Search History Test") try: result = subprocess.run( [ sys.executable, "-c", """ from youtube_tui.app import YouTubeTUI app = YouTubeTUI() # Test adding to history app.add_to_search_history("test search 1") app.add_to_search_history("test search 2") app.add_to_search_history("test search 1") # Duplicate history = app.search_history print(f"History items: {len(history)}") print(f"History: {history}") # Test that duplicates are removed if len(history) == 2: print("Duplicate removal: OK") else: print(f"Duplicate removal: FAIL (expected 2, got {len(history)})") print("OK") """, ], capture_output=True, text=True, timeout=10, ) if result.returncode == 0: print(result.stdout) print_test("Search history", True) return True else: print_test("Search history", False, result.stderr) return False except Exception as e: print_test("Search history", False, str(e)) return False def test_services(): """Test service layer components""" print_section("8. Services Test") try: result = subprocess.run( [ sys.executable, "-c", """ from youtube_tui.services.youtube import YouTubeService # Test YouTube service yt_service = YouTubeService() print(f"YouTube service created: {yt_service is not None}") print(f"YouTube service: OK") print("OK") """, ], capture_output=True, text=True, timeout=10, ) if result.returncode == 0: print(result.stdout) print_test("Services", True) return True else: print_test("Services", False, result.stderr) return False except Exception as e: print_test("Services", False, str(e)) return False def test_screens(): """Test screen components""" print_section("9. Screens Test") try: result = subprocess.run( [ sys.executable, "-c", """ import os os.environ['TERM'] = 'dumb' from youtube_tui.screens.search import SearchScreen from youtube_tui.screens.results import ResultsScreen from youtube_tui.screens.download import DownloadScreen from youtube_tui.screens.help import HelpScreen from youtube_tui.screens.modal import CategorySelectionModal screens = [ ('SearchScreen', SearchScreen), ('ResultsScreen', ResultsScreen), ('DownloadScreen', DownloadScreen), ('HelpScreen', HelpScreen), ('CategorySelectionModal', CategorySelectionModal), ] print("Screens:") for name, screen_class in screens: try: instance = screen_class() print(f" {name}: OK") except Exception as e: print(f" {name}: FAIL - {e}") print("OK") """, ], capture_output=True, text=True, timeout=10, ) if result.returncode == 0: print(result.stdout) print_test("Screens", True) return True else: print_test("Screens", False, result.stderr) return False except Exception as e: print_test("Screens", False, str(e)) return False def main(): """Run all tests""" print("=" * 60) print(" YouTube TUI Manual Test Suite") print("=" * 60) print(f"\nPython: {sys.version}") print("Working directory: /Users/user/Projects/youtube-cli") results = [] # Run tests results.append(("Dependencies", test_dependencies())) results.append(("Startup", test_startup())) results.append(("App Creation", test_app_creation())) results.append(("Unit Tests", test_unit_tests())) results.append(("Keyboard Shortcuts", test_keyboard_shortcuts())) results.append(("Video Model", test_video_model())) results.append(("Search History", test_search_history())) results.append(("Services", test_services())) results.append(("Screens", test_screens())) # Summary print_section("Test Summary") passed = sum(1 for _, r in results if r) total = len(results) for name, result in results: status = "✓ PASS" if result else "✗ FAIL" print(f"{status}: {name}") print(f"\nTotal: {passed}/{total} tests passed") if passed == total: print("\n✓ All tests passed!") return 0 else: print(f"\n✗ {total - passed} test(s) failed") return 1 if __name__ == "__main__": sys.exit(main())