Scrap-Dji / test_api.py
joel
Initial deployment: Scrap-Dji with API
dfdddb1
#!/usr/bin/env python3
"""
Script de test local pour l'application Hugging Face
Teste l'API et l'interface avant déploiement
"""
import asyncio
import httpx
import json
from pathlib import Path
# Configuration
API_BASE_URL = "http://localhost:7860"
TEST_DATA_FILE = Path("data/documents.json")
# Couleurs pour le terminal
class Colors:
GREEN = '\033[92m'
RED = '\033[91m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
END = '\033[0m'
def print_success(msg):
print(f"{Colors.GREEN}{msg}{Colors.END}")
def print_error(msg):
print(f"{Colors.RED}{msg}{Colors.END}")
def print_info(msg):
print(f"{Colors.BLUE}ℹ️ {msg}{Colors.END}")
def print_warning(msg):
print(f"{Colors.YELLOW}⚠️ {msg}{Colors.END}")
async def test_health():
"""Test du health check"""
print_info("Test du health check...")
try:
async with httpx.AsyncClient() as client:
response = await client.get(f"{API_BASE_URL}/api/health", timeout=5.0)
if response.status_code == 200:
data = response.json()
print_success(f"Health check OK - {data.get('documents_loaded', 0)} documents chargés")
return True
else:
print_error(f"Health check échoué - Status: {response.status_code}")
return False
except Exception as e:
print_error(f"Erreur health check: {e}")
return False
async def test_search_post():
"""Test de la recherche (POST)"""
print_info("Test de la recherche (POST)...")
try:
async with httpx.AsyncClient() as client:
payload = {
"query": "togo",
"limit": 5,
"fuzzy": True
}
response = await client.post(
f"{API_BASE_URL}/api/search",
json=payload,
timeout=10.0
)
if response.status_code == 200:
data = response.json()
print_success(f"Recherche OK - {data['total']} résultats en {data['execution_time_ms']}ms")
if data['results']:
print_info(f"Premier résultat: {data['results'][0].get('titre', 'N/A')[:50]}...")
return True
else:
print_error(f"Recherche échouée - Status: {response.status_code}")
return False
except Exception as e:
print_error(f"Erreur recherche POST: {e}")
return False
async def test_search_get():
"""Test de la recherche (GET)"""
print_info("Test de la recherche (GET)...")
try:
async with httpx.AsyncClient() as client:
response = await client.get(
f"{API_BASE_URL}/api/search?q=économie&pays=Togo&limit=5",
timeout=10.0
)
if response.status_code == 200:
data = response.json()
print_success(f"Recherche GET OK - {data['total']} résultats")
return True
else:
print_error(f"Recherche GET échouée - Status: {response.status_code}")
return False
except Exception as e:
print_error(f"Erreur recherche GET: {e}")
return False
async def test_fuzzy_search():
"""Test de la recherche fuzzy (avec fautes)"""
print_info("Test de la recherche fuzzy (tolérance aux fautes)...")
try:
async with httpx.AsyncClient() as client:
# Recherche avec faute de frappe volontaire
payload = {
"query": "economie", # Sans accent
"limit": 5,
"fuzzy": True
}
response = await client.post(
f"{API_BASE_URL}/api/search",
json=payload,
timeout=10.0
)
if response.status_code == 200:
data = response.json()
if data['total'] > 0:
print_success(f"Fuzzy search OK - {data['total']} résultats malgré la faute")
else:
print_warning("Fuzzy search OK mais aucun résultat (base vide?)")
return True
else:
print_error(f"Fuzzy search échouée - Status: {response.status_code}")
return False
except Exception as e:
print_error(f"Erreur fuzzy search: {e}")
return False
async def test_stats():
"""Test des statistiques"""
print_info("Test des statistiques...")
try:
async with httpx.AsyncClient() as client:
response = await client.get(f"{API_BASE_URL}/api/stats", timeout=5.0)
if response.status_code == 200:
data = response.json()
print_success(f"Stats OK - {data['total_documents']} documents")
if data['pays']:
print_info(f"Pays: {', '.join(data['pays'].keys())}")
return True
else:
print_error(f"Stats échouées - Status: {response.status_code}")
return False
except Exception as e:
print_error(f"Erreur stats: {e}")
return False
async def test_documents():
"""Test de la liste des documents"""
print_info("Test de la liste des documents...")
try:
async with httpx.AsyncClient() as client:
response = await client.get(
f"{API_BASE_URL}/api/documents?skip=0&limit=5",
timeout=5.0
)
if response.status_code == 200:
data = response.json()
print_success(f"Liste documents OK - {data['total']} total, {len(data['documents'])} retournés")
return True
else:
print_error(f"Liste documents échouée - Status: {response.status_code}")
return False
except Exception as e:
print_error(f"Erreur liste documents: {e}")
return False
def check_data_file():
"""Vérifie si le fichier de données existe"""
print_info("Vérification du fichier de données...")
if TEST_DATA_FILE.exists():
try:
with open(TEST_DATA_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
print_success(f"Fichier de données trouvé - {len(data)} documents")
return True
except Exception as e:
print_error(f"Erreur lecture fichier: {e}")
return False
else:
print_warning("Fichier de données non trouvé - La base sera vide")
print_info("Lancez 'python scrape_togo_massive.py' pour scraper des données")
return False
async def run_all_tests():
"""Lance tous les tests"""
print("\n" + "="*60)
print("🧪 TESTS DE L'APPLICATION SCRAP-DJI")
print("="*60 + "\n")
# Vérification préliminaire
check_data_file()
print()
# Tests API
tests = [
("Health Check", test_health),
("Recherche POST", test_search_post),
("Recherche GET", test_search_get),
("Recherche Fuzzy", test_fuzzy_search),
("Statistiques", test_stats),
("Liste Documents", test_documents),
]
results = []
for name, test_func in tests:
result = await test_func()
results.append((name, result))
print()
# Résumé
print("="*60)
print("📊 RÉSUMÉ DES TESTS")
print("="*60)
passed = sum(1 for _, result in results if result)
total = len(results)
for name, result in results:
status = "✅ PASS" if result else "❌ FAIL"
print(f"{status} - {name}")
print()
print(f"Résultat: {passed}/{total} tests réussis")
if passed == total:
print_success("Tous les tests sont passés ! 🎉")
print_info("L'application est prête pour le déploiement sur Hugging Face")
else:
print_warning(f"{total - passed} test(s) échoué(s)")
print_info("Vérifiez que l'application est bien lancée avec 'python app.py'")
print()
if __name__ == "__main__":
print_info("Assurez-vous que l'application est lancée avec 'python app.py'")
print_info("Attendez quelques secondes puis appuyez sur Entrée pour continuer...")
input()
asyncio.run(run_all_tests())