#!/usr/bin/env python3 """ API Testing Script for HF Agents Course Scoring API Tests connectivity, endpoints, and response formats """ import requests import json import sys from datetime import datetime # API Configuration API_BASE_URL = "https://agents-course-unit4-scoring.hf.space" QUESTIONS_URL = f"{API_BASE_URL}/questions" SUBMIT_URL = f"{API_BASE_URL}/submit" def test_connectivity(): """Test basic API connectivity""" print("šŸ” Testing API Connectivity...") print(f"šŸ“ Base URL: {API_BASE_URL}") print("-" * 50) try: response = requests.get(API_BASE_URL, timeout=10) print(f"āœ… Base URL Status: {response.status_code}") print(f"šŸ“‹ Headers: {dict(response.headers)}") if response.text: print(f"šŸ“„ Response (first 200 chars): {response.text[:200]}") return True except requests.exceptions.RequestException as e: print(f"āŒ Base URL Error: {e}") return False def test_questions_endpoint(): """Test questions endpoint""" print("\nšŸ” Testing Questions Endpoint...") print(f"šŸ“ Questions URL: {QUESTIONS_URL}") print("-" * 50) try: response = requests.get(QUESTIONS_URL, timeout=15) print(f"āœ… Status Code: {response.status_code}") print(f"šŸ“‹ Headers: {dict(response.headers)}") if response.status_code == 200: try: data = response.json() print(f"šŸ“Š Response Type: {type(data)}") if isinstance(data, list): print(f"šŸ“ˆ Questions Count: {len(data)}") if data: print(f"šŸ“ Sample Question Keys: {list(data[0].keys()) if data else 'Empty'}") # Show first question safely if data: first_q = data[0] print(f"šŸ“‹ First Question ID: {first_q.get('task_id', 'N/A')}") question_text = first_q.get('question', '') print(f"šŸ“‹ First Question (50 chars): {question_text[:50]}...") else: print(f"šŸ“„ Response Content: {data}") return True, data except json.JSONDecodeError as e: print(f"āŒ JSON Decode Error: {e}") print(f"šŸ“„ Raw Response (first 500 chars): {response.text[:500]}") return False, None else: print(f"āŒ HTTP Error: {response.status_code}") print(f"šŸ“„ Error Response: {response.text[:500]}") return False, None except requests.exceptions.RequestException as e: print(f"āŒ Request Error: {e}") return False, None def test_submit_endpoint(): """Test submit endpoint with minimal payload""" print("\nšŸ” Testing Submit Endpoint...") print(f"šŸ“ Submit URL: {SUBMIT_URL}") print("-" * 50) # Create minimal test payload test_payload = { "username": "test_user", "agent_code": "https://github.com/test/repo", "answers": [ {"task_id": "test_task_001", "submitted_answer": "test_answer"} ] } try: # Note: This might fail with authentication or validation errors, but it tests connectivity response = requests.post(SUBMIT_URL, json=test_payload, timeout=30) print(f"šŸ“Š Status Code: {response.status_code}") print(f"šŸ“‹ Headers: {dict(response.headers)}") try: data = response.json() print(f"šŸ“„ Response: {json.dumps(data, indent=2)}") except: print(f"šŸ“„ Raw Response: {response.text[:500]}") return response.status_code, response.text except requests.exceptions.RequestException as e: print(f"āŒ Submit Error: {e}") return None, str(e) def check_huggingface_space(): """Check if the HuggingFace Space exists and is accessible""" print("\nšŸ” Checking HuggingFace Space...") hf_space_url = "https://huggingface.co/spaces/agents-course/unit4-scoring" print(f"šŸ“ HF Space URL: {hf_space_url}") print("-" * 50) try: response = requests.get(hf_space_url, timeout=10) print(f"šŸ“Š HF Space Status: {response.status_code}") if response.status_code == 200: if "Space" in response.text and "Gradio" in response.text: print("āœ… HuggingFace Space appears to be active") else: print("āš ļø HuggingFace Space exists but might not be a Gradio space") else: print(f"āŒ HuggingFace Space not accessible: {response.status_code}") except requests.exceptions.RequestException as e: print(f"āŒ HF Space Check Error: {e}") def main(): """Run all API tests""" print("šŸš€ API Testing Suite") print(f"ā° Started at: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print("=" * 60) # Test 1: Basic connectivity connectivity_ok = test_connectivity() # Test 2: Questions endpoint questions_ok, questions_data = test_questions_endpoint() # Test 3: Submit endpoint (will likely fail, but shows connectivity) submit_status, submit_response = test_submit_endpoint() # Test 4: Check HuggingFace Space check_huggingface_space() # Summary print("\n" + "=" * 60) print("šŸ“‹ SUMMARY") print("=" * 60) print(f"šŸ”— Base URL: {'āœ… OK' if connectivity_ok else 'āŒ FAILED'}") print(f"ā“ Questions: {'āœ… OK' if questions_ok else 'āŒ FAILED'}") if questions_ok and questions_data: print(f"šŸ“Š Available Questions: {len(questions_data) if isinstance(questions_data, list) else 'Unknown'}") print(f"šŸ“¤ Submit Endpoint: {'šŸ”— Reachable' if submit_status else 'āŒ FAILED'}") if not any([connectivity_ok, questions_ok]): print("\nāŒ API appears to be completely down or unreachable") print("šŸ’” Suggestions:") print(" - Check your internet connection") print(" - Try again later (server might be temporarily down)") print(" - Contact course administrators if issue persists") elif questions_ok: print("\nāœ… Questions endpoint is working - you can fetch questions") print("āŒ Submit endpoint issue might be temporary server problem") print(f"\nā° Completed at: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") if __name__ == "__main__": main()