Todo_App / tests /test_endpoints_detailed.py
Abdullahcoder54's picture
Push the app
697c967
"""
Detailed API Endpoint Verification Script
This script tests each API endpoint individually to verify functionality.
"""
import requests
import json
from datetime import datetime
# Base URL for the backend API
BASE_URL = "http://localhost:8000"
def test_endpoint(endpoint, method="GET", data=None, headers=None, expected_status=200, description=""):
"""Test a specific endpoint"""
print(f"Testing {description} - {method} {endpoint}")
try:
url = f"{BASE_URL}{endpoint}"
response = requests.request(method, url, json=data, headers=headers)
print(f" Status: {response.status_code} (Expected: {expected_status})")
if response.status_code == expected_status:
print(f" Result: PASS")
if response.content: # Check if there's response content
try:
print(f" Response: {response.json()}")
except:
print(f" Response: {response.text[:100]}...") # First 100 chars
return True
else:
print(f" Result: FAIL - {response.text}")
return False
except Exception as e:
print(f" Result: FAIL - Error: {e}")
return False
def test_all_endpoints():
"""Test all API endpoints"""
print("=" * 70)
print("Detailed API Endpoint Verification")
print("=" * 70)
results = {}
# Test 1: Health check endpoint
results['health'] = test_endpoint("/", "GET", expected_status=200,
description="Health Check")
# Test 2: Documentation endpoint
results['docs'] = test_endpoint("/docs", "GET", expected_status=200,
description="API Documentation")
# Test 3: Register a user first for authentication tests
print("\n--- Setting up user for authentication tests ---")
timestamp = str(int(datetime.now().timestamp()))
user_data = {
"email": f"testuser_{timestamp}@example.com",
"password": "securepassword123",
"name": f"Test User {timestamp}"
}
register_response = requests.post(f"{BASE_URL}/api/auth/register",
json=user_data,
headers={"Content-Type": "application/json"})
if register_response.status_code == 201:
register_result = register_response.json()
token = register_result['token']
user_id = register_result['user']['id']
print(f"User registered successfully. Token: {token[:20]}..., User ID: {user_id}")
else:
print(f"Failed to register user: {register_response.status_code} - {register_response.text}")
token = None
user_id = None
# Test 4: Authentication endpoints
if token:
auth_headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
# Test login with the same credentials
login_data = {"email": user_data["email"], "password": user_data["password"]}
results['auth_login'] = test_endpoint("/api/auth/login", "POST",
data=login_data, expected_status=200,
description="User Login")
# Test logout
results['auth_logout'] = test_endpoint("/api/auth/logout", "POST",
headers={"Authorization": f"Bearer {token}"},
expected_status=200,
description="User Logout")
# Test 5: Task endpoints (need to register another user and get a fresh token)
print("\n--- Setting up user for task tests ---")
timestamp2 = str(int(datetime.now().timestamp()))
task_user_data = {
"email": f"taskuser_{timestamp2}@example.com",
"password": "securepassword123",
"name": f"Task User {timestamp2}"
}
task_register_response = requests.post(f"{BASE_URL}/api/auth/register",
json=task_user_data,
headers={"Content-Type": "application/json"})
if task_register_response.status_code == 201:
task_user_result = task_register_response.json()
task_token = task_user_result['token']
task_user_id = task_user_result['user']['id']
task_headers = {"Authorization": f"Bearer {task_token}", "Content-Type": "application/json"}
print(f"Task user registered. Token: {task_token[:20]}..., User ID: {task_user_id}")
else:
print(f"Failed to register task user: {task_register_response.status_code}")
task_token = None
task_user_id = None
task_headers = None
# Test 6: Task CRUD operations
if task_token and task_user_id and task_headers:
# Create a task
task_data = {
"title": "Test Task for Endpoint Verification",
"description": "This is a test task for endpoint verification",
"completed": False
}
# Create task
create_task_response = requests.post(f"{BASE_URL}/api/{task_user_id}/tasks",
json=task_data, headers=task_headers)
if create_task_response.status_code == 201:
created_task = create_task_response.json()
task_id = created_task['id']
print(f"Task created with ID: {task_id}")
# Test get all tasks
results['get_all_tasks'] = test_endpoint(f"/api/{task_user_id}/tasks", "GET",
headers=task_headers, expected_status=200,
description="Get All Tasks")
# Test get specific task
results['get_task'] = test_endpoint(f"/api/{task_user_id}/tasks/{task_id}", "GET",
headers=task_headers, expected_status=200,
description="Get Specific Task")
# Test update task
update_data = {
"title": "Updated Test Task",
"description": "This is an updated test task",
"completed": True
}
results['update_task'] = test_endpoint(f"/api/{task_user_id}/tasks/{task_id}", "PUT",
data=update_data, headers=task_headers, expected_status=200,
description="Update Task")
# Test update task completion
completion_data = {"completed": False}
results['update_completion'] = test_endpoint(f"/api/{task_user_id}/tasks/{task_id}/complete", "PATCH",
data=completion_data, headers=task_headers, expected_status=200,
description="Update Task Completion")
# Test delete task
results['delete_task'] = test_endpoint(f"/api/{task_user_id}/tasks/{task_id}", "DELETE",
headers=task_headers, expected_status=204,
description="Delete Task")
else:
print(f"Failed to create task: {create_task_response.status_code} - {create_task_response.text}")
# Mark all task tests as failed
results['get_all_tasks'] = False
results['get_task'] = False
results['update_task'] = False
results['update_completion'] = False
results['delete_task'] = False
else:
print("Skipping task tests - no valid user/token")
# Mark all task tests as failed
results['get_all_tasks'] = False
results['get_task'] = False
results['update_task'] = False
results['update_completion'] = False
results['delete_task'] = False
# Test 7: Test protected endpoint without authentication (should fail)
results['unauthorized_access'] = test_endpoint(f"/api/{task_user_id if task_user_id else 1}/tasks", "GET",
expected_status=401, # Should be 401 Unauthorized
description="Unauthorized Access (should fail)")
# Test 8: Test with invalid token (should fail)
invalid_headers = {"Authorization": "Bearer invalid_token_here", "Content-Type": "application/json"}
results['invalid_token'] = test_endpoint(f"/api/{task_user_id if task_user_id else 1}/tasks", "GET",
headers=invalid_headers, expected_status=401,
description="Invalid Token (should fail)")
print("\n" + "=" * 70)
print("Endpoint Verification Results:")
print("=" * 70)
all_passed = True
for endpoint, result in results.items():
status = "PASS" if result else "FAIL"
print(f"{endpoint:25}: {status}")
if not result:
all_passed = False
print("=" * 70)
print(f"Overall Result: {'ALL ENDPOINTS WORKING' if all_passed else 'SOME ENDPOINTS FAILED'}")
print("=" * 70)
return all_passed
if __name__ == "__main__":
test_all_endpoints()