Prueba: Reportes – Cartera (Beta)
Objetivo
Validar que el sistema permita generar los reportes asociados al módulo de Cartera, aplicando correctamente los filtros (por fecha, por tercero y selección de tipo de abono), y que los archivos en PDF y XLS se generen correctamente
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 Cartera debe estar visible y activable (
#cartera-tab). - Existencia de datos y terceros (por ejemplo: "Ana Rodriguez") para poder filtrar por tercero.
- Los botones/modales deben existir en el DOM
Pasos Generales
- Iniciar sesión y acceder al dashboard.
- Entrar al módulo Reportes.
- Seleccionar el tab Cartera.
- Para cada reporte: abrir modal correspondiente.
- Activar el filtro específico (función
mostrarFiltro...) cuando aplique. - Completar los campos del escenario (fechas, 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 Cartera aparece activo y su contenido cargado.
- Los modales de cada reporte se abren y permiten interacción con filtros y campos.
- 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("#cartera-tab").click();
cy.get("#cartera-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
#cartera-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 = [
// --- Cuentas por Cobrar ---
{
nombre: "Cuentas por Cobrar",
dataTarget: "#generarReporteCuentasPorCobrar",
escenarios: [
{
tipo: "fecha",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroCuentasPorCobrar",
filtros: [
{
id: "#fecha-inicial-cuentas-cxc",
valor: "2025-09-01",
},
{ id: "#fecha-final-cuentas-cxc", valor: "2025-12-31" },
],
},
{
tipo: "tercero",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroCuentasPorCobrar",
filtros: [
{ id: "#tercero_dropdown_cxc", accion: "click" },
{
class: ".tercero-option[data-value='Ana Rodriguez']",
accion: "click",
},
],
},
],
},
// --- Reportes de Abonos ---
{
nombre: "Reportes de Abonos - Cuentas por Cobrar",
dataTarget: "#generarReporteAbonos",
tipoAbono: "cuentas_por_cobrar",
escenarios: [
{
tipo: "fecha",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroAbonos",
filtros: [
{ id: "#fecha-inicial-abonos", valor: "2025-09-01" },
{ id: "#fecha-final-abonos", valor: "2025-12-31" },
],
},
{
tipo: "tercero",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroAbonos",
filtros: [
{ id: "#tercero_dropdown_abonos", accion: "click" },
{
class: ".tercero-option[data-value='Ana Rodriguez']",
accion: "click",
},
],
},
],
},
{
nombre: "Reportes de Abonos - Cuentas por Pagar",
dataTarget: "#generarReporteAbonos",
tipoAbono: "cuentas_por_pagar",
escenarios: [
{
tipo: "fecha",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroAbonos",
filtros: [
{ id: "#fecha-inicial-abonos", valor: "2025-09-01" },
{ id: "#fecha-final-abonos", valor: "2025-12-31" },
],
},
{
tipo: "tercero",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroAbonos",
filtros: [
{ id: "#tercero_dropdown_abonos", accion: "click" },
{
class: ".tercero-option[data-value='Ana Rodriguez']",
accion: "click",
},
],
},
],
},
// --- Cuentas por Pagar ---
{
nombre: "Cuentas por Pagar",
dataTarget: "#generarReporteCuentasPagar",
escenarios: [
{
tipo: "fecha",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroCuentasPorPagar",
filtros: [
{ id: "#fecha-inicial-cuentas", valor: "2025-09-01" },
{ id: "#fecha-final-cuentas", valor: "2025-12-31" },
],
},
{
tipo: "tercero",
tieneFiltro: true,
filtroFuncion: "mostrarFiltroCuentasPorPagar",
filtros: [
{ id: "#tercero_dropdown", accion: "click" },
{
class: ".tercero-option[data-value='Ana Rodriguez']",
accion: "click",
},
],
},
],
},
];
Explicación
- reportes agrupa cada caso (
nombre,dataTarget,escenarios). tipoAbonose usa únicamente para los reportes que comparten modal (#generarReporteAbonos) pero cambian comportamiento según el tipo (cobrar vs pagar).
Apertura del modal y selección de tipo de abono (si aplica)
// Abrir modal
cy.get(`[data-target='${reporte.dataTarget}']`).click();
cy.wait(500);
// Si aplica tipoAbono (solo para modal de abonos)
if (reporte.tipoAbono) {
cy.get(`[onclick="seleccionarTipoAbono('${reporte.tipoAbono}')"]`)
.should("be.visible")
.click();
cy.wait(300);
}
Explicación
- Abrimos el modal correspondiente usando el
data-targetdel botón. cy.wait(500)permite que la animación del modal termine; luego, si el reporte definetipoAbono, se invoca la funciónseleccionarTipoAbono(tipo)que cambia el contexto interno del modal (p. ej. cambia etiquetas o filtros dependientes del tipo).
Habilitar filtro y llenar campos / acciones dentro del modal
cy.get(".modal.show")
.should("be.visible")
.within(() => {
if (escenario.tieneFiltro && escenario.filtroFuncion) {
cy.get(`[onclick="${escenario.filtroFuncion}('${escenario.tipo}')"]`, {
timeout: 3000,
}).click();
}
escenario.filtros.forEach((filtro) => {
if (filtro.accion === "click") {
if (filtro.id) cy.get(filtro.id).click();
if (filtro.class) cy.get(filtro.class).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
tieneFiltroy existefiltroFuncion, se pulsa el control que habilita los inputs específicos según escenario.tipo (por ejemplomostrarFiltroCuentasPorCobrar('tercero')).
| Para cada elemento en filtros:
- Si
accion === "click"se hace clic; utilizable para abrir dropdowns y seleccionar opciones. -
Si no, se asume campo de entrada:
.clear().type(valor)para introducir fechas u otros valores. -
El uso de
filtro.classpermite seleccionar opciones dentro del dropdown por selector de clase/data-attribute (por ejemplo.tercero-option[data-value='Ana Rodriguez']).
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.
Reversión del tipo de abono (solo abonos) y cierre del modal
// Si se inició con tipoAbono, regresar al tipo principal
if (reporte.tipoAbono) {
cy.get(`[onclick="regresarTipoAbono()"]`).click();
cy.wait(300);
}
// Cerrar modal
cy.get("button[aria-label='Close']").click();
cy.get(".modal.show").should("not.exist");
Explicación
- Si el flujo cambió el tipoAbono, se llama a
regresarTipoAbono()para restaurar el estado inicial del modal y evitar efectos colaterales en pruebas posteriores. - Se cierra el modal con el botón accesible (
aria-label='Close') para simular la acción real del usuario. - 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 Ingresados / Acción | Formatos Generados | Estado |
|---|---|---|---|---|---|
| 1 | Reporte Egresos | Fecha | 2025-09-01 → 2025-12-31 | PDF, XLS | PASS |
| 2 | Reporte Egresos | Registro | 010 → 100 | PDF, XLS | PASS |
| 3 | Reporte Costos | Fecha | 2025-09-01 → 2025-12-28 | PDF, XLS | PASS |
| 4 | Reporte Gastos | Fecha | 2025-09-01 → 2025-12-31 | PDF, XLS | PASS |
| 5 | Reporte Nómina | Fecha | 2025-09-01 → 2025-11-30 | PDF, XLS | PASS |
| 6 | Reporte Nómina | Tercero | click (selección de tercero) | PDF, XLS | PASS |