Prueba: Edición de Ingresos
Objetivo
Validar que el sistema permita editar correctamente distintos tipos de ingresos (contado, crédito y otros), asegurando que las modificaciones se guarden exitosamente y que el flujo funcione sin errores.
Precondiciones
- Usuario autenticado mediante
cy.login(). - Acceso al dashboard del sistema (
/dashboard). - Existencia de ingresos previamente registrados de tipo:
- Venta de contado
- Venta a crédito
- Otros ingresos
- Tercero de prueba: Ana Rodriguez.
- Producto de prueba: SH229 creado en la plataforma.
Escenarios Cubiertos
Venta de contado
- Contado - Efectivo, IVA 19%.
- Contado - Efectivo, IVA 5%.
- Contado - Transferencia Nequi, con descuento e IVA 0%.
- Contado - Tarjeta Débito, IVA no aplica.
Venta a crédito
- Crédito - Efectivo, plazo 15 días, IVA 19%.
- Crédito - Nequi, IVA 5%, descuento 5%, plazo 30 días.
- Crédito - Efectivo, IVA 0%, plazo 30 días.
- Crédito - Bancolombia, IVA no aplica, plazo 15 días.
Otros ingresos
- Servicio técnico, IVA 19%.
- Consultoría, IVA 5%.
- Venta de activo, IVA 0%.
- Servicio interno, IVA no aplica.
Pasos Generales
- Acceder al módulo Ingresos.
- Abrir el modal de edición en el primer ingreso disponible.
- Determinar automáticamente el tipo de ingreso actual (contado, crédito u otros).
- Editar los campos según el tipo de ingreso:
- ampos comunes (tercero, medio de pago, descripción, cantidad, descuento, IVA).
- Campos específicos (producto o concepto, vencimiento, tipo de transferencia, precio).
- Guardar los cambios.
- Validar que el modal se cierre sin errores.
Resultado Esperado
- El sistema debe permitir editar y guardar cambios en ingresos ya registrados.
- El modal debe cerrarse automáticamente tras guardar.
- No deben presentarse errores en consola ni bloqueos en el flujo.
Explicación del Código por Bloques
Definición de Escenarios
const escenarios = {
contado: [
{
tipoEsperado: "Venta de contado",
medioPago: "Efectivo",
descripcion: "Contado - Efectivo, sin descuento, IVA 19%",
cantidad: "1",
descuento: "0",
iva: "19%",
codigoProducto: "SH229",
},
{
tipoEsperado: "Venta de contado",
medioPago: "Efectivo",
descripcion: "Contado - Efectivo, sin descuento, IVA 5%",
cantidad: "2",
descuento: "0",
iva: "5%",
codigoProducto: "SH229",
},
{
tipoEsperado: "Venta de contado",
medioPago: "Transferencia",
tipoTransferencia: "Nequi",
descripcion: "Contado - Transferencia Nequi, con descuento, IVA 0%",
cantidad: "3",
descuento: "5",
iva: "0",
codigoProducto: "SH229",
},
{
tipoEsperado: "Venta de contado",
medioPago: "Tarjeta Debito",
descripcion: "Contado - Tarjeta Debito, IVA no aplica",
cantidad: "1",
descuento: "0",
iva: "no_aplica",
codigoProducto: "SH229",
},
],
credito: [
{
tipoEsperado: "Venta a credito",
medioPago: "Efectivo",
descripcion: "Crédito - Efectivo, plazo 15, IVA 19%",
cantidad: "2",
descuento: "0",
iva: "19",
vencimiento: "15",
codigoProducto: "SH229",
},
{
tipoEsperado: "Venta a credito",
medioPago: "Transferencia",
tipoTransferencia: "Nequi",
descripcion: "Crédito - Nequi, IVA 5%, descuento 5%",
cantidad: "1",
descuento: "5",
iva: "5",
vencimiento: "30",
codigoProducto: "SH229",
},
{
tipoEsperado: "Venta a credito",
medioPago: "Efectivo",
descripcion: "Crédito - Efectivo, plazo 30, IVA 0%",
cantidad: "3",
descuento: "0",
iva: "0",
vencimiento: "30",
codigoProducto: "SH229",
},
{
tipoEsperado: "Venta a credito",
medioPago: "Transferencia",
tipoTransferencia: "Bancolombia",
descripcion: "Crédito - Transferencia, IVA no aplica, descuento 0%",
cantidad: "1",
descuento: "0",
iva: "no_aplica",
vencimiento: "15",
codigoProducto: "SH229",
},
],
otros: [
{
tipoEsperado: "Otros ingresos",
medioPago: "Efectivo",
concepto: "Servicio técnico",
descripcion: "Otros - Servicio técnico, IVA 19%",
precio: "1000",
cantidad: "1",
descuento: "0",
iva: "19%",
},
{
tipoEsperado: "Otros ingresos",
medioPago: "Efectivo",
concepto: "Consultoría",
descripcion: "Otros - Consultoría, IVA 5%",
precio: "1200",
cantidad: "1",
descuento: "0",
iva: "5%",
},
{
tipoEsperado: "Otros ingresos",
medioPago: "Transferencia",
tipoTransferencia: "Bancolombia",
concepto: "Venta de activo",
descripcion: "Otros - Venta de activo, IVA 0%",
precio: "1500",
cantidad: "1",
descuento: "0",
iva: "0",
},
{
tipoEsperado: "Otros ingresos",
medioPago: "Transferencia",
tipoTransferencia: "Daviplata",
concepto: "Servicio interno",
descripcion: "Otros - Servicio interno, IVA no aplica",
precio: "800",
cantidad: "1",
descuento: "0",
iva: "no_aplica",
},
],
};
Explicacion:
- Se agrupan los escenarios por tipo de ingreso (contado, credito, otros).
| Cada escenario define los campos necesarios:
tipoEsperado: tipo actual del ingreso a editarmedioPago,tipoTransferencia,vencimiento: condiciones específicas del flujo.descripcion,cantidad,iva,descuento: datos que se modifican durante la prueba.codigoProductooconcepto: identificadores del producto o concepto del ingreso.
Función
completarCampos(escenario, tipoActual)
const completarCampos = (escenario, tipoActual) => {
// Campos comunes
cy.get(".custom-select-container").first().click();
cy.get(".custom-select-options")
.contains("li.custom-select-option", tercero)
.click({ force: true });
cy.get(".custom-select-input").first().should("contain.text", tercero);
cy.get("select#medio_pago_edit").first().select(escenario.medioPago);
if (escenario.medioPago === "Transferencia") {
cy.get("select#tipo_transferencia_edit")
.first()
.select(escenario.tipoTransferencia);
}
cy.get("input.descripcion-input-edit")
.first()
.clear()
.type(escenario.descripcion);
cy.get("input.cantidad-input-edit").first().clear().type(escenario.cantidad);
cy.get("input.descuento-input-edit")
.first()
.clear()
.type(escenario.descuento);
cy.get("select.iva-select").first().select(escenario.iva);
// Campos específicos
if (tipoActual === "Venta de contado" || tipoActual === "Venta a credito") {
cy.get(".custom-select-container").eq(1).click();
cy.get(".custom-select-options")
.contains("li.custom-select-option", escenario.codigoProducto)
.click();
if (tipoActual === "Venta a credito") {
cy.get("select#vencimiento_edit")
.first()
.select(escenario.vencimiento || "0");
}
} else if (tipoActual === "Otros ingresos") {
cy.get("input.concepto-input").first().clear().type(escenario.concepto);
cy.get("input.precio-input-edit").first().clear().type(escenario.precio);
}
};
Explicacion:
- Permite rellenar todos los campos del modal en función del tipo de ingreso detectado.
| Campos comunes:
- Tercero, medio de pago, descripción, cantidad, descuento, IVA.
| Campos específicos:
- Para contado o crédito → selecciona producto (
codigoProducto). - Si es crédito → selecciona vencimiento.
- Para “otros ingresos” → rellena concepto y precio.
- Implementa condicionales que garantizan que solo se editen los campos válidos para cada tipo de ingreso.
Función
editarIngreso(escenario)
const editarIngreso = (escenario) => {
cy.visit("/ingresos");
cy.get('button[title="Editar ingreso"]').first().click();
cy.get("div.modal-dialog:visible", { timeout: 10000 })
.first()
.should("exist")
.within(() => {
cy.get("select#tipo_venta_edit")
.first()
.invoke("val")
.then((tipoActual) => {
if (tipoActual !== escenario.tipoEsperado) {
cy.get('button[type="button"].close').click();
return;
}
cy.get("select#tipo_venta_edit").first().select(tipoActual);
completarCampos(escenario, tipoActual);
cy.get('button[type="submit"].btn.btn-primary').first().click();
cy.get("div.modal-dialog:visible", {
timeout: 10000,
}).should("not.exist");
});
});
};
Explicacion:
- Abre el primer ingreso disponible para edición.
- Detecta automáticamente el tipo actual de ingreso (
tipoActual). - Si el ingreso no coincide con el tipo esperado del escenario, se omite la edición (se cierra el modal).
- Llama a
completarCampos(...)para llenar la información según el tipo. - Finalmente guarda los cambios y valida el cierre correcto del modal.
Generación dinámica de pruebas
const generarTests = (tipo, lista) => {
context(tipo, () => {
lista.forEach((escenario) => {
it(`Editar ingreso: ${escenario.descripcion}`, () => {
editarIngreso(escenario);
});
});
});
};
generarTests("Venta de contado", escenarios.contado);
generarTests("Venta a crédito", escenarios.credito);
generarTests("Otros ingresos", escenarios.otros);
Explicacion:
- La función
generarTests()permite crear automáticamente un bloque de pruebas (context) para cada tipo de ingreso - Dentro de cada bloque, se genera un
it(...)independiente para cada escenario.
Resultados de la ejecución de la prueba
| Tipo de Ingreso | Escenario | Medio de Pago | Transferencia | Vencimiento | IVA | Descuento | Estado |
|---|---|---|---|---|---|---|---|
| Contado | Efectivo IVA 19% | Efectivo | - | - | 19% | 0% | PASS |
| Contado | Nequi IVA 0% | Transferencia | Nequi | - | 0% | 5% | PASS |
| Crédito | Efectivo 15 días | Efectivo | - | 15 | 19% | 0% | PASS |
| Crédito | Bancolombia 15 días | Transferencia | Bancolombia | 15 | No aplica | 0% | PASS |
| Otros | Consultoría | Efectivo | - | - | 5% | 0% | PASS |
| Otros | Servicio interno | Transferencia | Daviplata | - | No aplica | 0% | PASS |