def test_unsuccessful_charge(facade: PaymentsFacade, inserted_payment: dict,
                             connection: Connection, event_bus: Mock) -> None:
    payment_uuid = uuid.UUID(inserted_payment["uuid"])

    with patch.object(ApiConsumer, "charge",
                      side_effect=PaymentFailedError) as charge_mock:
        facade.charge(payment_uuid, inserted_payment["customer_id"], "token")

    charge_mock.assert_called_once_with(
        get_dollars(inserted_payment["amount"] / 100), "token")
    assert get_payment(
        connection,
        inserted_payment["uuid"]).status == PaymentStatus.FAILED.value
    event_bus.post.assert_called_once_with(
        PaymentFailed(payment_uuid, inserted_payment["customer_id"]))
def test_successful_charge_updates_status(facade: PaymentsFacade,
                                          inserted_payment: dict,
                                          connection: Connection,
                                          event_bus: Mock) -> None:
    payment_uuid = uuid.UUID(inserted_payment["uuid"])
    charge_id = "SOME_CHARGE_ID"

    with patch.object(ApiConsumer, "charge",
                      return_value=charge_id) as charge_mock:
        facade.charge(uuid.UUID(inserted_payment["uuid"]),
                      inserted_payment["customer_id"], "token")

    charge_mock.assert_called_once_with(
        get_dollars(inserted_payment["amount"] / 100), "token")
    payment_row = get_payment(connection, inserted_payment["uuid"])
    assert payment_row.status == PaymentStatus.CHARGED.value
    assert payment_row.charge_id == charge_id
    event_bus.post.assert_called_once_with(
        PaymentCharged(payment_uuid, inserted_payment["customer_id"]))