Files
pagasis/backend/scripts/test_ratelimit.py
T
2025-10-15 23:45:32 -06:00

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")