def test_aperturar_cerrar_boveda(context):
    boveda = context.boveda
    operador = context.operador_remesas

    apertura = Apertura({moneda: 0 for moneda in boveda.monedas_permitidas})
    apertura_action = AperturaOperableAction(context)

    cierre = CierreTotal({moneda: 0 for moneda in boveda.monedas_permitidas})
    cierre_action = CierreOperableAction(context)

    with allure.step("Un usuario ingresa como operador de boveda"):
        LoginAction(context).verify_state().do(
            operador, boveda).success("Apertura Boveda")

    with allure.step(f"Apertura la caja {boveda.codigo} con montos en 0"):
        apertura_action.verify_state(boveda).do(apertura)

    with allure.step("la caja se apertura"):
        apertura_action.success()

    with allure.step("Realiza un cierre total con montos correctos"):
        cierre_action.verify_state(boveda, cierre).do(operador.password)

    with allure.step("La boveda se cierra totalmente"):
        cierre_action.success()

    LogoutAction(context).verify_state(operador).do().success()
def test_aperturar_caja(context):
    caja = context.sucursal.cajas[0]
    cajero = context.cajeros[0]

    apertura = Apertura({moneda: 0 for moneda in caja.monedas_permitidas})
    apertura_action = AperturaOperableAction(context)

    with allure.step("Un usuario ingresa como cajero"):
        LoginAction(context).verify_state().do(cajero,
                                               caja).success("Apertura Caja")

    with allure.step(f"Apertura la caja #{caja.codigo} con montos en 0"):
        apertura_action.verify_state(caja).do(apertura)

    with allure.step("la caja se apertura"):
        apertura_action.success()

    LogoutAction(context).verify_state(cajero).do().success()
def test_aperturar_caja_con_margen(context, diferencia):
    caja = context.sucursal.cajas[0]
    cajero = context.cajeros[0]
    monto_apertura = 100

    apertura1 = Apertura(
        {moneda: monto_apertura
         for moneda in caja.monedas_permitidas})
    apertura_action = AperturaOperableAction(context)

    cierre1 = CierreTotal(
        {moneda: monto_apertura
         for moneda in caja.monedas_permitidas})

    apertura2 = Apertura({
        moneda: monto_apertura + diferencia
        for moneda in caja.monedas_permitidas
    })

    with allure.step("Un usuario ingresa como cajero"):
        LoginAction(context).verify_state().do(cajero,
                                               caja).success("Apertura Caja")

    # Las cajas se crean en 0, Abro y cierro para que tenga 100
    apertura_action.fast_forward(cajero, caja, apertura1, desbloquear=True)
    caja.agregar_operacion(apertura1)

    CierreTotalCajaAction(context).fast_forward(cajero, caja, cierre1)
    caja.agregar_operacion(cierre1)

    with allure.step(
            f"Apertura la caja {caja.codigo} con montos dentro del margen"):
        apertura_action.verify_state(caja).do(apertura2)

    with allure.step("la caja se apertura"):
        apertura_action.success()

    LogoutAction(context).verify_state(cajero).do().success()