Esta página está pensada para alguien que nunca probó una API antes.
Vas a encontrar, endpoint por endpoint, qué hace, si necesita un token,
si hay que mandarle datos (body) y qué cosas conviene probar para
encontrar errores. El objetivo es que puedas romper la API para
ayudarnos a encontrar fallas.
¿Qué es esto y qué voy a estar probando?
GESTORA es una API para administrar finanzas personales: permite registrar
ingresos (los que cobrás cada mes y los eventuales) y
gastos (los fijos y los que van saliendo en el mes), agruparlos por
categorías y consumos (por ejemplo "Sueldo", "Supermercado",
"Netflix"), y sacar reportes: si un mes terminaste con superávit o
déficit, cómo fue comparado con otro mes, y cuáles fueron los 10 gastos
más grandes de un mes.
Todo se maneja por usuario: cada persona sólo puede ver y modificar
sus propios datos. Para identificarse, la API usa un token (una
cadena larga) que se obtiene al hacer login y se manda en cada request
siguiente.
Links útiles dentro de la API
· Swagger UI interactivo: /docs
· ReDoc (misma info, otro formato): /redoc
· Especificación OpenAPI cruda: /openapi.json
Preparar Insomnia
Seguí estos pasos una sola vez; después sirven para todas las pruebas.
1. Abrí Insomnia y creá un nuevo proyecto (o Workspace). Adentro,
creá una Request Collection.
2. Dentro de la colección, creá un Environment
(menú superior izquierdo → el nombre del environment). Agregá dos variables:
Después de hacer login te vas a copiar el access_token que
devuelve la API y lo vas a pegar en la variable token.
3. Cuando un endpoint pida body JSON, en Insomnia hacé:
pestaña Body → seleccioná JSON, y pegá el ejemplo de body
que aparece en cada endpoint de esta página.
4. Cuando un endpoint pida token, en Insomnia hacé:
pestaña Auth → seleccioná Bearer Token → pegá {{ _.token }}
(para usar la variable del environment). Una alternativa manual es
agregar en la pestaña Headers: Authorization: Bearer <tu-token>.
5. La URL de cada request se arma como
{{ _.base_url }}/api/.... Por ejemplo, para login sería
{{ _.base_url }}/api/auth/login.
Flujo recomendado de testing
Algunos endpoints dependen de que exista información previa
(no podés crear un ingreso fijo sin tener antes un registro mensual y un
consumo). Te recomiendo probar en este orden:
Registrar un usuario nuevo.
Login para obtener el token y guardarlo en la variable token del environment.
Crear tu perfil (una vez por usuario).
Crear al menos 2 categorías: una de tipo ingreso
(ej. "Sueldo") y una de tipo gasto (ej. "Supermercado").
Crear consumos vinculados a esas categorías (ej. "Salario mensual" en la categoría "Sueldo").
Crear uno o más registros mensuales (año/mes). Sin esto no podés cargar movimientos.
Cargar ingresos y gastos (fijos y/o eventuales) eligiendo el registro mensual y el consumo.
Pedir reportes: balance del mes, comparativa entre dos meses, top 10 gastos.
Importante: cada vez que intentes acceder a un recurso
que NO es tuyo (por ejemplo, pedir una categoría de otro usuario con tu token),
la API te va a devolver 404 "no encontrado" en lugar de 403.
Esto es adrede, para no revelar qué IDs existen en el sistema.
Códigos de respuesta que vas a ver
Código
Significado
Cuándo aparece
200
OK
Todo salió bien (GET, PATCH, DELETE).
201
Creado
Un POST creó un recurso nuevo.
400
Datos inválidos
El body tiene errores de formato o reglas (ej. email mal escrito).
401
No autenticado
Falta el token, o está vencido o mal armado.
404
No encontrado
El recurso no existe o no te pertenece.
409
Conflicto
Ya existe algo igual (ej. email duplicado, mes/año ya registrado).
422
Body mal formado
Faltan campos requeridos o los tipos están mal (ej. mandás texto donde va un número).
500
Error interno
Problema del servidor. Si ves esto, reportalo con el body y los pasos que hiciste.
Registrar un usuario nuevo
POST/api/users/registerBODYSIN TOKEN
Crea una cuenta con email y contraseña. Es el primer paso antes de cualquier cosa.
Debería crear un usuario si los datos son válidos y rechazar cualquier combinación inválida.
Caso feliz: email bien escrito + contraseña que cumple las reglas → debería devolver 201.
Email sin "@" o sin dominio → debería devolver 400 con errors.email.
Contraseña corta / sin mayúscula / sin número → debería devolver 400 con errors.password.
Email y contraseña inválidos al mismo tiempo → 400 con los dos errores juntos.
Repetir el mismo email → debería devolver 409.
Mandar el body sin el campo password → debería devolver 422.
Probá con la contraseña Abcdefg1. ¿Pasa? Debería (8 caracteres, 1 mayús, 1 número).
Probá con ABCDEFG1 (todo mayúsculas, sin minúsculas). Mirá si la API lo acepta: según las reglas, sí lo acepta porque no exigimos minúsculas. Si creés que debería exigirlas, anotalo como posible mejora.
Iniciar sesión (login)
POST/api/auth/loginBODYSIN TOKEN
Verifica las credenciales y devuelve un access_token que vale por 24 horas.
Ese token lo vas a pegar en la variable token de Insomnia
y se va a usar en todos los endpoints protegidos.
401 credenciales inválidas (email no existe, password no coincide o cuenta inactiva).
Qué debe hacer y qué probar
Login correcto → 200 con un access_token. Copialo a la variable token.
Email correcto pero password incorrecta → 401 "Credenciales inválidas".
Email que no existe → 401. El mensaje debe ser exactamente el mismo que el caso anterior (es a propósito: no queremos que se pueda averiguar si un email está registrado midiendo respuestas).
Body vacío o sin email/password → 422.
Ver mi usuario autenticado
GET/api/users/meSIN BODYTOKEN
Devuelve el usuario que corresponde al token que mandaste. Es el
endpoint más simple para validar que tu token está bien configurado.
Respuestas posibles
200 devuelve tu id_usuario, email, activo, fecha_creacion.
401 sin token, token inválido o token vencido.
Qué debe hacer y qué probar
Con token válido → 200 y tu info.
Sin header Authorization → 401.
Con Authorization: Bearer cualquier-cosa inventada → 401.
Con un token válido pero muy viejo (más de 24 horas) → 401.
Crear mi perfil
POST/api/profilesBODYTOKEN
Cada usuario tiene un solo perfil. Si ya existe, este endpoint falla.
Crear una categoría "Supermercado" tipo gasto → 201.
Mandar tipo: "otro" → 400.
Mandar color: "verde" → 400.
Mandar nombre: "X" (1 char) → 400.
Listar mis categorías
GET/api/categoriesSIN BODYTOKEN
Qué probar
Sin categorías creadas → 200 con array vacío [].
Con 2 categorías creadas → 200 con array de 2 elementos.
Con un segundo usuario: sus categorías no deben aparecer acá.
Ver una categoría
GET/api/categories/{id_categoria}SIN BODYTOKEN
Reemplazá {id_categoria} por el número del ID que te devolvió al crearla (ej. /api/categories/1).
Qué probar
ID de una categoría tuya → 200.
ID inexistente (ej. 999999) → 404.
ID de una categoría de otro usuario → 404 (no 403, a propósito).
Editar categoría
PATCH/api/categories/{id_categoria}BODYTOKEN
Body JSON (ejemplo, campos opcionales)
{
"nombre": "Sueldo bruto",
"color": "#0ea5e9"
}
Qué probar
Cambiar sólo color → 200.
Cambiar tipo de "ingreso" a "gasto" (la API lo permite, pero revisá si tiene sentido cuando la categoría ya tiene consumos asociados — posible mejora a reportar).
Body vacío {} → 400.
ID inexistente → 404.
Borrar categoría
DELETE/api/categories/{id_categoria}SIN BODYTOKEN
Qué probar
Borrar una categoría que no tenés consumos asociados → 200.
Intentar borrar una categoría que tiene consumos encima → puede fallar con 500 por restricción de clave foránea. Si eso pasa, reportalo; lo ideal es devolver 409 o borrar en cascada.
Borrar categoría de otro usuario → 404.
Crear consumo
POST/api/consumosBODYTOKEN
Un consumo es un "ítem" con nombre que viveá dentro de una
categoría. Ejemplo: en la categoría "Supermercado" podés tener los
consumos "Coto centro" y "Día del barrio". Después, cuando cargues
un gasto de supermercado, elegís uno de esos consumos.
Body JSON
{
"id_categoria": 1,
"nombre": "Salario mensual",
"descripcion": "Sueldo de mi trabajo principal"
}
Reglas
nombre: entre 2 y 150 caracteres.
descripcion: opcional, texto libre.
id_categoria: debe ser una categoría que te pertenece.
Qué probar
Crear un consumo con categoría propia → 201.
Usar un id_categoria inexistente → 404.
Usar un id_categoria de otro usuario → 404 (seguridad).
Nombre de 1 sólo carácter → 400.
Listar mis consumos
GET/api/consumosSIN BODYTOKEN
Qué probar
Sin consumos → 200 y [].
Después de crear 2 o 3 consumos → 200 con la lista correcta.
Intentar mover el consumo a una categoría de otro usuario → 404.
Body vacío {} → 400.
Borrar consumo
DELETE/api/consumos/{id_consumo}SIN BODYTOKEN
Qué probar
Borrar consumo sin movimientos asociados → 200.
Borrar consumo que ya se usó en un ingreso/gasto → puede fallar con 500 por FK; si pasa, reportalo.
Borrar consumo de otro usuario → 404.
Crear registro mensual
POST/api/monthly-recordsBODYTOKEN
Un registro mensual representa un mes concreto (año + mes) en el que vas
a cargar ingresos y gastos. Por ejemplo, "marzo de 2026" es un registro.
Sin esto no podés crear ningún movimiento.
Body JSON
{
"anio": 2026,
"mes": 3
}
Reglas
anio: entre 2000 y 2100.
mes: entre 1 y 12.
No puede haber dos registros con el mismo anio y mes para el mismo usuario.
Qué probar
Crear marzo 2026 → 201. Anotá el id_registro_mensual que devuelve.
Intentar crear otra vez marzo 2026 (mismo usuario) → 409.
mes: 13 o mes: 0 → 400.
anio: 1999 o anio: 2200 → 400.
Mandar mes como texto ("marzo") → 422.
Listar mis registros mensuales
GET/api/monthly-recordsSIN BODYTOKEN
Los devuelve ordenados del más reciente al más viejo.
Qué probar
Crear marzo, abril y enero de 2026. El orden debería ser: abril, marzo, enero.
Si tenía movimientos asociados, es probable que el borrado falle con 500 por FK. Reportalo.
Ingresos y gastos (movimientos)
Hay 4 tipos de movimientos. Todos se crean de forma muy parecida:
Ingresos fijos (ej. sueldo): el mismo mes, sin fecha específica.
Ingresos eventuales (ej. un bono): el mes más una fecha exacta.
Gastos fijos (ej. alquiler): sin fecha específica.
Gastos eventuales (ej. comer afuera un domingo): con fecha exacta.
En todos, vas a necesitar tener antes:
Un registro mensual del mes que corresponda.
Un consumo cuya categoría sea del tipo correcto:
Para ingresos, el consumo tiene que estar en una categoría tipo ingreso.
Para gastos, en una categoría tipo gasto.
Test clave (seguridad/integridad): si intentás crear un
ingreso usando un consumo de categoría tipo gasto, la
API debe rechazarlo con 404. Lo mismo al revés. Probalo.
Campos comunes de todos los movimientos
id_registro_mensual: el ID del registro del mes.
id_consumo: el ID del consumo.
monto: un número mayor a 0.
observaciones: texto libre, opcional.
fecha: sólo en los eventuales. Formato ISO, ej. "2026-03-15T12:00:00".
Fecha fuera del mes del registro (ej. "2026-07-01" si el registro es de marzo) → actualmente la API lo acepta. Anotalo como posible mejora: idealmente debería validar que la fecha caiga dentro del mes.
Cargar 15 gastos eventuales con montos distintos y después pedir el top 10 (ver sección Reportes). Deberían aparecer los 10 más altos, ordenados de mayor a menor.
Dos gastos exactamente del mismo monto → ambos deben aparecer si están en el top; no debe "saltear" uno.
Calcula el balance del mes indicado: suma todos los ingresos (fijos + eventuales),
todos los gastos (fijos + eventuales) y te dice si tuviste
superávit, déficit o equilibrio.
Compara dos meses: el primero es la base, el segundo es el
comparado. Devuelve el balance de cada uno y la variación
porcentual del segundo respecto al primero.
Ejemplo
GET /api/reports/compare/2026/3/vs/2026/4
Si en marzo gastaste $100.000 y en abril $80.000, gastos_pct
debe dar -20 (bajaron 20%).
Qué probar
Mes base con total_ingresos = 0 → ingresos_pct debe ser null (no se puede dividir por 0).
Comparar dos meses iguales → todas las variaciones deben ser 0 o muy cerca.
Alguno de los dos meses sin registro → 404 con detalle claro de cuál falta.
Cruzar años (/2025/12/vs/2026/1) → debería funcionar normal.
Devuelve los 10 gastos eventuales más grandes del mes indicado,
ordenados de mayor a menor. Si hay menos de 10, devuelve todos.
No incluye gastos fijos.
Qué probar
Mes con 5 gastos eventuales → devuelve los 5, ordenados del más caro al más barato.
Mes con 15 gastos eventuales → devuelve los 10 más grandes.
Mes sin gastos eventuales → devuelve [].
Mes sin registro mensual → 404.
Dos gastos con el mismo monto → ambos deben estar si entran en el top, no debe saltarse uno.
Confirmá que no aparezcan gastos fijos (son otro recurso; estos endpoints son sólo "ocasionales").