Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Utilidades/Constantes/mensajesSetsProductos.js
Original file line number Diff line number Diff line change
Expand Up @@ -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',
},
};
83 changes: 83 additions & 0 deletions _tests_/SetsProductos/actualizarSetsProductos.controller.test.js
Original file line number Diff line number Diff line change
@@ -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');
});
});
Original file line number Diff line number Diff line change
@@ -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,
});
});
});
4 changes: 4 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,10 @@ module.exports = {
'^@altertex/usu/datos/(.*)$': '<rootDir>/Usuarios/Datos/$1',
'^@altertex/usu/(.*)$': '<rootDir>/Usuarios/$1',

// Sets de productos
"^@altertex/setspro/ctrl/(.*)$": "<rootDir>/SetsProductos/Controladores/$1",
"^@altertex/setspro/repos/(.*)$": "<rootDir>/SetsProductos/Datos/Repositorios/$1",

// Generic mapping as fallback
'^@altertex/(.*)$': '<rootDir>/$1',

Expand Down