Prueba: Reportes – Egresos (Beta)
Objetivo
Validar que el sistema genere correctamente los reportes asociados al módulo de Egresos, permitiendo seleccionar filtros dinámicos (por fecha, registro o tercero), y exportar los resultados en PDF y Excel (XLS).
Precondiciones
- Usuario autenticado mediante el comando
cy.login(). - Acceso al dashboard del sistema
(/dashboard).. - Acceso al módulo de Reportes mediante la ruta
/reports - El tab Egresos debe estar disponible y activable (
#egresos-tab) - Existencia de datos en los rangos utilizados por las prueba
- Los botones/modales de cada reporte deben existir en el DOM
Pasos Generales
- Iniciar sesión y acceder al dashboard.
- Entrar al módulo Reportes.
- Seleccionar el tab Egresos.
- Para cada reporte: abrir modal correspondiente.
- Si aplica, activar el filtro correspondiente (
función mostrarFiltroReportes/mostrarFiltroNomina). - Completar los campos del escenario (fechas, registros, selección de tercero).
- Generar en PDF y luego en XLS.
- Cerrar el modal y verificar que haya desaparecido del DOM.
Resultado Esperado
- El tab Egresos se muestra activo y con el contenido cargado.
- Cada modal de reporte se abre y permite interacción con los campos y filtros necesarios.
- Los botones de generación (PDF/XLS) están visibles y ejecutan la descarga/proceso sin errores visibles.
- El modal se cierra correctamente después de generar los reportes.
- No quedan modales con la clase
.modal.showen el DOM al finalizar cada flujo.
Explicación Detallada del Código
Visitar Modulo de reportes y Validación del tab activo
cy.visit("/reports");
cy.get("#egresos-tab").click();
cy.get("#egresos-tab").should("have.class", "active");
Explicación
- Se ingresa automáticamente al módulo Reportes antes de cada caso.
- Se localiza el tab con el identificador
#egresos-tab - La condición
have.class('active')asegura que el sistema esté mostrando el contenido del módulo Ventas.
Definición de los reportes y escenarios de prueba
const reportes = [
// --- Reporte Egresos ---
{
nombre: "Reporte Egresos",
dataTarget: "#generarReporteEgresosReportes",
escenarios: [
{
tipo: "fecha",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroReportes",
filtros: [
{ id: "#fecha-inicial-reportes", valor: "2025-09-01" },
{ id: "#fecha-final-reportes", valor: "2025-12-31" },
],
},
{
tipo: "registro",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroReportes",
filtros: [
{ id: "#registro-inicial-reportes", valor: "010" },
{ id: "#registro-final-reportes", valor: "100" },
],
},
],
},
// --- Reporte Costos ---
{
nombre: "Reporte Costos",
dataTarget: "#generarReporteCostos",
escenarios: [
{
tipo: "fecha",
tieneFiltro: false,
filtros: [
{ id: "#fecha-inicial-costos", valor: "2025-09-01" },
{ id: "#fecha-final-costos", valor: "2025-12-28" },
],
},
],
},
// --- Reporte Gastos ---
{
nombre: "Reporte Gastos",
dataTarget: "#generarReporteGastos",
escenarios: [
{
tipo: "fecha",
tieneFiltro: false,
filtros: [
{ id: "#fecha-inicial-gastos", valor: "2025-09-01" },
{ id: "#fecha-final-gastos", valor: "2025-12-31" },
],
},
],
},
// --- Reporte Nómina ---
{
nombre: "Reporte Nómina",
dataTarget: "#generarReporteNomina",
escenarios: [
{
tipo: "fecha",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroNomina",
filtros: [
{ id: "#fecha-inicial-nomina", valor: "2025-09-01" },
{ id: "#fecha-final-nomina", valor: "2025-11-30" },
],
},
{
tipo: "tercero",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroNomina",
filtros: [{ id: "#tercero_dropdown_nomina", accion: "click" }],
},
],
},
];
Explicación
- Se define un arreglo
reportesque describe cada reporte, sudataTarget(para abrir modal) y sus escenarios. - Cada
escenariocontienetipo,tieneFiltro,filtroFuncion(nombre de la función que habilita filtros en el modal) yfiltros(campos a llenar o acciones).
Apertura del modal de reporte
cy.get(`[data-target='${reporte.dataTarget}']`).click();
cy.wait(500);
cy.get(".modal.show").should("be.visible");
Explicación
- Se hace clic en el botón que tiene el atributo
data-targetapuntando al modal del reporte. cy.wait(500)asegura que la animación o el render del modal termine antes de interactuar..modal.showes la clase usada por el componente modal para indicar que está abierto y visible — se valida su presencia.
Habilitar filtro (si aplica) y llenar campos
cy.get(".modal.show").within(() => {
if (escenario.tieneFiltro && escenario.filtroFuncion) {
cy.get(`[onclick="${escenario.filtroFuncion}('${escenario.tipo}')"]`, {
timeout: 3000,
}).click({ force: true });
}
escenario.filtros.forEach((filtro) => {
if (filtro.accion === "click") {
cy.get(filtro.id).should("be.visible").click();
} else {
cy.get(filtro.id).should("be.visible").clear().type(filtro.valor);
}
});
});
Explicación
within()limita la búsqueda al DOM del modal abierto, evitando colisiones con otros elementos.- Si
tieneFiltroestrue, se dispara el elementoonclickque habilita el bloque de filtros dentro del modal (por ejemplomostrarFiltroReportes('fecha')omostrarFiltroNomina('tercero')). - Se recorren los
filtros: si el objeto contieneaccion: "click"se ejecuta unclick(), de lo contrario se limpian y escriben valores con.clear().type(valor).
Generación de los reportes (PDF y XLS)
cy.get("button[value='pdf']").should("be.visible").click();
cy.wait(800);
cy.get("button[value='xls']").should("be.visible").click();
cy.wait(800);
Explicación
- Se localizan los botones de descarga por el atributo
valuey se asegura que estén visibles antes de hacer clic. - Primero se genera el reporte en PDF, luego en XLS, respetando un pequeño intervalo entre descargas (
cy.wait(800))`` para evitar solapamiento de solicitudes.
Cierre del modal y verificación final
cy.get("button[aria-label='Close']")
.should("be.visible")
.click({ force: true });
cy.get(".modal.show").should("not.exist");
Explicación
- Tras generar los reportes, se cierra el modal utilizando el botón de cierre (
aria-label='Close'). - Se verifica que no existan modales con la clase
.show, lo cual confirma que el componente se cerró correctamente y que el flujo terminó sin errores visuales o bloqueos.
Resultados de la ejecución de la prueba
| Escenario | Reporte | Tipo de Filtro | Valores / Acción | Formatos Generados | Estado |
|---|---|---|---|---|---|
| 1 | Cuentas por Cobrar | Fecha | 2025-09-01 → 2025-12-31 | PDF, XLS | PASS |
| 2 | Cuentas por Cobrar | Tercero | Ana Rodriguez | PDF, XLS | PASS |
| 3 | Reportes de Abonos - Cuentas por Cobrar | Fecha | 2025-09-01 → 2025-12-31 | PDF, XLS | PASS |
| 4 | Reportes de Abonos - Cuentas por Cobrar | Tercero | Ana Rodriguez | PDF, XLS | PASS |
| 5 | Reportes de Abonos - Cuentas por Pagar | Fecha | 2025-09-01 → 2025-12-31 | PDF, XLS | PASS |
| 6 | Reportes de Abonos - Cuentas por Pagar | Tercero | Ana Rodriguez | PDF, XLS | PASS |
| 7 | Cuentas por Pagar | Fecha | 2025-09-01 → 2025-12-31 | PDF, XLS | PASS |
| 8 | Cuentas por Pagar | Tercero | Ana Rodriguez | PDF, XLS | PASS |