forked from val-lop20/Pagina-de-Asistencia-MAC
127 lines
4.0 KiB
Python
127 lines
4.0 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Script de prueba para verificar rate limiting
|
|
Ejecutar con el servidor de desarrollo corriendo:
|
|
python test_ratelimit.py
|
|
"""
|
|
|
|
import requests
|
|
import time
|
|
import json
|
|
|
|
API_BASE_URL = 'http://127.0.0.1:8000/api'
|
|
|
|
def test_login_rate_limit():
|
|
"""
|
|
Probar rate limiting en login (límite: 5/min)
|
|
"""
|
|
print("\n" + "="*60)
|
|
print("TEST: Rate Limiting en Login (5 intentos por minuto)")
|
|
print("="*60)
|
|
|
|
endpoint = f"{API_BASE_URL}/auth/login/"
|
|
credentials = {
|
|
"account_number": "9999999", # Cuenta que no existe
|
|
"password": "wrongpassword"
|
|
}
|
|
|
|
print(f"\nEnviando 7 solicitudes a {endpoint}")
|
|
print("Esperado: Primeras 5 pasan, las siguientes 2 reciben 429\n")
|
|
|
|
for i in range(1, 8):
|
|
try:
|
|
response = requests.post(endpoint, json=credentials, timeout=5)
|
|
|
|
if response.status_code == 429:
|
|
print(f"[{i}] ❌ 429 TOO MANY REQUESTS - Rate limit alcanzado!")
|
|
print(f" Respuesta: {response.json()}")
|
|
elif response.status_code == 400:
|
|
print(f"[{i}] ✓ 400 BAD REQUEST - Solicitud procesada (credenciales inválidas)")
|
|
else:
|
|
print(f"[{i}] ✓ {response.status_code} - Solicitud procesada")
|
|
|
|
except requests.exceptions.ConnectionError:
|
|
print(f"[{i}] ❌ Error: No se pudo conectar al servidor")
|
|
print(" Asegúrate de que el servidor esté corriendo:")
|
|
print(" cd backend && python manage.py runserver")
|
|
break
|
|
except Exception as e:
|
|
print(f"[{i}] ❌ Error: {e}")
|
|
|
|
time.sleep(0.5) # Pequeña pausa entre solicitudes
|
|
|
|
def test_check_auth_rate_limit():
|
|
"""
|
|
Probar rate limiting en check-auth (límite: 30/min)
|
|
"""
|
|
print("\n" + "="*60)
|
|
print("TEST: Rate Limiting en Check Auth (30 por minuto)")
|
|
print("="*60)
|
|
|
|
endpoint = f"{API_BASE_URL}/auth/check-auth/"
|
|
|
|
print(f"\nEnviando 32 solicitudes a {endpoint}")
|
|
print("Esperado: Primeras 30 pasan, las siguientes 2 reciben 429\n")
|
|
|
|
success_count = 0
|
|
rate_limited_count = 0
|
|
|
|
for i in range(1, 33):
|
|
try:
|
|
response = requests.get(endpoint, timeout=5)
|
|
|
|
if response.status_code == 429:
|
|
rate_limited_count += 1
|
|
if rate_limited_count == 1: # Solo mostrar el primero
|
|
print(f"[{i}] ❌ 429 - Rate limit alcanzado!")
|
|
elif rate_limited_count <= 3:
|
|
print(f"[{i}] ❌ 429")
|
|
elif response.status_code == 200:
|
|
success_count += 1
|
|
if success_count <= 3 or success_count == 30: # Mostrar algunos
|
|
print(f"[{i}] ✓ 200 - OK")
|
|
|
|
except requests.exceptions.ConnectionError:
|
|
print(f"[{i}] ❌ Error: Servidor no disponible")
|
|
break
|
|
except Exception as e:
|
|
print(f"[{i}] ❌ Error: {e}")
|
|
break
|
|
|
|
if i % 10 == 0:
|
|
print(f" ... {i} solicitudes enviadas ...")
|
|
|
|
print(f"\nResultado:")
|
|
print(f" - Exitosas: {success_count}")
|
|
print(f" - Rate limited: {rate_limited_count}")
|
|
|
|
def main():
|
|
print("\n" + "#"*60)
|
|
print("# PRUEBAS DE RATE LIMITING - MAC Attendance")
|
|
print("#"*60)
|
|
print("\nAsegúrate de que el servidor esté corriendo:")
|
|
print(" cd backend && python manage.py runserver\n")
|
|
|
|
input("Presiona ENTER para comenzar las pruebas...")
|
|
|
|
# Probar login rate limit
|
|
test_login_rate_limit()
|
|
|
|
print("\n\nEsperando 5 segundos antes del siguiente test...")
|
|
time.sleep(5)
|
|
|
|
# Probar check-auth rate limit
|
|
test_check_auth_rate_limit()
|
|
|
|
print("\n" + "="*60)
|
|
print("PRUEBAS COMPLETADAS")
|
|
print("="*60)
|
|
print("\nNOTA: Si necesitas desactivar rate limiting para testing:")
|
|
print(" 1. Agregar RATELIMIT_ENABLE=False en .env")
|
|
print(" 2. O cambiar block=False en los decoradores\n")
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
main()
|
|
except KeyboardInterrupt:
|
|
print("\n\nPrueba interrumpida por el usuario") |