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

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

    cierre = CierreParcial({moneda: 0 for moneda in caja.monedas_permitidas})
    cierre_action = CierreParcialCajaAction(context)

    login_action = LoginAction(context)
    editar_caja_action = EditarCajaAction(context)

    with allure.step("El usuario cuenta con una caja cerrada parcialmente"):
        apertura_action.fast_forward(cajero, caja, apertura, asignar_operador=True,
                                     redireccionar=False)
        caja.agregar_operacion(apertura)
        cierre_action.fast_forward(cajero, caja, cierre, redirect=False)
        caja.agregar_operacion(cierre)

    with allure.step("el usuario ingresa como administrador"):
        login_action.verify_state().do(context.administrador).success("Dashboard")

    with allure.step("e intenta deshabilita la caja"):
        IrEdicionSucursalAction(context).verify_state().do(context.sucursal).success()
        editar_caja_action.verify_state(caja)
        caja.desactivar()
        editar_caja_action.do(caja)

    with allure.step("pero no puede porque se encuentra cerrada parcialmente"):
        editar_caja_action.failure(caja, "abierta")
def test_deshabilitar_caja_abierta(context):
    driver_cajero = context.driver_manager.main_driver
    caja = context.sucursal.cajas[0]
    cajero = context.cajeros[0]
    editar_caja_action = EditarCajaAction(context)

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

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

    with allure.step("Apertura la caja"):
        apertura_action.fast_forward(cajero, caja, apertura)

    driver_administrador = context.driver_manager.new_driver()
    context.page.set_active_driver(driver_administrador)
    with allure.step("Usuario B ingresa como administrador"):
        LoginAction(context).verify_state().do(context.administrador).success("Dashboard")

    with allure.step("deshabilita la caja"):
        IrEdicionSucursalAction(context).do(context.sucursal).success()
        editar_caja_action.verify_state(caja)
        caja.desactivar()
        editar_caja_action.do(caja)

    with allure.step("pero no puede porque se encuentra abierta por Usuario B"):
        editar_caja_action.failure(caja, "abierta")
        caja.activar()
        GuardarSucursalAction(context).verify_state(context.sucursal)

    logout_action = LogoutAction(context)
    for driver, usuario in [[driver_administrador, context.administrador], [driver_cajero, cajero]]:
        context.page.set_active_driver(driver)
        logout_action.verify_state(usuario).do().success()
def test_deshabilitar_caja_con_saldo(context):
    caja = context.sucursal.cajas[0]
    cajero = context.cajeros[0]

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

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

    editar_caja_action = EditarCajaAction(context)

    with allure.step("El usuario cuenta con una caja con saldo"):
        apertura_action.fast_forward(cajero, caja, apertura, desbloquear=True, asignar_operador=True,
                                     redireccionar=False)
        caja.agregar_operacion(apertura)
        cierre_action.fast_forward(cajero, caja, cierre, redirect=False)
        caja.agregar_operacion(cierre)

    with allure.step("Ingresa como administrador"):
        LoginAction(context).verify_state().do(context.administrador).success("Dashboard")

    with allure.step("Intenta deshabilita la caja"):
        IrEdicionSucursalAction(context).verify_state().do(context.sucursal).success()
        editar_caja_action.verify_state(caja)
        caja.desactivar()
        editar_caja_action.do(caja)

    with allure.step("Pero no puede porque su saldo es mayor a 0"):
        editar_caja_action.failure(caja, "con saldo")
        caja.activar()
        GuardarSucursalAction(context).verify_state(context.sucursal)
        LogoutAction(context).verify_state(context.administrador).do().success()