def test_adding_new_payment_is_reflected_on_pending_payments_list( facade: PaymentsFacade, connection: Connection, event_bus: Mock) -> None: customer_id = 1 assert facade.get_pending_payments(customer_id) == [] payment_uuid = uuid.uuid4() amount = get_dollars("15.00") description = "Example" # with patch.object(event_bus, "post") as post_mock: facade.start_new_payment(payment_uuid, customer_id, amount, description) (row, ) = connection.execute(payments.select()).fetchall() assert dict(row) == { "uuid": str(payment_uuid), "customer_id": customer_id, "amount": int(amount.amount * 100), "currency": amount.currency.iso_code, "status": PaymentStatus.NEW.value, "description": description, "charge_id": None, } pending_payments = facade.get_pending_payments(customer_id) assert pending_payments == [ PaymentDto(payment_uuid, amount, description, PaymentStatus.NEW.value) ] event_bus.post.assert_called_once_with( PaymentStarted(payment_uuid, customer_id))
def test_capture(facade: PaymentsFacade, inserted_payment: dict, connection: Connection, event_bus: Mock) -> None: payment_uuid = uuid.UUID(inserted_payment["uuid"]) with patch.object(ApiConsumer, "capture") as capture_mock: facade.capture(payment_uuid, inserted_payment["customer_id"]) capture_mock.assert_called_once_with(inserted_payment["charge_id"]) assert get_payment( connection, inserted_payment["uuid"]).status == PaymentStatus.CAPTURED.value event_bus.post.assert_called_once_with( PaymentCaptured(payment_uuid, inserted_payment["customer_id"]))
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"]))
def facade(connection: Connection, event_bus: Mock) -> PaymentsFacade: return PaymentsFacade(PaymentsConfig("", ""), connection, event_bus)
def test_pending_payments_returns_only_new_payments( facade: PaymentsFacade, inserted_payment: dict, connection: Connection) -> None: assert facade.get_pending_payments(inserted_payment["customer_id"]) == []
def facade(self, config: PaymentsConfig, connection: Connection, event_bus: EventBus) -> PaymentsFacade: return PaymentsFacade(config, connection, event_bus)