Add connectivity error simulation tests for TP4 validation
This commit is contained in:
@@ -0,0 +1,73 @@
|
|||||||
|
name: 🔍 Tests de Connectivité - Simulation d'Erreurs
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
workflow_dispatch: # Permet de déclencher manuellement
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
connectivity-test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: 📥 Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: 🐳 Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: 🚀 Start services (DB + Backend)
|
||||||
|
run: |
|
||||||
|
echo "Démarrage des services..."
|
||||||
|
docker compose up -d db backend
|
||||||
|
sleep 15
|
||||||
|
|
||||||
|
- name: 🔍 Test 1: Backend accessible
|
||||||
|
run: |
|
||||||
|
echo "Test de connectivité au backend..."
|
||||||
|
docker compose run --rm test python -c "
|
||||||
|
import requests
|
||||||
|
try:
|
||||||
|
response = requests.get('http://backend:8000/health', timeout=5)
|
||||||
|
print('✅ Backend accessible - Status:', response.status_code)
|
||||||
|
except Exception as e:
|
||||||
|
print('❌ Backend inaccessible:', e)
|
||||||
|
exit(1)
|
||||||
|
"
|
||||||
|
|
||||||
|
- name: ❌ Test 2: Simulation d'erreur (doit échouer)
|
||||||
|
run: |
|
||||||
|
echo "Simulation d'erreur de connectivité..."
|
||||||
|
docker compose run --rm test python -c "
|
||||||
|
import requests
|
||||||
|
print('🔍 Test de connectivité à un port inexistant...')
|
||||||
|
try:
|
||||||
|
response = requests.get('http://backend:9999/health', timeout=2)
|
||||||
|
print('❌ Connexion inattendue - ce test devrait échouer')
|
||||||
|
exit(1)
|
||||||
|
except Exception as e:
|
||||||
|
print('❌ Erreur de connectivité simulée détectée:', e)
|
||||||
|
print('✅ La détection automatique d erreur fonctionne!')
|
||||||
|
exit(1) # Force l'échec pour démontrer la détection
|
||||||
|
"
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: 🧪 Test 3: Tests pytest avec erreurs intentionnelles
|
||||||
|
run: |
|
||||||
|
echo "Lancement des tests de connectivité avec pytest..."
|
||||||
|
docker compose run --rm test pytest test_connectivity.py -v
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: 📊 Show test results
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
echo "📋 Résultats des tests de connectivité:"
|
||||||
|
docker compose logs backend | tail -20
|
||||||
|
|
||||||
|
- name: 🧹 Cleanup
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
docker compose down -v
|
||||||
|
docker system prune -f
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
import pytest
|
||||||
|
import requests
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
BASE_URL = os.getenv("API_BASE_URL", "http://localhost:8000")
|
||||||
|
|
||||||
|
class TestConnectivity:
|
||||||
|
"""Tests de connectivité pour valider la détection automatique d'erreurs"""
|
||||||
|
|
||||||
|
def test_backend_health_with_retry(self):
|
||||||
|
"""Test de santé du backend avec retry - devrait passer"""
|
||||||
|
max_retries = 3
|
||||||
|
for attempt in range(max_retries):
|
||||||
|
try:
|
||||||
|
response = requests.get(f"{BASE_URL}/health", timeout=5)
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.json()["status"] == "healthy"
|
||||||
|
print(f"✅ Backend accessible (tentative {attempt + 1})")
|
||||||
|
return
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
print(f"⚠️ Tentative {attempt + 1} échouée: {e}")
|
||||||
|
if attempt < max_retries - 1:
|
||||||
|
time.sleep(2)
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
|
def test_backend_connection_timeout(self):
|
||||||
|
"""Test de timeout de connexion - simule une erreur de connectivité"""
|
||||||
|
# Ce test va échouer intentionnellement pour démontrer la détection d'erreur
|
||||||
|
try:
|
||||||
|
# Tentative de connexion à un port inexistant pour simuler une erreur
|
||||||
|
response = requests.get("http://localhost:9999/health", timeout=2)
|
||||||
|
assert False, "Cette ligne ne devrait jamais être atteinte"
|
||||||
|
except requests.exceptions.ConnectionError:
|
||||||
|
# C'est l'erreur attendue - on la laisse passer pour démontrer la détection
|
||||||
|
print("❌ Erreur de connectivité détectée (comportement attendu)")
|
||||||
|
raise Exception("Erreur de connectivité simulée pour tester la CI")
|
||||||
|
|
||||||
|
def test_database_connectivity(self):
|
||||||
|
"""Test de connectivité à la base de données via l'API"""
|
||||||
|
try:
|
||||||
|
response = requests.get(f"{BASE_URL}/rooms", timeout=5)
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert isinstance(response.json(), list)
|
||||||
|
print("✅ Base de données accessible via l'API")
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
print(f"❌ Erreur de connectivité base de données: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def test_api_response_time_under_load(self):
|
||||||
|
"""Test de performance sous charge - simule une surcharge"""
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
# Faire plusieurs requêtes simultanées pour simuler une charge
|
||||||
|
responses = []
|
||||||
|
for i in range(5):
|
||||||
|
try:
|
||||||
|
response = requests.get(f"{BASE_URL}/health", timeout=10)
|
||||||
|
responses.append(response)
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
print(f"❌ Requête {i+1} échouée: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
end_time = time.time()
|
||||||
|
total_time = end_time - start_time
|
||||||
|
|
||||||
|
# Si le temps de réponse est trop long, on considère cela comme une erreur
|
||||||
|
if total_time > 10:
|
||||||
|
print(f"❌ Temps de réponse trop long: {total_time:.2f}s")
|
||||||
|
raise Exception(f"Performance dégradée détectée: {total_time:.2f}s")
|
||||||
|
|
||||||
|
print(f"✅ Performance acceptable: {total_time:.2f}s")
|
||||||
|
assert total_time < 10
|
||||||
|
|
||||||
|
# Test pour simuler une erreur de configuration
|
||||||
|
def test_misconfigured_endpoint():
|
||||||
|
"""Test d'un endpoint mal configuré - simule une erreur de configuration"""
|
||||||
|
# Ce test va échouer pour démontrer la détection d'erreur
|
||||||
|
try:
|
||||||
|
response = requests.get(f"{BASE_URL}/nonexistent-endpoint", timeout=5)
|
||||||
|
if response.status_code == 404:
|
||||||
|
print("❌ Endpoint inexistant détecté (comportement attendu)")
|
||||||
|
raise Exception("Endpoint mal configuré détecté pour tester la CI")
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
print(f"❌ Erreur de requête: {e}")
|
||||||
|
raise Exception("Erreur de configuration détectée pour tester la CI")
|
||||||
|
|
||||||
|
# Test de simulation d'erreur réseau
|
||||||
|
def test_network_simulation():
|
||||||
|
"""Test de simulation d'erreur réseau - démontre la détection automatique"""
|
||||||
|
# Simulation d'une panne réseau temporaire
|
||||||
|
print("🔍 Simulation d'une panne réseau...")
|
||||||
|
|
||||||
|
# Ce test va échouer intentionnellement
|
||||||
|
try:
|
||||||
|
# Tentative de connexion à un serveur inexistant
|
||||||
|
response = requests.get("http://192.168.999.999:8000/health", timeout=1)
|
||||||
|
assert False, "Connexion impossible - erreur réseau simulée"
|
||||||
|
except requests.exceptions.RequestException:
|
||||||
|
print("❌ Panne réseau simulée détectée (comportement attendu)")
|
||||||
|
raise Exception("Erreur réseau simulée pour valider la détection automatique")
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import pytest
|
||||||
|
import requests
|
||||||
|
import os
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
BASE_URL = os.getenv("API_BASE_URL", "http://localhost:8000")
|
||||||
|
|
||||||
|
def test_backend_accessible():
|
||||||
|
"""Test que le backend est accessible - devrait passer"""
|
||||||
|
response = requests.get(f"{BASE_URL}/health", timeout=5)
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.json()["status"] == "healthy"
|
||||||
|
print("✅ Backend accessible")
|
||||||
|
|
||||||
|
def test_simulated_connectivity_error():
|
||||||
|
"""Test qui simule une erreur de connectivité - va échouer intentionnellement"""
|
||||||
|
# Ce test va échouer pour démontrer la détection automatique d'erreur
|
||||||
|
try:
|
||||||
|
# Tentative de connexion à un port inexistant
|
||||||
|
response = requests.get("http://backend:9999/health", timeout=2)
|
||||||
|
assert False, "Cette connexion ne devrait pas réussir"
|
||||||
|
except requests.exceptions.ConnectionError as e:
|
||||||
|
print("❌ Erreur de connectivité simulée détectée")
|
||||||
|
# On force l'échec pour démontrer la détection automatique
|
||||||
|
raise Exception("Erreur de connectivité simulée pour valider la détection automatique")
|
||||||
|
|
||||||
|
def test_nonexistent_endpoint():
|
||||||
|
"""Test d'un endpoint inexistant - va échouer intentionnellement"""
|
||||||
|
try:
|
||||||
|
response = requests.get(f"{BASE_URL}/nonexistent-endpoint", timeout=5)
|
||||||
|
if response.status_code == 404:
|
||||||
|
print("❌ Endpoint inexistant détecté")
|
||||||
|
# On force l'échec pour démontrer la détection automatique
|
||||||
|
raise Exception("Endpoint inexistant détecté pour valider la détection automatique")
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
print(f"❌ Erreur de requête: {e}")
|
||||||
|
raise Exception("Erreur de requête détectée pour valider la détection automatique")
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
@echo off
|
||||||
|
chcp 65001 >nul
|
||||||
|
echo Test de connectivite - Simulation d'erreurs
|
||||||
|
echo ==========================================
|
||||||
|
|
||||||
|
echo Verification de l'etat des services...
|
||||||
|
docker compose ps
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Demarrage des tests de connectivite...
|
||||||
|
echo (Ces tests vont simuler des erreurs pour valider la detection automatique)
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Test 1: Backend accessible
|
||||||
|
docker compose run --rm test python -c "
|
||||||
|
import requests
|
||||||
|
try:
|
||||||
|
response = requests.get('http://backend:8000/health', timeout=5)
|
||||||
|
print('✅ Backend accessible')
|
||||||
|
except Exception as e:
|
||||||
|
print('❌ Backend inaccessible:', e)
|
||||||
|
"
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Test 2: Simulation d'erreur de connectivite
|
||||||
|
docker compose run --rm test python -c "
|
||||||
|
import requests
|
||||||
|
try:
|
||||||
|
response = requests.get('http://backend:8000/nonexistent', timeout=5)
|
||||||
|
print('❌ Erreur attendue: endpoint inexistant')
|
||||||
|
except Exception as e:
|
||||||
|
print('❌ Erreur de connectivite simulee:', e)
|
||||||
|
"
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Test 3: Test avec pytest (avec erreurs intentionnelles)
|
||||||
|
docker compose run --rm test pytest test_connectivity.py -v
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Tests de connectivite termines !
|
||||||
|
echo Les erreurs ci-dessus sont intentionnelles pour valider la detection automatique.
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "🔍 Test de connectivité - Simulation d'erreurs"
|
||||||
|
echo "=============================================="
|
||||||
|
|
||||||
|
echo "📊 Vérification de l'état des services..."
|
||||||
|
docker compose ps
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🚀 Démarrage des tests de connectivité..."
|
||||||
|
echo "(Ces tests vont simuler des erreurs pour valider la détection automatique)"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🧪 Test 1: Backend accessible"
|
||||||
|
docker compose run --rm test python -c "
|
||||||
|
import requests
|
||||||
|
try:
|
||||||
|
response = requests.get('http://backend:8000/health', timeout=5)
|
||||||
|
print('✅ Backend accessible')
|
||||||
|
except Exception as e:
|
||||||
|
print('❌ Backend inaccessible:', e)
|
||||||
|
"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🧪 Test 2: Simulation d'erreur de connectivité"
|
||||||
|
docker compose run --rm test python -c "
|
||||||
|
import requests
|
||||||
|
try:
|
||||||
|
response = requests.get('http://backend:8000/nonexistent', timeout=5)
|
||||||
|
print('❌ Erreur attendue: endpoint inexistant')
|
||||||
|
except Exception as e:
|
||||||
|
print('❌ Erreur de connectivité simulée:', e)
|
||||||
|
"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🧪 Test 3: Test avec pytest (avec erreurs intentionnelles)"
|
||||||
|
docker compose run --rm test pytest test_connectivity.py -v
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✅ Tests de connectivité terminés !"
|
||||||
|
echo "Les erreurs ci-dessus sont intentionnelles pour valider la détection automatique."
|
||||||
Reference in New Issue
Block a user