Spaces:
Running
Running
#!/usr/bin/env python3 | |
# filepath: test_crawlgpt_api.py | |
import requests | |
import time | |
import json | |
import random | |
import string | |
import argparse | |
import sys | |
from pprint import pprint | |
class CrawlGPTTester: | |
def __init__(self, base_url="http://127.0.0.1:5000"): | |
self.base_url = base_url | |
self.token = None | |
self.user_id = None | |
self.username = None | |
self.test_data = {} | |
def generate_random_string(self, length=8): | |
"""Generate a random string for test data""" | |
return ''.join(random.choices(string.ascii_lowercase + string.digits, k=length)) | |
def print_response(self, response, label): | |
"""Pretty print API responses""" | |
print(f"\n{'=' * 80}") | |
print(f"β {label} - Status Code: {response.status_code}") | |
print(f"{'=' * 80}") | |
try: | |
pprint(response.json()) | |
except: | |
print(response.text) | |
print(f"{'=' * 80}\n") | |
sys.stdout.flush() | |
def print_error(self, response, label): | |
"""Pretty print API error responses""" | |
print(f"\n{'=' * 80}") | |
print(f"β {label} - Status Code: {response.status_code}") | |
print(f"{'=' * 80}") | |
try: | |
pprint(response.json()) | |
except: | |
print(response.text) | |
print(f"{'=' * 80}\n") | |
sys.stdout.flush() | |
def test_welcome(self): | |
"""Test welcome endpoint""" | |
response = requests.get(f"{self.base_url}/") | |
if response.status_code == 200: | |
self.print_response(response, "Welcome Endpoint") | |
return True | |
else: | |
self.print_error(response, "Welcome Endpoint") | |
return False | |
def test_register(self): | |
"""Test user registration""" | |
self.username = f"testuser_{self.generate_random_string()}" | |
password = "Test123!" | |
email = f"{self.username}@test.com" | |
data = { | |
"username": self.username, | |
"password": password, | |
"email": email | |
} | |
response = requests.post(f"{self.base_url}/api/register", json=data) | |
if response.status_code == 200: | |
self.print_response(response, "User Registration") | |
self.test_data["registration"] = data | |
return True | |
else: | |
self.print_error(response, "User Registration") | |
return False | |
def test_login(self): | |
"""Test user login""" | |
if not self.username: | |
print("Error: No user registered to log in with") | |
return False | |
data = { | |
"username": self.username, | |
"password": self.test_data["registration"]["password"] | |
} | |
response = requests.post(f"{self.base_url}/api/login", json=data) | |
if response.status_code == 200: | |
self.print_response(response, "User Login") | |
response_data = response.json() | |
self.token = response_data.get("token") | |
self.user_id = response_data.get("user", {}).get("id") | |
if not self.token: | |
print("Error: No token received from login") | |
return False | |
return True | |
else: | |
self.print_error(response, "User Login") | |
return False | |
def test_process_url(self, url="https://www.teachermagazine.com/in_en/articles/research-news-disability-inclusion-in-classroom-assessments"): | |
"""Test URL processing""" | |
if not self.token: | |
print("Error: Not logged in") | |
return False | |
headers = {"Authorization": f"Bearer {self.token}"} | |
data = {"url": url} | |
print(f"Processing URL: {url}") | |
response = requests.post(f"{self.base_url}/api/process-url", headers=headers, json=data) | |
if response.status_code == 200: | |
self.print_response(response, "Process URL") | |
return True | |
else: | |
self.print_error(response, "Process URL") | |
return False | |
def test_chat(self, message="What is the main topic of this page?"): | |
"""Test chat endpoint""" | |
if not self.token: | |
print("Error: Not logged in") | |
return False | |
headers = {"Authorization": f"Bearer {self.token}"} | |
data = { | |
"message": message, | |
"temperature": 0.7, | |
"max_tokens": 1000, | |
"model_id": "llama-3.1-8b-instant", | |
"use_summary": False | |
} | |
print(f"Sending chat message: {message}") | |
response = requests.post(f"{self.base_url}/api/chat", headers=headers, json=data) | |
if response.status_code == 200: | |
self.print_response(response, "Chat") | |
return True | |
else: | |
self.print_error(response, "Chat") | |
return False | |
def test_get_history(self): | |
"""Test getting chat history""" | |
if not self.token: | |
print("Error: Not logged in") | |
return False | |
headers = {"Authorization": f"Bearer {self.token}"} | |
response = requests.get(f"{self.base_url}/api/chat/history", headers=headers) | |
if response.status_code == 200: | |
self.print_response(response, "Get History") | |
return True | |
else: | |
self.print_error(response, "Get History") | |
return False | |
def test_export_data(self): | |
"""Test data export""" | |
if not self.token: | |
print("Error: Not logged in") | |
return False | |
headers = {"Authorization": f"Bearer {self.token}"} | |
response = requests.get(f"{self.base_url}/api/export", headers=headers) | |
if response.status_code == 200: | |
self.print_response(response, "Export Data") | |
self.test_data["export"] = response.json().get("data") | |
return True | |
else: | |
self.print_error(response, "Export Data") | |
return False | |
def test_clear_history(self): | |
"""Test clearing chat history""" | |
if not self.token: | |
print("Error: Not logged in") | |
return False | |
headers = {"Authorization": f"Bearer {self.token}"} | |
response = requests.post(f"{self.base_url}/api/chat/clear", headers=headers) | |
if response.status_code == 200: | |
self.print_response(response, "Clear History") | |
return True | |
else: | |
self.print_error(response, "Clear History") | |
return False | |
def test_import_data(self): | |
"""Test data import""" | |
if not self.token or "export" not in self.test_data: | |
print("Error: No exported data to import") | |
return False | |
headers = {"Authorization": f"Bearer {self.token}"} | |
data = {"data": self.test_data["export"]} | |
response = requests.post(f"{self.base_url}/api/import", headers=headers, json=data) | |
if response.status_code == 200: | |
self.print_response(response, "Import Data") | |
return True | |
else: | |
self.print_error(response, "Import Data") | |
return False | |
def test_metrics(self): | |
"""Test getting metrics""" | |
if not self.token: | |
print("Error: Not logged in") | |
return False | |
headers = {"Authorization": f"Bearer {self.token}"} | |
response = requests.get(f"{self.base_url}/api/metrics", headers=headers) | |
if response.status_code == 200: | |
self.print_response(response, "Get Metrics") | |
return True | |
else: | |
self.print_error(response, "Get Metrics") | |
return False | |
def test_update_settings(self): | |
"""Test updating settings""" | |
if not self.token: | |
print("Error: Not logged in") | |
return False | |
headers = {"Authorization": f"Bearer {self.token}"} | |
data = {"use_summary": True} | |
response = requests.post(f"{self.base_url}/api/settings", headers=headers, json=data) | |
if response.status_code == 200: | |
self.print_response(response, "Update Settings") | |
return True | |
else: | |
self.print_error(response, "Update Settings") | |
return False | |
def test_clear_all(self): | |
"""Test clearing all data""" | |
if not self.token: | |
print("Error: Not logged in") | |
return False | |
headers = {"Authorization": f"Bearer {self.token}"} | |
response = requests.post(f"{self.base_url}/api/clear-all", headers=headers) | |
if response.status_code == 200: | |
self.print_response(response, "Clear All Data") | |
return True | |
else: | |
self.print_error(response, "Clear All Data") | |
return False | |
def test_error_cases(self): | |
"""Test various error cases""" | |
results = [] | |
# Test invalid URL | |
if not self.token: | |
print("Error: Not logged in") | |
return False | |
headers = {"Authorization": f"Bearer {self.token}"} | |
print("\nTesting error cases...") | |
# Invalid URL | |
data = {"url": "not-a-valid-url"} | |
response = requests.post(f"{self.base_url}/api/process-url", headers=headers, json=data) | |
self.print_response(response, "Invalid URL Test") | |
results.append(response.status_code == 400) | |
# Chat without processing URL | |
await_clear = requests.post(f"{self.base_url}/api/clear-all", headers=headers) | |
data = {"message": "This should fail"} | |
response = requests.post(f"{self.base_url}/api/chat", headers=headers, json=data) | |
self.print_response(response, "Chat Without URL Test") | |
results.append(response.status_code == 400) | |
# Invalid token | |
bad_headers = {"Authorization": "Bearer invalid-token"} | |
response = requests.get(f"{self.base_url}/api/chat/history", headers=bad_headers) | |
self.print_response(response, "Invalid Token Test") | |
results.append(response.status_code == 401) | |
return all(results) | |
def run_all_tests(self): | |
"""Run all tests in sequence""" | |
print("Starting CRAWLGPT API Tests...") | |
tests = [ | |
("Welcome Endpoint", self.test_welcome), | |
("User Registration", self.test_register), | |
("User Login", self.test_login), | |
("Process URL", self.test_process_url), | |
("Chat", self.test_chat), | |
("Get History", self.test_get_history), | |
("Export Data", self.test_export_data), | |
("Clear History", self.test_clear_history), | |
("Import Data", self.test_import_data), | |
("Get Metrics", self.test_metrics), | |
("Update Settings", self.test_update_settings), | |
("Error Cases", self.test_error_cases), | |
("Clear All Data", self.test_clear_all) | |
] | |
results = {} | |
for name, test_func in tests: | |
print(f"\n{'=' * 80}") | |
print(f"Running test: {name}") | |
print(f"{'=' * 80}") | |
try: | |
success = test_func() | |
results[name] = success | |
if not success: | |
print(f"β Test '{name}' failed.") | |
time.sleep(1) # Brief pause between tests | |
except Exception as e: | |
print(f"β Test '{name}' threw an exception: {str(e)}") | |
results[name] = False | |
time.sleep(1) # Brief pause between tests | |
# Print summary | |
print("\n" + "=" * 80) | |
print("TEST SUMMARY") | |
print("=" * 80) | |
for name, success in results.items(): | |
status = "β PASSED" if success else "β FAILED" | |
print(f"{status} - {name}") | |
print("=" * 80) | |
success_rate = sum(1 for success in results.values() if success) / len(results) * 100 | |
print(f"Overall success rate: {success_rate:.2f}%") | |
return all(results.values()) | |
if __name__ == "__main__": | |
parser = argparse.ArgumentParser(description="Test the CRAWLGPT API") | |
parser.add_argument("--url", default="http://127.0.0.1:5000", help="Base URL for the API") | |
args = parser.parse_args() | |
tester = CrawlGPTTester(base_url=args.url) | |
success = tester.run_all_tests() | |
sys.exit(0 if success else 1) |