From a96a863d4acd905736c1f7933552e741637048c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valeria=20Zu=C3=B1iga=20Mendoza?= Date: Fri, 6 Jun 2025 21:22:12 -0600 Subject: [PATCH] =?UTF-8?q?tests:=20Agregar=20pruebas=20autom=C3=A1ticas?= =?UTF-8?q?=20de=20consultar=20lista=20y=20actualizar=20sets=20ptoductos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Constantes/mensajesSetsProductos.js | 4 + ...actualizarSetsProductos.controller.test.js | 83 +++++++++++++++++++ ...ultarListaSetsProductos.controller.test.js | 81 ++++++++++++++++++ jest.config.js | 4 + 4 files changed, 172 insertions(+) create mode 100644 _tests_/SetsProductos/actualizarSetsProductos.controller.test.js create mode 100644 _tests_/SetsProductos/consultarListaSetsProductos.controller.test.js diff --git a/Utilidades/Constantes/mensajesSetsProductos.js b/Utilidades/Constantes/mensajesSetsProductos.js index a2333e0..3d8291c 100644 --- a/Utilidades/Constantes/mensajesSetsProductos.js +++ b/Utilidades/Constantes/mensajesSetsProductos.js @@ -88,4 +88,8 @@ module.exports = { codigo: 400, mensaje: 'La lista de productos contiene elementos inválidos', }, + PARAMETROS_INVALIDOS: { + codigo: 400, + mensaje: 'Parámetros inválidos', + }, }; diff --git a/_tests_/SetsProductos/actualizarSetsProductos.controller.test.js b/_tests_/SetsProductos/actualizarSetsProductos.controller.test.js new file mode 100644 index 0000000..3aea3b8 --- /dev/null +++ b/_tests_/SetsProductos/actualizarSetsProductos.controller.test.js @@ -0,0 +1,83 @@ +const request = require('supertest'); +const express = require('express'); +const bodyParser = require('body-parser'); +const MENSAJES = require('@altertex/util/const/mensajesSetsProductos'); + +jest.mock('@altertex/setspro/repos/repositorioActualizarSetsProductos', () => ({ + actualizarSetProductos: jest.fn() +})); + +const repositorio = require('@altertex/setspro/repos/repositorioActualizarSetsProductos'); +const controller = require('@altertex/setspro/ctrl/actualizarSetsProductos.controller'); + +const app = express(); +app.use(bodyParser.json()); + +// 👇 Middleware para simular usuario con cliente seleccionado +app.use((req, res, next) => { + req.user = { clienteSeleccionado: 1 }; + next(); +}); + +app.put('/sets-productos', controller.actualizarSetProductos); + +describe('Controlador actualizarSetProductos', () => { + // Silenciar console.error durante las pruebas para evitar ruido en la salida + beforeAll(() => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + }); + + // Restaurar el comportamiento original de console.error + afterAll(() => { + console.error.mockRestore(); + }); + + // Limpia los mocks después de cada test + afterEach(() => jest.clearAllMocks()); + + it('debe devolver 400 si faltan campos requeridos', async () => { + const res = await request(app).put('/sets-productos').send({ + nombre: 'Set incompleto' + }); + + expect(res.statusCode).toBe(MENSAJES.FORMATO_INVALIDO_DATOS.codigo); + expect(res.body.mensaje).toBe(MENSAJES.FORMATO_INVALIDO_DATOS.mensaje); + expect(res.body.detalles).toMatch(/nombre y lista de productos/i); + }); + + it('debe devolver 200 si la actualización es exitosa', async () => { + repositorio.actualizarSetProductos.mockResolvedValue(); + + const datos = { + idSetProducto: 1, + nombre: 'Set Actualizado', + descripcion: 'Nueva descripción', + activo: true, + productos: [101, 102] + }; + + const res = await request(app).put('/sets-productos').send(datos); + + expect(res.statusCode).toBe(MENSAJES.SET_ACTUALIZADO.codigo); + expect(res.body.mensaje).toBe(MENSAJES.SET_ACTUALIZADO.mensaje); + expect(res.body.datos).toEqual(datos); + expect(repositorio.actualizarSetProductos).toHaveBeenCalledWith(1, datos); + }); + + it('debe devolver 500 si el repositorio lanza un error', async () => { + repositorio.actualizarSetProductos.mockRejectedValue(new Error('Fallo DB')); + + const datos = { + idSetProducto: 2, + nombre: 'Set con error', + descripcion: 'desc', + activo: false, + productos: [] + }; + + const res = await request(app).put('/sets-productos').send(datos); + + expect(res.statusCode).toBe(MENSAJES.ERROR_ACTUALIZAR_SET.codigo); + expect(res.body.mensaje).toBe('Fallo DB'); + }); +}); diff --git a/_tests_/SetsProductos/consultarListaSetsProductos.controller.test.js b/_tests_/SetsProductos/consultarListaSetsProductos.controller.test.js new file mode 100644 index 0000000..3c4d609 --- /dev/null +++ b/_tests_/SetsProductos/consultarListaSetsProductos.controller.test.js @@ -0,0 +1,81 @@ +// Mocks antes de importar el controlador +jest.mock('@altertex/setspro/repos/repositorioConsultarSetsProductos', () => ({ + obtenerSetsProductos: jest.fn(), +})); + +// Importaciones +const controlador = require('@altertex/setspro/ctrl/consultarSetsProductos.controller'); +const repositorio = require('@altertex/setspro/repos/repositorioConsultarSetsProductos'); +const MENSAJES = require('@altertex/util/const/mensajesSetsProductos'); + +describe('Controlador consultarLista (sets de productos)', () => { + let req; + let res; + + beforeEach(() => { + jest.clearAllMocks(); + + req = { + user: { + clienteSeleccionado: '101', + }, + }; + + res = { + status: jest.fn().mockReturnThis(), + json: jest.fn(), + }; + + jest.spyOn(console, 'error').mockImplementation(() => {}); // Silenciar errores + }); + + // Escenario 1: ID de cliente inválido + test('Debe retornar error si el ID del cliente no es válido', async () => { + req.user.clienteSeleccionado = undefined; + + await controlador.consultarLista(req, res); + expect(res.status).toHaveBeenCalledWith(MENSAJES.PARAMETROS_INVALIDOS.codigo); + expect(res.json).toHaveBeenCalledWith({ + mensaje: MENSAJES.PARAMETROS_INVALIDOS.mensaje, + }); + }); + + // Escenario 2: Lista de sets obtenida exitosamente + test('Debe retornar la lista de sets si la consulta es exitosa', async () => { + const mockSets = [ + { + idSet: 1, + nombre: 'Set A', + productos: ['Producto 1', 'Producto 2'], + }, + { + idSet: 2, + nombre: 'Set B', + productos: ['Producto 3'], + }, + ]; + + repositorio.obtenerSetsProductos.mockResolvedValue(mockSets); + + await controlador.consultarLista(req, res); + + expect(repositorio.obtenerSetsProductos).toHaveBeenCalledWith(101); + expect(res.status).toHaveBeenCalledWith(MENSAJES.CONSULTA_EXITOSA.codigo); + expect(res.json).toHaveBeenCalledWith({ + mensaje: MENSAJES.CONSULTA_EXITOSA.mensaje, + setsProductos: mockSets, + }); + }); + + // Escenario 3: Error inesperado en el repositorio + test('Debe manejar errores inesperados del repositorio', async () => { + repositorio.obtenerSetsProductos.mockRejectedValue(new Error('Error')); + + await controlador.consultarLista(req, res); + + expect(res.status).toHaveBeenCalledWith(MENSAJES.ERROR_CONSULTAR_SETS_PRODUCTOS.codigo); + expect(res.json).toHaveBeenCalledWith({ + mensaje: MENSAJES.ERROR_CONSULTAR_SETS_PRODUCTOS.mensaje, + }); + }); +}); diff --git a/jest.config.js b/jest.config.js index f30998f..9162afb 100644 --- a/jest.config.js +++ b/jest.config.js @@ -92,6 +92,10 @@ module.exports = { '^@altertex/usu/datos/(.*)$': '/Usuarios/Datos/$1', '^@altertex/usu/(.*)$': '/Usuarios/$1', + // Sets de productos + "^@altertex/setspro/ctrl/(.*)$": "/SetsProductos/Controladores/$1", + "^@altertex/setspro/repos/(.*)$": "/SetsProductos/Datos/Repositorios/$1", + // Generic mapping as fallback '^@altertex/(.*)$': '/$1',