Prueba: Reportes – Ventas (Beta)
Objetivo
Validar que el sistema permita generar correctamente los reportes del módulo Ventas, específicamente el Libro de Ventas y el Reporte de Productos Más Vendidos, comprobando que se puedan aplicar los filtros disponibles (por fechas o por registros) y que los archivos en formato PDF y XLS se generen exitosamente, cerrando el modal de forma automática tras su ejecución.
Precondiciones
- Usuario autenticado mediante el comando
cy.login(). - Acceso al dashboard del sistema
(/dashboard).. - Existencia de datos de ventas registrados dentro del rango de fechas o registros configurado.
- Acceso al módulo de Reportes mediante la ruta
/reports - Disponibilidad activa de los botones y modales de reporte definidos en el DOM
Pasos Generales
- Iniciar sesión y acceder al dashboard.
- Entrar al módulo Reportes.
- Confirmar que el tab activo corresponda a Ventas.
- Abrir el modal del reporte a generar (Libro de Ventas o Productos Más Vendidos).
- Aplicar los filtros requeridos (por fecha o registro).
- Generar el reporte en formato PDF.
- Generar el reporte en formato XLS.
- Cerrar el modal y verificar que se haya cerrado correctamente.
Resultado Esperado
- El tab de Ventas debe mostrarse activo al ingresar al módulo.
- Los modales de cada reporte deben abrirse correctamente.
- Los filtros deben poder aplicarse y completarse sin errores de visibilidad.
- Los botones de generación deben permitir descargar ambos formatos (PDF y XLS).
- Tras la generación, el modal debe cerrarse y desaparecer del DOM sin errores.
Explicación Detallada del Código
Visitar Modulo de reportes y Validación del tab activo
Explicación
- Se ingresa automáticamente al módulo Reportes antes de cada caso.
- Se localiza el tab con el identificador
#ventas-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 = [
{
nombre: "Libro de Ventas",
dataTarget: "#generarReporteIngresos",
escenarios: [
{
tipo: "fecha",
tieneFiltro: true,
filtros: [
{ id: "#fecha-inicial", valor: "2025-09-01" },
{ id: "#fecha-final", valor: "2025-12-31" },
],
},
{
tipo: "registro",
tieneFiltro: true,
filtros: [
{ id: "#registro-inicial", valor: "100" },
{ id: "#registro-final", valor: "200" },
],
},
],
},
{
nombre: "Reporte de Productos Más Vendidos",
dataTarget: "#generarReporteProductos",
escenarios: [
{
tipo: "fecha",
tieneFiltro: false,
filtros: [
{ id: "#fecha-inicial-productos", valor: "2025-09-01" },
{ id: "#fecha-final-productos", valor: "2025-12-28" },
],
},
],
},
];
Explicación
- El arreglo reportes define cada conjunto de pruebas con sus escenarios específicos.
| Cada reporte contiene:
nombre: etiqueta descriptiva usada en los títulos de las pruebas.dataTarget: valor del atributo usado para ubicar el botón que abre su modal.escenarios: lista de contextos (por fecha o registro) con los filtros que deben llenarse.
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 localiza y hace clic en el botón cuyo atributo
data-targetcoincide con el identificador del modal a abrir. - El
cy.wait(500)da tiempo a que se renderice la animación del modal antes de interactuar con él. - Se valida la visibilidad del modal mediante la clase
.modal.show, lo que confirma que el formulario está listo para usar.
Aplicación de filtros dentro del modal
cy.get(".modal.show").within(() => {
if (escenario.tieneFiltro) {
cy.get(`[onclick="mostrarFiltro('${escenario.tipo}')"]`, {
timeout: 3000,
}).click({ force: true });
}
escenario.filtros.forEach((filtro) => {
cy.get(filtro.id).should("be.visible").clear().type(filtro.valor);
});
});
Explicación
- Se utiliza
within()para limitar el alcance de las acciones al modal activo. - Si el escenario requiere filtros, se ejecuta el botón con el atributo
onclick="mostrarFiltro(tipo)", el cual habilita los campos correspondientes según el tipo de filtro (fecha o registro). - Luego se recorren los campos definidos en
escenario.filtros, limpiando (.clear()) y escribiendo (.type()) los valores especificados.
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 Ingresados | Formatos Generados | Estado |
|---|---|---|---|---|---|
| 1 | Libro de Ventas | Fecha | 2025-09-01 → 2025-12-31 | PDF, XLS | PASS |
| 2 | Libro de Ventas | Registro | 100 → 200 | PDF, XLS | PASS |
| 3 | Productos Más Vendidos | Fecha | 2025-09-01 → 2025-12-28 | PDF, XLS | PASS |