def test_aperturar_caja_con_bloqueo_multimoneda(context):
    caja = context.sucursal.cajas[0]
    cajero = context.cajeros[0]

    apertura = Apertura(dict(zip(caja.monedas_permitidas, [0, 100])))
    bloqueo = Bloqueo(caja,
                      cajero,
                      "Apertura",
                      logico=caja.balance(),
                      reales=apertura.montos,
                      diferencia=apertura.montos)
    desbloqueo_action = DesbloquearCajaAction(context)
    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 una moneda correcta y otra no"
    ):
        apertura_action.verify_state(caja).do(apertura,
                                              deberia_bloquearse=True)

    with allure.step("la caja se bloquea"):
        apertura_action.failure()
        LogoutAction(context).verify_state(cajero).do().success()

    with allure.step(
            "El area de operaciones puede ver correctamente la razon de bloqueo y desbloquear la caja"
    ):
        desbloqueo_action.fast_forward(context.operaciones, bloqueo,
                                       "Desbloqueo de prueba")
def test_aperturar_caja_con_bloqueo(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})
    apertura2 = Apertura({
        moneda: monto_apertura + diferencia
        for moneda in caja.monedas_permitidas
    })
    apertura_action = AperturaOperableAction(context)

    bloqueo = Bloqueo(
        caja,
        cajero,
        "Apertura",
        logico=apertura1.montos,
        reales=apertura2.montos,
        diferencia={moneda: diferencia
                    for moneda in caja.monedas_permitidas})
    desbloqueo_action = DesbloquearCajaAction(context)

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

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

    # Abro y cierro la caja para inyectarle balance
    apertura_action.fast_forward(cajero, caja, apertura1, desbloquear=True)
    caja.agregar_operacion(apertura1)

    cierre_action.fast_forward(cajero, caja, cierre1)
    caja.agregar_operacion(cierre1)

    with allure.step(f"Apertura la caja {caja.codigo} con montos incorrectos"):
        apertura_action.verify_state(caja).do(apertura2,
                                              deberia_bloquearse=True)

    with allure.step("la caja se bloquea"):
        apertura_action.failure()
        LogoutAction(context).verify_state(cajero).do().success()

    with allure.step(
            "El area de operaciones puede ver correctamente la razon de bloqueo y desbloquear la caja"
    ):
        desbloqueo_action.fast_forward(context.operaciones, bloqueo,
                                       "Desbloqueo de prueba")