def test_update_transfer(self, event_retrieve_mock, transfer_retrieve_mock): fake_event_created = deepcopy(FAKE_EVENT_TRANSFER_CREATED) fake_event_updated = deepcopy(fake_event_created) fake_event_updated.update({"id": "evt_000000000000000000000000"}) fake_event_updated.update({"type": "transfer.updated"}) fake_event_updated["data"]["object"]["amount"] = 3057 fake_event_updated["data"]["object"]["status"] = "fish" event_retrieve_mock.side_effect = [fake_event_created, fake_event_updated] transfer_retrieve_mock.side_effect = [ fake_event_created["data"]["object"], fake_event_updated["data"]["object"] ] # Create transfer created_event = Event.sync_from_stripe_data(fake_event_created) created_event.invoke_webhook_handlers() # Signal a transfer update updated_event = Event.sync_from_stripe_data(fake_event_updated) updated_event.invoke_webhook_handlers() transfer_instance = Transfer.objects.get(status="fish") self.assertEqual(2, transfer_retrieve_mock.call_count) # Test to string to ensure data was updated self.assertEqual("<amount={amount}, status={status}, stripe_id={stripe_id}>".format( amount=fake_event_updated["data"]["object"]["amount"] / decimal.Decimal("100"), status=fake_event_updated["data"]["object"]["status"], stripe_id=fake_event_updated["data"]["object"]["id"] ), str(transfer_instance))
def test_subscription_schedule_released(self, customer_retrieve_mock, schedule_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_SUBSCRIPTION_SCHEDULE_UPDATED) fake_stripe_event["data"]["object"]["released_at"] = 1605058030 fake_stripe_event["data"]["object"]["status"] = "released" fake_stripe_event["data"]["previous_attributes"] = { "released_at": None, "status": "not_started", } schedule_retrieve_mock.return_value = fake_stripe_event["data"][ "object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() schedule = SubscriptionSchedule.objects.get( id=fake_stripe_event["data"]["object"]["id"]) assert schedule.status == "released" assert schedule.released_at is not None schedule_retrieve_mock.return_value = FAKE_EVENT_SUBSCRIPTION_SCHEDULE_RELEASED[ "data"]["object"] event = Event.sync_from_stripe_data( FAKE_EVENT_SUBSCRIPTION_SCHEDULE_RELEASED) event.invoke_webhook_handlers() schedule.refresh_from_db() assert schedule.status == "released" assert schedule.released_at is not None
def test_process_event_race_condition(self, transfer_retrieve_mock): transfer = Transfer.sync_from_stripe_data(deepcopy(FAKE_TRANSFER)) transfer_retrieve_mock.reset_mock() event_data = deepcopy(FAKE_EVENT_TRANSFER_CREATED) # emulate the race condition in _get_or_create_from_stripe_object where # an object is created by a different request during the call # # Sequence of events: # 1) first Transfer.stripe_objects.get fails with DoesNotExist # (due to it not existing in reality, but due to our side_effect in the test) # 2) object is really created by a different request in reality # 3) Transfer._create_from_stripe_object fails with IntegrityError due to # duplicate id # 4) second Transfer.stripe_objects.get succeeds # (due to being created by step 2 in reality, due to side effect in the test) side_effect = [Transfer.DoesNotExist(), transfer] with patch( "djstripe.models.Transfer.stripe_objects.get", side_effect=side_effect, autospec=True, ) as transfer_objects_get_mock: Event.process(event_data) self.assertEqual(transfer_objects_get_mock.call_count, 2) self.assertEqual(transfer_retrieve_mock.call_count, 1)
def test_process_event_failure_rolls_back(self, invoke_webhook_handlers_mock): """Test that process event rolls back event creation on error """ class HandlerException(Exception): pass invoke_webhook_handlers_mock.side_effect = HandlerException real_create_from_stripe_object = Event._create_from_stripe_object def side_effect(*args, **kwargs): return real_create_from_stripe_object(*args, **kwargs) event_data = deepcopy(FAKE_EVENT_TRANSFER_CREATED) self.assertFalse( Event.objects.filter( id=FAKE_EVENT_TRANSFER_CREATED["id"]).exists()) with self.assertRaises(HandlerException), patch( "djstripe.models.Event._create_from_stripe_object", side_effect=side_effect, autospec=True, ) as create_from_stripe_object_mock: Event.process(data=event_data) create_from_stripe_object_mock.assert_called_once_with(event_data) self.assertFalse( Event.objects.filter( id=FAKE_EVENT_TRANSFER_CREATED["id"]).exists())
def test_update_transfer(self, event_retrieve_mock, transfer_retrieve_mock): fake_event_created = deepcopy(FAKE_EVENT_TRANSFER_CREATED) fake_event_updated = deepcopy(fake_event_created) fake_event_updated.update({"id": "evt_000000000000000000000000"}) fake_event_updated.update({"type": "transfer.updated"}) fake_event_updated["data"]["object"]["amount"] = 3057 fake_event_updated["data"]["object"]["status"] = "fish" event_retrieve_mock.side_effect = [fake_event_created, fake_event_updated] transfer_retrieve_mock.side_effect = [ fake_event_created["data"]["object"], fake_event_updated["data"]["object"] ] # Create transfer created_event = Event.sync_from_stripe_data(fake_event_created) created_event.validate() created_event.process() # Signal a transfer update updated_event = Event.sync_from_stripe_data(fake_event_updated) updated_event.validate() updated_event.process() transfer_instance = Transfer.objects.get(status="fish") self.assertEqual(2, transfer_retrieve_mock.call_count) # Test to string to ensure data was updated self.assertEquals("<amount={amount}, status={status}, stripe_id={stripe_id}>".format( amount=fake_event_updated["data"]["object"]["amount"] / decimal.Decimal("100"), status=fake_event_updated["data"]["object"]["status"], stripe_id=fake_event_updated["data"]["object"]["id"] ), str(transfer_instance))
def test_invoice_created(self, event_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, default_account_mock): default_account_mock.return_value = Account.objects.create() user = get_user_model().objects.create_user(username="******", email="*****@*****.**") FAKE_CUSTOMER.create_for_user(user) fake_stripe_event = deepcopy(FAKE_EVENT_INVOICE_CREATED) event_retrieve_mock.return_value = fake_stripe_event invoice_retrieve_mock.return_value = fake_stripe_event["data"][ "object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.validate() event.process() invoice = Invoice.objects.get( stripe_id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual( invoice.amount_due, fake_stripe_event["data"]["object"]["amount_due"] / decimal.Decimal("100")) self.assertEqual(invoice.paid, fake_stripe_event["data"]["object"]["paid"])
def test_process_event_exists(self, mock_objects, mock__create_from_stripe_object, mock_atomic): """Test that process event returns the existing event and skips webhook processing when the event already exists. """ # Set up mocks mock_objects.filter.return_value.exists.return_value = True mock_data = {"id": "foo_id", "other_stuff": "more_things"} result = Event.process(data=mock_data) # Make sure that the db was queried and the existing results used. mock_objects.filter.assert_called_once_with(id=mock_data["id"]) mock_objects.filter.return_value.exists.assert_called_once_with() mock_objects.filter.return_value.first.assert_called_once_with() # Make sure the webhook actions and event object creation were not performed. mock_atomic.return_value.__enter__.assert_not_called() # Using assert_not_called() doesn't work on this in Python 3.5 self.assertEqual(mock__create_from_stripe_object.call_count, 0) mock__create_from_stripe_object.return_value.invoke_webhook_handlers.assert_not_called( ) # Make sure the existing event was returned. self.assertEqual(mock_objects.filter.return_value.first.return_value, result)
def test_invoiceitem_created( self, product_retrieve_mock, event_retrieve_mock, invoiceitem_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, subscription_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = default_account() user = get_user_model().objects.create_user( username="******", email="*****@*****.**" ) FAKE_CUSTOMER_II.create_for_user(user) fake_stripe_event = deepcopy(FAKE_EVENT_INVOICEITEM_CREATED) event_retrieve_mock.return_value = fake_stripe_event invoiceitem_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() invoiceitem = InvoiceItem.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual( invoiceitem.amount, fake_stripe_event["data"]["object"]["amount"] / decimal.Decimal("100"), )
def test_account_deauthorized_event(self, event_retrieve_mock): fake_stripe_event = deepcopy( FAKE_EVENT_ACCOUNT_APPLICATION_DEAUTHORIZED) event = Event.sync_from_stripe_data(fake_stripe_event) event.validate() event.process()
def test_handle_event_payment_succeeded(self, invoice_retrieve_mock, sync_invoice_mock): fake_event = Event(kind="invoice.payment_succeeded", validated_message={"data": {"object": {"id": "lock"}}}) invoice_webhook_handler(fake_event, fake_event.message["data"], "invoice", "payment_failed") invoice_retrieve_mock.assert_called_once_with("lock") sync_invoice_mock.assert_called_once_with("key", send_receipt=True)
def test_charge_created( self, subscription_retrieve_mock, product_retrieve_mock, invoice_retrieve_mock, event_retrieve_mock, paymentmethod_card_retrieve_mock, payment_intent_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, account_mock, ): FAKE_CUSTOMER.create_for_user(self.user) fake_stripe_event = deepcopy(FAKE_EVENT_CHARGE_SUCCEEDED) event_retrieve_mock.return_value = fake_stripe_event charge_retrieve_mock.return_value = fake_stripe_event["data"]["object"] account_mock.return_value = default_account() event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() charge = Charge.objects.get( id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual( charge.amount, fake_stripe_event["data"]["object"]["amount"] / decimal.Decimal("100"), ) self.assertEqual(charge.status, fake_stripe_event["data"]["object"]["status"])
def test_invoice_created_no_existing_customer( self, product_retrieve_mock, paymentmethod_card_retrieve_mock, event_retrieve_mock, invoice_retrieve_mock, payment_intent_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = default_account() fake_stripe_event = deepcopy(FAKE_EVENT_INVOICE_CREATED) event_retrieve_mock.return_value = fake_stripe_event invoice_retrieve_mock.return_value = fake_stripe_event["data"][ "object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() self.assertEqual(Customer.objects.count(), 1) customer = Customer.objects.get() self.assertEqual(customer.subscriber, None)
def test_invoiceitem_created( self, product_retrieve_mock, event_retrieve_mock, invoiceitem_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, subscription_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = default_account() user = get_user_model().objects.create_user(username="******", email="*****@*****.**") FAKE_CUSTOMER_II.create_for_user(user) fake_stripe_event = deepcopy(FAKE_EVENT_INVOICEITEM_CREATED) event_retrieve_mock.return_value = fake_stripe_event invoiceitem_retrieve_mock.return_value = fake_stripe_event["data"][ "object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() invoiceitem = InvoiceItem.objects.get( id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual( invoiceitem.amount, fake_stripe_event["data"]["object"]["amount"] / decimal.Decimal("100"), )
def test_plan_updated_request_object(self, event_retrieve_mock, plan_retrieve_mock): plan_retrieve_mock.return_value = FAKE_EVENT_PLAN_REQUEST_IS_OBJECT["data"]["object"] event = Event.sync_from_stripe_data(FAKE_EVENT_PLAN_REQUEST_IS_OBJECT) event.invoke_webhook_handlers() plan = Plan.objects.get(id=FAKE_EVENT_PLAN_REQUEST_IS_OBJECT["data"]["object"]["id"]) self.assertEqual(plan.name, FAKE_EVENT_PLAN_REQUEST_IS_OBJECT["data"]["object"]["name"])
def test_customer_discount_created(self, event_retrieve_mock, coupon_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_DISCOUNT_CREATED) event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() self.assertIsNotNone(event.customer) self.assertEqual(event.customer.id, FAKE_CUSTOMER["id"]) self.assertIsNotNone(event.customer.coupon)
def test_plan_created(self, event_retrieve_mock, plan_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_PLAN_CREATED) event_retrieve_mock.return_value = fake_stripe_event plan_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() plan = Plan.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual(plan.name, fake_stripe_event["data"]["object"]["name"])
def test_transfer_created(self, event_retrieve_mock, transfer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_TRANSFER_CREATED) event_retrieve_mock.return_value = fake_stripe_event transfer_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() transfer = Transfer.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual(transfer.amount, fake_stripe_event["data"]["object"]["amount"] / decimal.Decimal("100"))
def test_customer_bogus_event_type(self, event_retrieve_mock, customer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_CREATED) fake_stripe_event["data"]["object"]["customer"] = fake_stripe_event["data"]["object"]["id"] fake_stripe_event["type"] = "customer.praised" event_retrieve_mock.return_value = fake_stripe_event customer_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers()
def test_customer_created(self, event_retrieve_mock, customer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_CREATED) event_retrieve_mock.return_value = fake_stripe_event event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() customer = Customer.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual(customer.account_balance, fake_stripe_event["data"]["object"]["account_balance"]) self.assertEqual(customer.currency, fake_stripe_event["data"]["object"]["currency"])
def _create_event(self, event_data, event_retrieve_mock, patch_data=None): event_data = deepcopy(event_data) if patch_data: event_data.update(patch_data) event_retrieve_mock.return_value = event_data event = Event.sync_from_stripe_data(event_data) return event
def test_customer_created_no_customer_exists(self, event_retrieve_mock, customer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_CREATED) event_retrieve_mock.return_value = fake_stripe_event customer_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.validate() event.process() self.assertFalse(Customer.objects.filter(stripe_id=fake_stripe_event["data"]["object"]["id"]).exists())
def test_customer_discount_created(self, event_retrieve_mock, coupon_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_DISCOUNT_CREATED) event = Event.sync_from_stripe_data(fake_stripe_event) event.validate() event.process() self.assertTrue(event.processed) self.assertIsNotNone(event.customer) self.assertEqual(event.customer.stripe_id, FAKE_CUSTOMER["id"]) self.assertIsNotNone(event.customer.coupon)
def test_customer_card_created(self, event_retrieve_mock, customer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_SOURCE_CREATED) event_retrieve_mock.return_value = fake_stripe_event event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() card = Card.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertIn(card, self.customer.legacy_cards.all()) self.assertEqual(card.brand, fake_stripe_event["data"]["object"]["brand"]) self.assertEqual(card.last4, fake_stripe_event["data"]["object"]["last4"])
def test_customer_subscription_created(self, event_retrieve_mock, subscription_retrieve_mock, plan_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_SUBSCRIPTION_CREATED) event_retrieve_mock.return_value = fake_stripe_event event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() subscription = Subscription.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertIn(subscription, self.customer.subscriptions.all()) self.assertEqual(subscription.status, fake_stripe_event["data"]["object"]["status"]) self.assertEqual(subscription.quantity, fake_stripe_event["data"]["object"]["quantity"])
def test_plan_created( self, product_retrieve_mock, event_retrieve_mock, plan_retrieve_mock ): fake_stripe_event = deepcopy(FAKE_EVENT_PLAN_CREATED) event_retrieve_mock.return_value = fake_stripe_event plan_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() plan = Plan.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual(plan.nickname, fake_stripe_event["data"]["object"]["nickname"])
def test_customer_bogus_event_type(self, event_retrieve_mock, customer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_CREATED) fake_stripe_event["data"]["object"]["customer"] = fake_stripe_event["data"][ "object" ]["id"] fake_stripe_event["type"] = "customer.praised" event_retrieve_mock.return_value = fake_stripe_event customer_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers()
def test_customer_unknown_source_created(self, event_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_SOURCE_CREATED) fake_stripe_event["data"]["object"]["object"] = "unknown" fake_stripe_event["data"]["object"]["id"] = "card_xxx_test_customer_unk_source_created" event_retrieve_mock.return_value = fake_stripe_event FAKE_CUSTOMER.create_for_user(self.user) event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() self.assertFalse(Card.objects.filter(id=fake_stripe_event["data"]["object"]["id"]).exists())
def test_plan_updated_request_object( self, product_retrieve_mock, event_retrieve_mock, plan_retrieve_mock ): plan_retrieve_mock.return_value = FAKE_EVENT_PLAN_REQUEST_IS_OBJECT["data"]["object"] event = Event.sync_from_stripe_data(FAKE_EVENT_PLAN_REQUEST_IS_OBJECT) event.invoke_webhook_handlers() plan = Plan.objects.get(id=FAKE_EVENT_PLAN_REQUEST_IS_OBJECT["data"]["object"]["id"]) self.assertEqual( plan.nickname, FAKE_EVENT_PLAN_REQUEST_IS_OBJECT["data"]["object"]["nickname"] )
def test_handle_event_fake(self, invoice_retrieve_mock, sync_invoice_mock): fake_event = Event(kind="fake", message={"data": { "object": { "id": "door" } }}) Invoice.handle_event(fake_event) self.assertFalse(invoice_retrieve_mock.called) self.assertFalse(sync_invoice_mock.called)
def test_customer_created(self, event_retrieve_mock, customer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_CREATED) event_retrieve_mock.return_value = fake_stripe_event event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() customer = Customer.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual( customer.account_balance, fake_stripe_event["data"]["object"]["account_balance"] ) self.assertEqual(customer.currency, fake_stripe_event["data"]["object"]["currency"])
def test_price_created(self, product_retrieve_mock, event_retrieve_mock, price_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_PRICE_CREATED) event_retrieve_mock.return_value = fake_stripe_event price_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() price = Price.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual(price.nickname, fake_stripe_event["data"]["object"]["nickname"])
def test_transfer_created(self, event_retrieve_mock, transfer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_TRANSFER_CREATED) event_retrieve_mock.return_value = fake_stripe_event transfer_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.validate() event.process() transfer = Transfer.objects.get(stripe_id=fake_stripe_event["data"]["object"]["id"]) self.assertEquals(transfer.amount, fake_stripe_event["data"]["object"]["amount"] / decimal.Decimal("100")) self.assertEquals(transfer.status, fake_stripe_event["data"]["object"]["status"])
def test_transfer_created(self, event_retrieve_mock, transfer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_TRANSFER_CREATED) event_retrieve_mock.return_value = fake_stripe_event transfer_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() transfer = Transfer.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual( transfer.amount, fake_stripe_event["data"]["object"]["amount"] / decimal.Decimal("100"), )
def test_customer_unknown_source_created(self, event_retrieve_mock, customer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_SOURCE_CREATED) fake_stripe_event["data"]["object"]["object"] = "unknown" event_retrieve_mock.return_value = fake_stripe_event Customer.objects.create(subscriber=self.user, stripe_id=FAKE_CUSTOMER["id"], livemode=False) event = Event.sync_from_stripe_data(fake_stripe_event) event.validate() event.process() self.assertFalse(Card.objects.filter(stripe_id=fake_stripe_event["data"]["object"]["id"]).exists())
def test_subscription_schedule_created(self, customer_retrieve_mock, schedule_retrieve_mock): event = Event.sync_from_stripe_data( FAKE_EVENT_SUBSCRIPTION_SCHEDULE_CREATED) event.invoke_webhook_handlers() schedule = SubscriptionSchedule.objects.get( id=FAKE_EVENT_SUBSCRIPTION_SCHEDULE_CREATED["data"]["object"] ["id"]) assert (schedule.id == FAKE_EVENT_SUBSCRIPTION_SCHEDULE_CREATED["data"] ["object"]["id"]) assert schedule.status == "not_started"
def test_handle_event_payment_failed(self, invoice_retrieve_mock, sync_invoice_mock): fake_event = Event( kind="invoice.payment_failed", validated_message={"data": { "object": { "id": "door" } }}) Invoice.handle_event(fake_event) invoice_retrieve_mock.assert_called_once_with("door") sync_invoice_mock.assert_called_once_with("lock", send_receipt=True)
def test_customer_created(self, event_retrieve_mock, customer_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_CREATED) event_retrieve_mock.return_value = fake_stripe_event customer_retrieve_mock.return_value = fake_stripe_event["data"]["object"] Customer.objects.create(subscriber=self.user, stripe_id=FAKE_CUSTOMER["id"], livemode=False) event = Event.sync_from_stripe_data(fake_stripe_event) event.validate() event.process() customer = Customer.objects.get(stripe_id=fake_stripe_event["data"]["object"]["id"]) self.assertEquals(customer.account_balance, fake_stripe_event["data"]["object"]["account_balance"]) self.assertEquals(customer.currency, fake_stripe_event["data"]["object"]["currency"])
def test_customer_unknown_source_created(self, event_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_SOURCE_CREATED) fake_stripe_event["data"]["object"]["object"] = "unknown" fake_stripe_event["data"]["object"][ "id" ] = "card_xxx_test_customer_unk_source_created" event_retrieve_mock.return_value = fake_stripe_event FAKE_CUSTOMER.create_for_user(self.user) event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() self.assertFalse( Card.objects.filter(id=fake_stripe_event["data"]["object"]["id"]).exists() )
def test_customer_subscription_created( self, event_retrieve_mock, product_retrieve_mock, subscription_retrieve_mock, plan_retrieve_mock, ): fake_stripe_event = deepcopy(FAKE_EVENT_CUSTOMER_SUBSCRIPTION_CREATED) event_retrieve_mock.return_value = fake_stripe_event event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() subscription = Subscription.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertIn(subscription, self.customer.subscriptions.all()) self.assertEqual(subscription.status, fake_stripe_event["data"]["object"]["status"]) self.assertEqual( subscription.quantity, fake_stripe_event["data"]["object"]["quantity"] )
def test_invoice_created_no_existing_customer( self, product_retrieve_mock, event_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = default_account() fake_stripe_event = deepcopy(FAKE_EVENT_INVOICE_CREATED) event_retrieve_mock.return_value = fake_stripe_event invoice_retrieve_mock.return_value = fake_stripe_event["data"]["object"] event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() self.assertEqual(Customer.objects.count(), 1) customer = Customer.objects.get() self.assertEqual(customer.subscriber, None)
def test_charge_created( self, subscription_retrieve_mock, product_retrieve_mock, invoice_retrieve_mock, event_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, account_mock, ): FAKE_CUSTOMER.create_for_user(self.user) fake_stripe_event = deepcopy(FAKE_EVENT_CHARGE_SUCCEEDED) event_retrieve_mock.return_value = fake_stripe_event charge_retrieve_mock.return_value = fake_stripe_event["data"]["object"] account_mock.return_value = default_account() event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() charge = Charge.objects.get(id=fake_stripe_event["data"]["object"]["id"]) self.assertEqual( charge.amount, fake_stripe_event["data"]["object"]["amount"] / decimal.Decimal("100") ) self.assertEqual(charge.status, fake_stripe_event["data"]["object"]["status"])
def test_dispute_created(self, event_retrieve_mock, dispute_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_DISPUTE_CREATED) event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers() dispute = Dispute.objects.get() self.assertEqual(dispute.id, FAKE_DISPUTE["id"])
def _create_event(self, event_data, event_retrieve_mock): event_data = deepcopy(event_data) event_retrieve_mock.return_value = event_data event = Event.sync_from_stripe_data(event_data) return event
def test_account_deauthorized_event(self, event_retrieve_mock): fake_stripe_event = deepcopy(FAKE_EVENT_ACCOUNT_APPLICATION_DEAUTHORIZED) event = Event.sync_from_stripe_data(fake_stripe_event) event.invoke_webhook_handlers()