#!/usr/bin/env python3 """ Script de test pour l'API REST """ import requests import json import tempfile import numpy as np import soundfile as sf import time def test_api_health(base_url): """Test de l'endpoint health""" print("🔍 Test de l'endpoint health...") try: response = requests.get(f"{base_url}/api/health") if response.status_code == 200: data = response.json() print(f"✅ Health check rĂ©ussi: {data}") return True else: print(f"❌ Health check Ă©chouĂ©: {response.status_code}") return False except Exception as e: print(f"❌ Erreur health check: {e}") return False def test_api_info(base_url): """Test de l'endpoint racine""" print("🔍 Test de l'endpoint racine...") try: response = requests.get(f"{base_url}/api/") if response.status_code == 200: data = response.json() print(f"✅ Info API rĂ©cupĂ©rĂ©e: {data}") return True else: print(f"❌ Info API Ă©chouĂ©: {response.status_code}") return False except Exception as e: print(f"❌ Erreur info API: {e}") return False def create_test_audio(): """CrĂ©e un fichier audio de test""" print("đŸŽ” CrĂ©ation d'un fichier audio de test...") # CrĂ©er un signal audio simple (1 seconde) sample_rate = 16000 duration = 1.0 t = np.linspace(0, duration, int(sample_rate * duration)) # Signal avec parole simulĂ©e (frĂ©quences vocales) audio = 0.1 * np.sin(2 * np.pi * 440 * t) + 0.05 * np.sin(2 * np.pi * 880 * t) # Sauvegarder test_audio_path = "test_audio_api.wav" sf.write(test_audio_path, audio, sample_rate) print(f"✅ Fichier audio de test créé: {test_audio_path}") return test_audio_path def test_audio_prediction(base_url, audio_path): """Test de l'endpoint predict avec audio""" print("🔍 Test de l'endpoint predict (audio)...") try: with open(audio_path, 'rb') as f: files = {'file': f} response = requests.post(f"{base_url}/api/predict", files=files) if response.status_code == 200: data = response.json() print(f"✅ PrĂ©diction audio rĂ©ussie:") print(f" Transcription: {data.get('transcription', 'N/A')}") print(f" Sentiment: {data.get('sentiment', 'N/A')}") return True else: print(f"❌ PrĂ©diction audio Ă©chouĂ©e: {response.status_code}") print(f" Erreur: {response.text}") return False except Exception as e: print(f"❌ Erreur prĂ©diction audio: {e}") return False def test_text_prediction(base_url): """Test de l'endpoint predict_text""" print("🔍 Test de l'endpoint predict_text...") test_texts = [ "je suis trĂšs content de ce produit", "ce service est terrible", "c'est neutre comme commentaire" ] for text in test_texts: try: data = {"text": text} response = requests.post(f"{base_url}/api/predict_text", json=data) if response.status_code == 200: result = response.json() print(f"✅ PrĂ©diction textuelle rĂ©ussie pour '{text}':") print(f" Sentiment: {result.get('sentiment', 'N/A')}") else: print(f"❌ PrĂ©diction textuelle Ă©chouĂ©e pour '{text}': {response.status_code}") return False except Exception as e: print(f"❌ Erreur prĂ©diction textuelle: {e}") return False return True def test_error_handling(base_url): """Test de la gestion d'erreurs""" print("🔍 Test de la gestion d'erreurs...") # Test avec fichier invalide try: with tempfile.NamedTemporaryFile(suffix='.txt', delete=False) as f: f.write(b"Ceci n'est pas un fichier audio") f.flush() with open(f.name, 'rb') as audio_file: files = {'file': audio_file} response = requests.post(f"{base_url}/api/predict", files=files) if response.status_code == 400: print("✅ Gestion d'erreur fichier invalide: OK") else: print(f"❌ Gestion d'erreur fichier invalide: {response.status_code}") return False except Exception as e: print(f"❌ Erreur test fichier invalide: {e}") return False # Test avec texte vide try: data = {"text": ""} response = requests.post(f"{base_url}/api/predict_text", json=data) if response.status_code in [200, 400]: print("✅ Gestion d'erreur texte vide: OK") else: print(f"❌ Gestion d'erreur texte vide: {response.status_code}") return False except Exception as e: print(f"❌ Erreur test texte vide: {e}") return False return True def test_documentation(base_url): """Test de la documentation Swagger""" print("🔍 Test de la documentation Swagger...") try: response = requests.get(f"{base_url}/api/docs") if response.status_code == 200: print("✅ Documentation Swagger accessible") return True else: print(f"❌ Documentation Swagger inaccessible: {response.status_code}") return False except Exception as e: print(f"❌ Erreur documentation Swagger: {e}") return False def main(): """Fonction principale de test""" print("🚀 DĂ©marrage des tests de l'API...\n") # URL de base (Ă  adapter selon votre dĂ©ploiement) base_url = "http://localhost:7860" # Local # base_url = "https://huggingface.co/spaces//sentiment-audio-analyzer" # HF Spaces tests = [ ("Health check", lambda: test_api_health(base_url)), ("Info API", lambda: test_api_info(base_url)), ("Documentation Swagger", lambda: test_documentation(base_url)), ("Gestion d'erreurs", lambda: test_error_handling(base_url)), ] # Test avec audio (nĂ©cessite un fichier) audio_path = create_test_audio() tests.extend([ ("PrĂ©diction audio", lambda: test_audio_prediction(base_url, audio_path)), ("PrĂ©diction textuelle", lambda: test_text_prediction(base_url)), ]) results = [] for test_name, test_func in tests: print(f"\n{'='*50}") print(f"Test: {test_name}") print('='*50) try: result = test_func() results.append((test_name, result)) except Exception as e: print(f"❌ Erreur inattendue: {e}") results.append((test_name, False)) # RĂ©sumĂ© print(f"\n{'='*50}") print("📊 RÉSUMÉ DES TESTS API") print('='*50) passed = 0 total = len(results) for test_name, result in results: status = "✅ PASS" if result else "❌ FAIL" print(f"{test_name}: {status}") if result: passed += 1 print(f"\nRĂ©sultat: {passed}/{total} tests rĂ©ussis") if passed == total: print("🎉 Tous les tests API sont passĂ©s !") return True else: print("⚠ Certains tests API ont Ă©chouĂ©.") return False if __name__ == "__main__": success = main() exit(0 if success else 1)