Comprobar errores y límites de la API
Objetivos
Vas a comprobar lo que recibe el cliente cuando pide un registro ausente, manda parámetros inválidos o intenta usar un método no publicado.
Concepto
Los códigos de estado forman parte del contrato HTTP. 404 comunica que un cliente no existe; 422 indica que un valor no pasó validación; 405 Method Not Allowed señala que la ruta existe pero no acepta ese método. Probar solo la respuesta feliz deja sin revisar esas condiciones.
Las rutas de este curso son de lectura. No basta con que la interfaz no muestre botones para escribir: la API tampoco debe registrar rutas POST, PUT, PATCH o DELETE para las tablas Sakila canónicas. La cuenta MySQL separada agrega otra barrera con su permiso SELECT.
Ejemplo
Agrega pruebas con el cliente y el fixture SQLite de la lección anterior:
def test_customer_not_found(client):
response = client.get("/customers/999999")
assert response.status_code == 404
assert response.json() == {"detail": "Cliente no encontrado"}
def test_invalid_limit_is_rejected(client):
response = client.get("/customers?limit=0")
assert response.status_code == 422
def test_customer_write_route_is_not_registered(client):
response = client.post("/customers", json={"first_name": "Nadie"})
assert response.status_code == 405La prueba de método comprueba la superficie HTTP, no reemplaza el grant de MySQL. Ejecuta py -m pytest -q; el número de solicitudes exitosas no debe ocultar una ruta que acepta escrituras.
Práctica guiada
- Envía un identificador que el fixture no creó.
- Solicita
limit=51y registra el estado HTTP. - Intenta enviar
POST /customersy comprueba que no se aceptó.
Reto
Agrega una prueba que confirme que GET /payments?min_amount=1000 devuelve 422 antes de ejecutar una consulta.
Intenta el reto antes de consultar las pistas.
Quiz
Comprobación
Las rutas felices y sus límites ya tienen pruebas. El módulo final integra estas piezas en un paquete reproducible con Sakila local.