Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| """ | |
| Python test script for Hugging Face Space deployment | |
| Usage: python test_deployment.py [space-url] | |
| """ | |
| import sys | |
| import requests | |
| import json | |
| from typing import Dict, Any | |
| # ANSI color codes | |
| GREEN = '\033[0;32m' | |
| RED = '\033[0;31m' | |
| YELLOW = '\033[1;33m' | |
| BLUE = '\033[0;34m' | |
| NC = '\033[0m' # No Color | |
| def print_test(test_name: str): | |
| """Print test header""" | |
| print(f"\n{YELLOW}{test_name}{NC}") | |
| def print_result(passed: bool, message: str, response: Any = None): | |
| """Print test result""" | |
| status = f"{GREEN}✓ PASSED{NC}" if passed else f"{RED}✗ FAILED{NC}" | |
| print(f"{status} - {message}") | |
| if response: | |
| try: | |
| print(f"Response: {json.dumps(response, indent=2)}") | |
| except: | |
| print(f"Response: {response}") | |
| def test_health(base_url: str) -> bool: | |
| """Test health endpoint""" | |
| print_test("Test 1: Health Check") | |
| print(f"GET {base_url}/health") | |
| try: | |
| response = requests.get(f"{base_url}/health", timeout=10) | |
| passed = response.status_code == 200 | |
| print_result( | |
| passed, | |
| f"Status: {response.status_code}", | |
| response.json() if passed else response.text | |
| ) | |
| return passed | |
| except Exception as e: | |
| print_result(False, f"Error: {str(e)}") | |
| return False | |
| def test_service_info(base_url: str) -> bool: | |
| """Test root endpoint""" | |
| print_test("Test 2: Service Info") | |
| print(f"GET {base_url}/") | |
| try: | |
| response = requests.get(f"{base_url}/", timeout=10) | |
| passed = response.status_code == 200 | |
| print_result( | |
| passed, | |
| f"Status: {response.status_code}", | |
| response.json() if passed else response.text | |
| ) | |
| return passed | |
| except Exception as e: | |
| print_result(False, f"Error: {str(e)}") | |
| return False | |
| def test_list_tools(base_url: str) -> bool: | |
| """Test tools listing endpoint""" | |
| print_test("Test 3: List Available Tools") | |
| print(f"GET {base_url}/tools") | |
| try: | |
| response = requests.get(f"{base_url}/tools", timeout=10) | |
| passed = response.status_code == 200 | |
| print_result( | |
| passed, | |
| f"Status: {response.status_code}", | |
| response.json() if passed else response.text | |
| ) | |
| return passed | |
| except Exception as e: | |
| print_result(False, f"Error: {str(e)}") | |
| return False | |
| def test_youtube_search(base_url: str) -> bool: | |
| """Test YouTube search endpoint""" | |
| print_test("Test 4: YouTube Video Search") | |
| print(f"POST {base_url}/search") | |
| payload = { | |
| "query": "Python programming", | |
| "max_results": 2 | |
| } | |
| try: | |
| response = requests.post( | |
| f"{base_url}/search", | |
| json=payload, | |
| timeout=15 | |
| ) | |
| if response.status_code == 200: | |
| print_result(True, f"Status: {response.status_code}", response.json()) | |
| return True | |
| elif response.status_code == 500 and "YOUTUBE_API_KEY" in response.text: | |
| print(f"{YELLOW}⚠ API KEY NOT SET{NC} - Status: {response.status_code}") | |
| print("Please set YOUTUBE_API_KEY in your Space settings") | |
| print(f"Response: {response.json()}") | |
| return False | |
| else: | |
| print_result(False, f"Status: {response.status_code}", response.text) | |
| return False | |
| except Exception as e: | |
| print_result(False, f"Error: {str(e)}") | |
| return False | |
| def test_error_handling(base_url: str) -> bool: | |
| """Test error handling with missing query""" | |
| print_test("Test 5: Error Handling (Missing Query)") | |
| print(f"POST {base_url}/search (with empty query)") | |
| payload = {} | |
| try: | |
| response = requests.post( | |
| f"{base_url}/search", | |
| json=payload, | |
| timeout=10 | |
| ) | |
| # We expect a 400 error | |
| passed = response.status_code == 400 | |
| print_result( | |
| passed, | |
| f"Status: {response.status_code} (Expected 400 error)", | |
| response.json() if response.status_code == 400 else response.text | |
| ) | |
| return passed | |
| except Exception as e: | |
| print_result(False, f"Error: {str(e)}") | |
| return False | |
| def main(): | |
| """Run all tests""" | |
| # Get Space URL from command line or use default | |
| base_url = sys.argv[1] if len(sys.argv) > 1 else "https://ocx2025-basicsearch.hf.space" | |
| # Remove trailing slash if present | |
| base_url = base_url.rstrip('/') | |
| print("=" * 50) | |
| print(f"Testing Hugging Face Space: {base_url}") | |
| print("=" * 50) | |
| # Run all tests | |
| results = [] | |
| results.append(("Health Check", test_health(base_url))) | |
| results.append(("Service Info", test_service_info(base_url))) | |
| results.append(("List Tools", test_list_tools(base_url))) | |
| results.append(("YouTube Search", test_youtube_search(base_url))) | |
| results.append(("Error Handling", test_error_handling(base_url))) | |
| # Print summary | |
| print("\n" + "=" * 50) | |
| print("Test Summary") | |
| print("=" * 50) | |
| passed = sum(1 for _, result in results if result) | |
| total = len(results) | |
| for test_name, result in results: | |
| status = f"{GREEN}✓{NC}" if result else f"{RED}✗{NC}" | |
| print(f"{status} {test_name}") | |
| print(f"\n{BLUE}Results: {passed}/{total} tests passed{NC}") | |
| print("=" * 50) | |
| # Exit with appropriate code | |
| sys.exit(0 if passed == total else 1) | |
| if __name__ == "__main__": | |
| main() | |