peso_kg
· Reproducibilidad: 100%
Descripción: Al enviar peso_kg: -2147483648 (valor mínimo de int32), FastAPI propaga la excepción sin capturarla, devolviendo un traceback completo de Python en el cuerpo de la respuesta HTTP.
Input mínimo reproducible:
Riesgo: El traceback expone rutas internas (/app/routers/, /app/db/), nombres de módulos y lógica de negocio. Debe añadirse validación ge=0 en el modelo Pydantic y captura global de excepciones.
patient_id
· Reproducibilidad: 100%
Descripción: Con patient_id = "1 OR 1=1", el endpoint devuelve un error 422 cuyo detalle incluye la query SQL fallida, confirmando que el parámetro se interpola sin sanitizar antes de la validación de tipo.
Riesgo: El mensaje de error revela la query SQL literal, el driver de base de datos (psycopg2) y que se usa interpolación de strings. Aunque FastAPI valida el tipo antes de ejecutar la query, el mensaje de error expone la estructura interna. Usar ge=1 en el path param y capturar excepciones de DB sin propagar mensajes raw.
kcal
· Reproducibilidad: 87%
Descripción: El schema OpenAPI declara kcal como type: number sin marcar required. Schemathesis genera payloads donde kcal es null, lo que provoca un NullPointerException en el cálculo de macros.
Fix: Añadir kcal: float = Field(..., gt=0) en MealCreate (campo requerido y positivo). Actualizar el schema OpenAPI para marcarlo required: true.
imc
· Frecuencia: 34% de los casos
Descripción: El schema declara que la respuesta del informe SIEMPRE incluye imc (Índice de Masa Corporal). Sin embargo, cuando el paciente no tiene registrada la altura, el campo se omite silenciosamente en lugar de devolver null o un error.
Riesgo: Los clientes (apps móviles, dashboards) que lean response.imc sin guardia obtendrán undefined / excepción. El schema debe marcarlo nullable: true o garantizar su presencia.
Descripción: El 99th percentil de latencia del endpoint DELETE supera los 4.8 segundos con patient_id de gran magnitud (ej. 99999999), rozando el umbral de 5s. Sugiere ausencia de índice en la columna id o una consulta de cascada no optimizada al borrar dependencias.
username="", password=""
Descripción: El endpoint de login devuelve 401 correctamente con contraseña incorrecta, pero con username="" y password="" devuelve 422 en lugar de 400. El schema declara que las credenciales vacías deben retornar 400 Bad Request.
X-Request-ID
Descripción: El schema declara X-Request-ID como header de respuesta en todos los endpoints. En las respuestas 4xx/5xx el header no se incluye, lo que dificulta la correlación de errores en los logs de producción.
ge=0 en peso_kg, altura_cm y gt=0 en kcal. FastAPI rechazará los valores antes de llegar a la lógica de negocio, eliminando los 500s.@app.exception_handler(Exception) que loguee el traceback internamente pero devuelva solo {"detail": "Internal server error", "request_id": "..."} al cliente.imc como nullable o required P1 — Esta semanaimc puede ser null (paciente sin altura) y actualizar el schema. Los clientes deben poder confiar en el contrato sin guardias defensivas.patients.id y optimizar cascada de DELETE P1 — Esta semanaCREATE INDEX IF NOT EXISTS idx_patients_id ON patients(id); y revisar la estrategia de borrado en cascada para reducir latencia de P99 por debajo de 1s.