Skip to content

Prueba: Reportes – Inventario (Beta)

Objetivo

Validar que el sistema permita generar correctamente los diferentes reportes del módulo Inventario, asegurando que los filtros de fecha y producto funcionen correctamente y que los archivos se descarguen en los formatos disponibles (PDF y 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
  • Existencia de productos previamente registrados en el sistema.

Pasos Generales

  1. Iniciar sesión y acceder al dashboard.
  2. Entrar al módulo Reportes.
  3. Seleccionar el tab Inventario.
  4. Seleccionar el tipo de reporte a generar.
  5. Completar los filtros requeridos (fechas o producto).
  6. Generar en PDF y luego en XLS.
  7. Cerrar el modal y verificar que haya desaparecido del DOM.

Resultado Esperado

  • El tab Inventario 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.show en el DOM al finalizar cada flujo.

Explicación Detallada del Código

Visitar Modulo de reportes

cy.visit("/reports");
cy.get("#inventario-tab").click();

Explicación

  • Se ingresa automáticamente al módulo Reportes antes de cada caso.
  • Se localiza el tab con el identificador #inventario-tab
  • La condición have.class('active') asegura que el sistema esté mostrando el contenido del módulo Ventas.

Validación del tab activo

it("Debe estar en el tab de Inventario", () => {
  cy.get("#inventario-tab").should("have.class", "active");
});

Explicación

  • Este it funciona como comprobación de guardia: asegura que la pestaña Inventario está activa antes de ejecutar la generación de reportes.

Definición de los reportes y escenarios de prueba

const reportes = [
  {
    nombre: "Movimiento General",
    dataTarget: "#generarReporteMovimientoGeneral",
    escenarios: [
      {
        tipo: "fecha",
        inicial: "#fecha-inicial-inventario",
        final: "#fecha-final-inventario",
        valores: { inicio: "2025-09-01", fin: "2025-12-31" },
        botones: ["pdf", "xls"],
      },
    ],
  },
  {
    nombre: "Valoración Inventario",
    dataTarget: "#generarReporteValoracion",
    escenarios: [
      {
        tipo: "fecha",
        inicial: "#fecha-inicial-valoracion",
        final: "#fecha-final-valoracion",
        valores: { inicio: "2025-09-01", fin: "2025-12-31" },
        botones: ["pdf", "xls"],
      },
    ],
  },

  {
    nombre: "Movimientos Detallados",
    dataTarget: "#generarReporteMovimientosDetallados",
    escenarios: [
      {
        tipo: "producto",
        search: "#producto_search_movimientos",
        dropdown: "#producto_dropdown_movimientos",
        valorBusqueda: "SH229",
      },
      {
        tipo: "fecha",
        inicial: "#fecha-inicial-movimientos",
        final: "#fecha-final-movimientos",
        valores: { inicio: "2025-09-01", fin: "2025-12-31" },
        botones: ["pdf"],
      },
    ],
  },
];

Explicación

| Cada objeto dentro del array reportes define:

  • nombre: título del reporte.
  • dataTarget: atributo del botón que abre el modal correspondiente.
  • escenarios: lista de tipos de filtros que se probarán dentro del modal.

| Dentro de cada escenario:

  • tipo: indica si es por fecha o producto.
  • inicial / final: IDs de los campos de fecha.
  • valores: fechas de inicio y fin del rango.
  • botones: formatos a generar (pdf, xls).
  • Para producto: incluye input de búsqueda, dropdown y valor esperado.

Apertura del modal

cy.get(`[data-target="${reporte.dataTarget}"]`).click({ force: true });

Explicación

  • Abre el modal del reporte correspondiente.
  • force: true se utiliza en caso de que el botón esté cubierto por algún elemento visual (por ejemplo, overlays o animaciones).

Escenario de filtro: seleccionar producto

cy.get(escenario.search)
  .should("be.visible")
  .click()
  .clear()
  .type(escenario.valorBusqueda, { delay: 100 });

cy.get(escenario.dropdown, { timeout: 8000 })
  .should("exist")
  .and("be.visible")
  .within(() => {
    cy.contains(".producto-code", escenario.valorBusqueda)
      .should("exist")
      .and("be.visible")
      .click({ force: true });
  });

cy.get(escenario.search)
  .invoke("val")
  .should("contain", escenario.valorBusqueda);

Explicación

  • Se busca el producto SH229 en el campo de búsqueda.
  • cy.contains(".producto-code", valor) localiza el producto por texto visible dentro del dropdown.`
  • Luego se valida que el campo de búsqueda contenga el valor seleccionado, asegurando que el producto fue correctamente aplicado al filtro.

Escenario de filtro: seleccionar fechas

cy.get(escenario.inicial)
  .clear()
  .type(escenario.valores.inicio, { force: true });
cy.get(escenario.final).clear().type(escenario.valores.fin, { force: true });

Explicación

  • Llena los campos de fecha inicial y final.
  • force: true garantiza que el campo reciba el valor aunque esté temporalmente fuera de foco o cubierto por una animación.

Generación de archivos PDF/XLS

if (escenario.botones?.length) {
  escenario.botones.forEach((tipo) => {
    cy.get(`.modal.show button[value="${tipo}"]`).first().click();
  });
}

Explicación

  • Recorre todos los formatos definidos en botones.
  • Cada uno se ejecuta secuencialmente dentro del modal activo (.modal.show).
  • .first() evita posibles duplicados si hay botones repetidos en el DOM.

Cierre del modal

cy.get('.modal.show [aria-label="Close"]').last().click();

Explicación

  • Simula el cierre del modal mediante el botón de cierre visible.
  • .last() se usa para garantizar que se cierre el modal activo en caso de múltiples modales abiertos.

Resultados de la ejecución de la prueba

Reporte Escenario Filtro aplicado Archivos generados Resultado esperado
Movimiento General Fecha 2025-09-01 → 2025-12-31 PDF, XLS PASS
Valoración Inventario Fecha 2025-09-01 → 2025-12-31 PDF, XLS PASS
Movimientos Detallados Producto Código SH229 PASS
Movimientos Detallados Fecha 2025-09-01 → 2025-12-31 PDF PASS