Appearance
Carpeta Test
La carpeta test es fundamental para asegurar la calidad y el correcto funcionamiento de tu aplicación. Contiene todos los archivos de pruebas unitarias y de integración, que verifican que cada componente y ruta de la API se comporte como se espera. El objetivo principal de estas pruebas es detectar errores temprana y automáticamente, asegurar la no regresión al realizar cambios y validar que la lógica de negocio se implementa correctamente.
En este proyecto, las pruebas están escritas utilizando Vitest, un framework de pruebas moderno y rápido, y Supertest, una librería para probar APIs HTTP.
test/user.route.test.ts
Este archivo contiene las pruebas de integración para la ruta de obtención de todos los usuarios de la API (GET /users).
- Descripción: Este test simula una solicitud HTTP
GETa la ruta/usersy verifica que la API devuelva una respuesta exitosa (código 200). Para aislar la prueba de la base de datos real, se utilizavi.mockde Vitest para simular (mockear) el modelo de usuario (UserModel). De esta forma, la prueba no depende de una conexión activa a la base de datos, sino de datos predefinidos. - Propósito:Asegurar que la ruta
/usersfuncione correctamente, que la autenticación sea manejada y que la respuesta de la API contenga los datos esperados de los usuarios, sin depender de la infraestructura de la base de datos. - Tecnologías usadas:
- Vitest: El framework de pruebas.
- Supertest: Para realizar solicitudes HTTP a la aplicación Express.
- vi.mock: Función de Vitest para simular módulos.
- generateAccessToken: Utilidad para generar un token JWT de prueba necesario para la autenticación.
- Funcionalidad clave:
vi.mock("../../src/models/user.model", ...): Se sobrescribe el comportamiento delUserModel. Cuando la ruta/usersintente llamar aUserModel.getAll(), en lugar de ir a la base de datos, devolverá un array de usuarios predefinido.const token = generateAccessToken("test@test.com", "123");: Se genera un token de acceso válido para simular un usuario autenticado. Esto es crucial porque la ruta/usersprobablemente está protegida y requiere autenticación.request(app).get("/users").set("Authorization",Bearer ${token});: Supertest simula una solicitudGETa/usersy establece el encabezadoAuthorizationcon el token generado.expect(response.statusCode).toBe(200);: Verifica que el código de estado de la respuesta sea 200 (OK), indicando éxito.
- Rol en la aplicación: Este test es vital para la confiabilidad de la API. Garantiza que la obtención de la lista de usuarios sea funcional y que la capa de la ruta Express esté bien conectada con la lógica de obtención de datos simulada.
ts
import { describe, expect, test, vi } from "vitest";
import request from "supertest";
import app from "../../src/app";
import { generateAccessToken } from "../../src/utils/auth.util";
// Simula el módulo user.model para aislar la prueba de la base de datos real.
// Cuando se llame a `UserModel.getAll()`, devolverá un array con un usuario de prueba.
vi.mock("../../src/models/user.model", () => {
return {
UserModel: {
getAll: vi.fn(async () => [
{ id: 1, name: "Test User", email: "test@test.com" },
]),
},
};
});
// Genera un token de acceso para las pruebas, simulando un usuario autenticado.
const token = generateAccessToken("test@test.com", "123");
// Agrupa las pruebas relacionadas con la ruta /users
describe("/users", () => {
// Prueba específica para la solicitud GET a /users
test("GET debería devolver los usuarios", async () => {
// Realiza una solicitud HTTP GET a la aplicación
const response = await request(app)
.get("/users")
// Establece el encabezado de autorización con el token generado
.set("Authorization", `Bearer ${token}`);
// Espera que el código de estado de la respuesta sea 200 (OK)
expect(response.statusCode).toBe(200);
});
});
test/userid.route.test.ts
Este archivo contiene las pruebas de integración para la ruta de obtención de un usuario específico por ID (GET /users/:id).
- Descripción: Este test simula solicitudes HTTP
GETa la ruta/users/:idpara verificar dos escenarios:- Cuando se proporciona un ID de usuario válido, la API debería devolver el usuario correspondiente con un código de estado 200.
- Cuando se proporciona un ID de usuario que no existe, la API debería devolver un código de estado 404 (No Encontrado) y un mensaje de error. Al igual que en
user.route.test.ts, se utilizavi.mockpara simular el comportamiento del modelo de usuario y controlar los datos devueltos.
- Propósito:Asegurar que la ruta
/users/:idmaneje correctamente tanto las solicitudes exitosas (usuario encontrado) como los casos de error (usuario no encontrado), validando la lógica de recuperación por ID y el manejo de respuestas HTTP. - Tecnologías usadas:
- Vitest: El framework de pruebas.
- Supertest: Para realizar solicitudes HTTP a la aplicación Express.
- vi.mock: Función de Vitest para simular módulos.
- generateAccessToken: Utilidad para generar un token JWT de prueba necesario para la autenticación.
- Funcionalidad clave:
vi.mock("../../src/models/user.model", ...): Se sobrescribe el comportamiento delUserModel.findById(). Si se llama con el ID "1", devuelve un usuario de prueba; de lo contrario, devuelvenull.const token = generateAccessToken("test@test.com", "123");: Se genera un token de acceso para simular un usuario autenticado.test("GET /users/:id debería devolver un usuario si el ID es válido", ...):- Simula una solicitud
GETa/users/1con el token de autorización. expect(response.statusCode).toBe(200);: Verifica que el código de estado sea 200.expect(response.body).toEqual(...): Verifica que el cuerpo de la respuesta contenga los datos esperados del usuario.
- Simula una solicitud
test("GET /users/:id debería devolver 404 si el usuario no existe", ...):- Simula una solicitud GET a
/users/999(un ID que no existe según el mock). expect(response.statusCode).toBe(404);: Verifica que el código de estado sea 404 (Not Found).expect(response.body).toEqual({ error: "El ID de usuario no es válido", });: Verifica que el cuerpo de la respuesta contenga el mensaje de error esperado.
- Simula una solicitud GET a
- Rol en la aplicación: Estos tests son cruciales para validar la precisión en la recuperación de recursos individuales y la robustez del manejo de errores en las rutas de la API, asegurando que la aplicación responda de manera predecible en diferentes escenarios.
ts
import { describe, expect, test, vi } from "vitest";
import request from "supertest";
import app from "../../src/app";
import { generateAccessToken } from "../../src/utils/auth.util";
// Simula el módulo user.model, específicamente el método findById.
// Devuelve un usuario de prueba si el ID es "1", de lo contrario, devuelve null.
vi.mock("../../src/models/user.model", () => {
return {
UserModel: {
findById: vi.fn(async (id: string) => {
if (id === "1") {
return { id: "1", name: "Test User", email: "test@test.com" };
}
return null;
}),
},
};
});
// Genera un token de acceso para las pruebas.
const token = generateAccessToken("test@test.com", "123");
// Agrupa las pruebas relacionadas con la ruta /users/:id
describe("/users/:id", () => {
// Prueba para el caso de éxito: el ID de usuario es válido y se encuentra.
test("GET /users/:id debería devolver un usuario si el ID es válido", async () => {
// Realiza una solicitud GET a /users/1 con el token de autorización.
const response = await request(app)
.get("/users/1")
.set("Authorization", `Bearer ${token}`);
// Espera un código de estado 200 y que el cuerpo de la respuesta coincida con el usuario simulado.
expect(response.statusCode).toBe(200);
expect(response.body).toEqual({
name: "Test User",
email: "test@test.com",
});
});
// Prueba para el caso de error: el ID de usuario no existe.
test("GET /users/:id debería devolver 404 si el usuario no existe", async () => {
// Realiza una solicitud GET a /users/999 (un ID que no está en el mock).
const response = await request(app)
.get("/users/999")
.set("Authorization", `Bearer ${token}`);
// Espera un código de estado 404 y un mensaje de error específico.
expect(response.statusCode).toBe(404);
expect(response.body).toEqual({
error: "El ID de usuario no es válido",
});
});
});