This commit is contained in:
Gilles Soulier
2026-01-05 13:13:08 +01:00
parent 8e14adafc6
commit 1d177e96a6
149 changed files with 29541 additions and 1 deletions
+285
View File
@@ -0,0 +1,285 @@
#!/usr/bin/env python3
# Created by: Claude
# Date: 2026-01-02
# Purpose: Script de test rapide pour l'API Mesh
# Refs: server/CLAUDE.md
"""
Script de test pour vérifier le fonctionnement de base de l'API Mesh.
Usage:
python test_api.py
Le serveur doit être lancé avant d'exécuter ce script.
"""
import requests
import json
from typing import Optional
# Configuration
BASE_URL = "http://localhost:8000"
class Colors:
"""Codes ANSI pour les couleurs."""
GREEN = '\033[92m'
RED = '\033[91m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
END = '\033[0m'
def print_success(message: str):
"""Afficher un message de succès."""
print(f"{Colors.GREEN}{message}{Colors.END}")
def print_error(message: str):
"""Afficher un message d'erreur."""
print(f"{Colors.RED}{message}{Colors.END}")
def print_info(message: str):
"""Afficher un message d'information."""
print(f"{Colors.BLUE} {message}{Colors.END}")
def print_section(title: str):
"""Afficher un titre de section."""
print(f"\n{Colors.YELLOW}{'='*60}{Colors.END}")
print(f"{Colors.YELLOW}{title}{Colors.END}")
print(f"{Colors.YELLOW}{'='*60}{Colors.END}\n")
def test_health():
"""Tester le endpoint de santé."""
print_section("Test Health Check")
try:
response = requests.get(f"{BASE_URL}/health")
response.raise_for_status()
data = response.json()
if data.get("status") == "healthy":
print_success("Health check passed")
return True
else:
print_error(f"Health check failed: {data}")
return False
except Exception as e:
print_error(f"Health check error: {str(e)}")
return False
def test_register(username: str, password: str) -> Optional[str]:
"""Tester l'enregistrement d'un utilisateur."""
print_section(f"Test Register - {username}")
try:
response = requests.post(
f"{BASE_URL}/api/auth/register",
json={
"username": username,
"password": password,
"email": f"{username}@example.com"
}
)
if response.status_code == 201:
data = response.json()
print_success(f"User registered: {data['username']}")
print_info(f"User ID: {data['user_id']}")
print_info(f"Token: {data['access_token'][:20]}...")
return data['access_token']
elif response.status_code == 400:
print_info("User already exists (expected if running multiple times)")
# Essayer de se connecter à la place
return test_login(username, password)
else:
print_error(f"Registration failed: {response.status_code} - {response.text}")
return None
except Exception as e:
print_error(f"Registration error: {str(e)}")
return None
def test_login(username: str, password: str) -> Optional[str]:
"""Tester la connexion d'un utilisateur."""
print_section(f"Test Login - {username}")
try:
response = requests.post(
f"{BASE_URL}/api/auth/login",
json={
"username": username,
"password": password
}
)
response.raise_for_status()
data = response.json()
print_success(f"User logged in: {data['username']}")
print_info(f"Token: {data['access_token'][:20]}...")
return data['access_token']
except Exception as e:
print_error(f"Login error: {str(e)}")
return None
def test_get_me(token: str):
"""Tester la récupération des infos utilisateur."""
print_section("Test Get User Info")
try:
response = requests.get(
f"{BASE_URL}/api/auth/me",
headers={"Authorization": f"Bearer {token}"}
)
response.raise_for_status()
data = response.json()
print_success("User info retrieved")
print_info(f"Username: {data['username']}")
print_info(f"User ID: {data['user_id']}")
except Exception as e:
print_error(f"Get user info error: {str(e)}")
def test_create_room(token: str, room_name: str) -> Optional[str]:
"""Tester la création d'une room."""
print_section(f"Test Create Room - {room_name}")
try:
response = requests.post(
f"{BASE_URL}/api/rooms/",
json={"name": room_name},
headers={"Authorization": f"Bearer {token}"}
)
response.raise_for_status()
data = response.json()
print_success(f"Room created: {data['name']}")
print_info(f"Room ID: {data['room_id']}")
return data['room_id']
except Exception as e:
print_error(f"Create room error: {str(e)}")
return None
def test_list_rooms(token: str):
"""Tester la liste des rooms."""
print_section("Test List Rooms")
try:
response = requests.get(
f"{BASE_URL}/api/rooms/",
headers={"Authorization": f"Bearer {token}"}
)
response.raise_for_status()
data = response.json()
print_success(f"Found {len(data)} room(s)")
for room in data:
print_info(f" - {room['name']} ({room['room_id']})")
except Exception as e:
print_error(f"List rooms error: {str(e)}")
def test_get_room(token: str, room_id: str):
"""Tester la récupération d'une room."""
print_section("Test Get Room Details")
try:
response = requests.get(
f"{BASE_URL}/api/rooms/{room_id}",
headers={"Authorization": f"Bearer {token}"}
)
response.raise_for_status()
data = response.json()
print_success("Room details retrieved")
print_info(f"Name: {data['name']}")
print_info(f"Members: {data['member_count']}")
except Exception as e:
print_error(f"Get room error: {str(e)}")
def test_request_capability(token: str, room_id: str):
"""Tester la demande de capability token."""
print_section("Test Request Capability Token")
try:
response = requests.post(
f"{BASE_URL}/api/auth/capability",
json={
"room_id": room_id,
"capabilities": ["call", "share:file"]
},
headers={"Authorization": f"Bearer {token}"}
)
response.raise_for_status()
data = response.json()
print_success("Capability token obtained")
print_info(f"Token: {data['cap_token'][:20]}...")
print_info(f"Expires in: {data['expires_in']}s")
except Exception as e:
print_error(f"Request capability error: {str(e)}")
def main():
"""Fonction principale du test."""
print(f"{Colors.BLUE}")
print("╔════════════════════════════════════════════════════════════╗")
print("║ MESH SERVER API TEST SUITE ║")
print("╚════════════════════════════════════════════════════════════╝")
print(f"{Colors.END}")
# Test de santé
if not test_health():
print_error("\n❌ Le serveur ne répond pas. Assurez-vous qu'il est démarré.")
return
# Enregistrer deux utilisateurs
user1_token = test_register("alice", "password123")
user2_token = test_register("bob", "password456")
if not user1_token or not user2_token:
print_error("\n❌ Impossible de créer les utilisateurs de test")
return
# Tester les infos utilisateur
test_get_me(user1_token)
# Créer une room
room_id = test_create_room(user1_token, "Test Room")
if room_id:
# Lister les rooms
test_list_rooms(user1_token)
# Détails de la room
test_get_room(user1_token, room_id)
# Demander un capability token
test_request_capability(user1_token, room_id)
print(f"\n{Colors.GREEN}")
print("╔════════════════════════════════════════════════════════════╗")
print("║ ✓ TESTS TERMINÉS ║")
print("╚════════════════════════════════════════════════════════════╝")
print(f"{Colors.END}")
print_info("Pour tester le WebSocket, utilisez le client web ou un outil comme wscat")
print_info("Exemple: wscat -c 'ws://localhost:8000/ws?token=YOUR_TOKEN'")
if __name__ == "__main__":
main()