def test_sync_from_stripe_data_no_customer( self, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock): default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.pop("customer", None) # remove invoice since it requires a customer fake_charge_copy.pop("invoice", None) Charge.sync_from_stripe_data(fake_charge_copy) assert Charge.objects.count() == 1 charge = Charge.objects.get() assert charge.customer is None charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_not_called() self.assert_fks( charge, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.customer", "djstripe.Charge.dispute", "djstripe.Charge.invoice", "djstripe.Charge.transfer", "djstripe.Customer.coupon", "djstripe.Plan.product", }, )
def test_sync_from_stripe_data_no_customer( self, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock ): from djstripe.settings import STRIPE_SECRET_KEY default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.pop("customer", None) # remove invoice since it requires a customer fake_charge_copy.pop("invoice", None) Charge.sync_from_stripe_data(fake_charge_copy) assert Charge.objects.count() == 1 charge = Charge.objects.get() assert charge.customer is None charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION["id"] ) self.assert_fks( charge, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.customer", "djstripe.Charge.dispute", "djstripe.Charge.invoice", "djstripe.Charge.transfer", "djstripe.Customer.coupon", "djstripe.Plan.product", }, )
def test_sync_from_stripe_data_no_customer(self, default_account_mock): default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.pop("customer", None) Charge.sync_from_stripe_data(fake_charge_copy) assert Charge.objects.count() == 1 charge = Charge.objects.get() assert charge.customer is None
def test_sync_from_stripe_data_no_customer( self, paymentmethod_card_retrieve_mock, payment_intent_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): from djstripe.settings import STRIPE_SECRET_KEY default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.pop("customer", None) # remove invoice since it requires a customer fake_charge_copy.pop("invoice", None) fake_payment_intent = deepcopy(FAKE_PAYMENT_INTENT_I) fake_payment_intent["invoice"] = None payment_intent_retrieve_mock.return_value = fake_payment_intent Charge.sync_from_stripe_data(fake_charge_copy) assert Charge.objects.count() == 1 charge = Charge.objects.get() assert charge.customer is None charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION["id"], stripe_account=None, ) self.assert_fks( charge, expected_blank_fks=self.default_expected_blank_fks | { "djstripe.Account.branding_logo", "djstripe.Account.branding_icon", "djstripe.Charge.customer", "djstripe.Charge.latest_invoice (related name)", "djstripe.Charge.invoice", "djstripe.PaymentIntent.invoice (related name)", "djstripe.Plan.product", }, )
def test_max_size_large_charge_on_decimal_amount( self, subscription_retrieve_mock, product_retrieve_mock, plan_retrieve_mock, paymentmethod_card_retrieve_mock, payment_intent_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): """ By contacting stripe support, some accounts will have their limit raised to 11 digits """ amount = 99999999999 assert len(str(amount)) == 11 fake_transaction = deepcopy(FAKE_BALANCE_TRANSACTION) fake_transaction.update({"amount": amount}) default_account_mock.return_value = self.account balance_transaction_retrieve_mock.return_value = fake_transaction fake_charge = deepcopy(FAKE_CHARGE) fake_charge.update({"amount": amount}) charge = Charge.sync_from_stripe_data(fake_charge) charge_retrieve_mock.assert_not_called() self.assertTrue(bool(charge.pk)) self.assertEqual(charge.amount, Decimal("999999999.99")) self.assertEqual(charge.balance_transaction.amount, 99999999999)
def test_sync_from_stripe_data_max_amount( self, default_account_mock, subscription_retrieve_mock, product_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, ): default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) # https://support.stripe.com/questions/what-is-the-maximum-amount-i-can-charge-with-stripe fake_charge_copy.update({"amount": 99999999}) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual(Decimal("999999.99"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(False, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual(0, charge.amount_refunded) charge_retrieve_mock.assert_not_called() self.assert_fks( charge, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", }, )
def test_sync_from_stripe_data_refunded( self, subscription_retrieve_mock, product_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): from djstripe.settings import STRIPE_SECRET_KEY default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE_REFUNDED) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual(Decimal("20"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(True, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual( "Payment for invoice {}".format(charge.invoice.number), charge.description ) self.assertEqual(charge.amount, charge.amount_refunded) charge_retrieve_mock.assert_not_called() # We expect two calls - for charge and then for charge.refunds balance_transaction_retrieve_mock.assert_has_calls( [ call(api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION["id"]), call( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION_REFUND["id"] ), ] ) refunds = list(charge.refunds.all()) self.assertEqual(len(refunds), 1) refund = refunds[0] self.assertEqual(refund.id, FAKE_REFUND["id"]) self.assertNotEqual(charge.balance_transaction.id, refund.balance_transaction.id) self.assertEqual(charge.balance_transaction.id, FAKE_BALANCE_TRANSACTION["id"]) self.assertEqual(refund.balance_transaction.id, FAKE_BALANCE_TRANSACTION_REFUND["id"]) self.assert_fks( charge, expected_blank_fks={ "djstripe.Account.branding_logo", "djstripe.Account.branding_icon", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", }, )
def sync_charges(apps, schema_editor): # This is okay, since we're only doing a forward migration. from djstripe.models import Charge from djstripe.context_managers import stripe_temporary_api_version with stripe_temporary_api_version("2016-03-07"): if Charge.objects.count(): print("syncing charges. This may take a while.") for charge in tqdm(Charge.objects.all(), desc="Sync", unit=" charges"): try: Charge.sync_from_stripe_data(charge.api_retrieve()) except InvalidRequestError: tqdm.write("There was an error while syncing charge ({charge_id}).".format(charge_id=charge.stripe_id)) print("Charge sync complete.")
def test_sync_from_stripe_data_refunded( self, subscription_retrieve_mock, product_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): from djstripe.settings import STRIPE_SECRET_KEY default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE_REFUNDED) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual(Decimal("22"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(True, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual("VideoDoc consultation for ivanp0001 berkp0001", charge.description) self.assertEqual(charge.amount, charge.amount_refunded) charge_retrieve_mock.assert_not_called() # We expect two calls - for charge and then for charge.refunds balance_transaction_retrieve_mock.assert_has_calls( [ call(api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION["id"]), call( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION_REFUND["id"] ), ] ) refunds = list(charge.refunds.all()) self.assertEqual(len(refunds), 1) refund = refunds[0] self.assertEqual(refund.id, FAKE_REFUND["id"]) self.assertNotEqual(charge.balance_transaction.id, refund.balance_transaction.id) self.assertEqual(charge.balance_transaction.id, FAKE_BALANCE_TRANSACTION["id"]) self.assertEqual(refund.balance_transaction.id, FAKE_BALANCE_TRANSACTION_REFUND["id"]) self.assert_fks( charge, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", }, )
def test_sync_from_stripe_data_unsupported_source(self, default_account_mock): default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.update({"source": {"id": "test_id", "object": "unsupported"}}) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual("test_id", charge.source_id) self.assertEqual("unsupported", charge.source.type) self.assertEqual(charge.source, PaymentMethod.objects.get(id="test_id"))
def test_sync_from_stripe_data_unsupported_source(self, default_account_mock): default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.update({"source": {"id": "test_id", "object": "unsupported"}}) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual("test_id", charge.source_stripe_id) self.assertEqual("unsupported", charge.source_type) self.assertEqual(charge.source, PaymentMethod.objects.get(id="test_id"))
def test_sync_from_stripe_data_refunded( self, subscription_retrieve_mock, product_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): from djstripe.settings import STRIPE_SECRET_KEY default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE_REFUNDED) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual(Decimal("22"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(True, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual("VideoDoc consultation for ivanp0001 berkp0001", charge.description) self.assertEqual(charge.amount, charge.amount_refunded) charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION_REFUND["id"]) refunds = list(charge.refunds.all()) self.assertEqual(len(refunds), 1) refund = refunds[0] self.assertEqual(refund.id, FAKE_REFUND["id"]) self.assertNotEqual(charge.balance_transaction.id, refund.balance_transaction.id) self.assertEqual(charge.balance_transaction.id, FAKE_BALANCE_TRANSACTION["id"]) self.assertEqual(refund.balance_transaction.id, FAKE_BALANCE_TRANSACTION_REFUND["id"]) self.assert_fks( charge, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", }, )
def test_sync_from_stripe_data( self, subscription_retrieve_mock, product_retrieve_mock, plan_retrieve_mock, paymentmethod_card_retrieve_mock, payment_intent_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): from djstripe.settings import STRIPE_SECRET_KEY default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.update({"application_fee": {"amount": 0}}) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual(Decimal("20"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(False, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual("Invoice {}".format(FAKE_INVOICE["number"]), charge.description) self.assertEqual(0, charge.amount_refunded) self.assertEqual(self.customer.default_source.id, charge.source_id) self.assertEqual(charge.source.type, LegacySourceType.card) self.assertGreater(len(charge.receipt_url), 1) self.assertTrue(charge.payment_method_details["type"]) charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION["id"], stripe_account=None, ) self.assert_fks( charge, expected_blank_fks=self.default_expected_blank_fks | { "djstripe.Account.branding_logo", "djstripe.Account.branding_icon" }, )
def test_sync_from_stripe_data(self): charge = Charge.sync_from_stripe_data(FAKE_CHARGE) self.assertEqual(self.invoice, charge.invoice) self.assertEqual("9999", charge.card_last_4) self.assertEqual("Visa", charge.card_kind) self.assertEqual(Decimal("9.95"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(False, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(Decimal("0"), charge.fee) self.assertEqual(False, charge.disputed) self.assertEqual("test_description", charge.description) self.assertEqual(None, charge.amount_refunded)
def test_sync_from_stripe_data_max_amount(self, default_account_mock): default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) # https://support.stripe.com/questions/what-is-the-maximum-amount-i-can-charge-with-stripe fake_charge_copy.update({"amount": 99999999}) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual(Decimal("999999.99"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(False, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual(0, charge.amount_refunded)
def test_sync_from_stripe_data_unsupported_source( self, paymentmethod_card_retrieve_mock, payment_intent_retrieve_mock, invoice_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): from djstripe.settings import STRIPE_SECRET_KEY default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.update( {"source": { "id": "test_id", "object": "unsupported" }}) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual("test_id", charge.source_id) self.assertEqual("unsupported", charge.source.type) self.assertEqual(charge.source, DjstripePaymentMethod.objects.get(id="test_id")) charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION["id"], stripe_account=None, ) self.assert_fks( charge, expected_blank_fks=self.default_expected_blank_fks | { "djstripe.Account.branding_logo", "djstripe.Account.branding_icon" }, )
def test_sync_from_stripe_data(self, default_account_mock): default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.update({"application_fee": {"amount": 0}}) charge = Charge.sync_from_stripe_data(FAKE_CHARGE) self.assertEqual(Decimal("22"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(False, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual("VideoDoc consultation for ivanp0001 berkp0001", charge.description) self.assertEqual(0, charge.amount_refunded) self.assertEqual("card_16YKQh2eZvKYlo2Cblc5Feoo", charge.source_id) self.assertEqual(charge.source.type, LegacySourceType.card)
def test_sync_from_stripe_data(self, default_account_mock): default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.update({"application_fee": {"amount": 0}}) charge = Charge.sync_from_stripe_data(FAKE_CHARGE) self.assertEqual(Decimal("22"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(False, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual("VideoDoc consultation for ivanp0001 berkp0001", charge.description) self.assertEqual(0, charge.amount_refunded) self.assertEqual("card_16YKQh2eZvKYlo2Cblc5Feoo", charge.source_stripe_id) self.assertEqual(charge.source_type, LegacySourceType.card)
def test_sync_from_stripe_data( self, subscription_retrieve_mock, product_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): from djstripe.settings import STRIPE_SECRET_KEY default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.update({"application_fee": {"amount": 0}}) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual(Decimal("22"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(False, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual("VideoDoc consultation for ivanp0001 berkp0001", charge.description) self.assertEqual(0, charge.amount_refunded) self.assertEqual("card_16YKQh2eZvKYlo2Cblc5Feoo", charge.source_id) self.assertEqual(charge.source.type, LegacySourceType.card) charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION["id"] ) self.assert_fks( charge, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", }, )
def test_sync_from_stripe_data_unsupported_source( self, invoice_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.update( {"source": { "id": "test_id", "object": "unsupported" }}) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual("test_id", charge.source_id) self.assertEqual("unsupported", charge.source.type) self.assertEqual(charge.source, DjstripePaymentMethod.objects.get(id="test_id")) # alias to old model name should work the same self.assertEqual(charge.source, PaymentMethod.objects.get(id="test_id")) charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_not_called() self.assert_fks( charge, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", }, )
def test_sync_from_stripe_data_unsupported_source( self, invoice_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): from djstripe.settings import STRIPE_SECRET_KEY default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) fake_charge_copy.update({"source": {"id": "test_id", "object": "unsupported"}}) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual("test_id", charge.source_id) self.assertEqual("unsupported", charge.source.type) self.assertEqual(charge.source, DjstripePaymentMethod.objects.get(id="test_id")) # alias to old model name should work the same self.assertEqual(charge.source, PaymentMethod.objects.get(id="test_id")) charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION["id"] ) self.assert_fks( charge, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", }, )
def test_sync_from_stripe_data_refunded( self, subscription_retrieve_mock, product_retrieve_mock, paymentmethod_card_retrieve_mock, payment_intent_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE_REFUNDED) charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual(Decimal("20"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(True, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual("Subscription creation", charge.description) self.assertEqual(charge.amount, charge.amount_refunded) charge_retrieve_mock.assert_not_called() # We expect two calls - for charge and then for charge.refunds balance_transaction_retrieve_mock.assert_has_calls([ call( api_key=djstripe_settings.STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION["id"], stripe_account=None, ), call( api_key=djstripe_settings.STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION_REFUND["id"], stripe_account=None, ), ]) refunds = list(charge.refunds.all()) self.assertEqual(len(refunds), 1) refund = refunds[0] self.assertEqual(refund.id, FAKE_REFUND["id"]) self.assertNotEqual(charge.balance_transaction.id, refund.balance_transaction.id) self.assertEqual(charge.balance_transaction.id, FAKE_BALANCE_TRANSACTION["id"]) self.assertEqual(refund.balance_transaction.id, FAKE_BALANCE_TRANSACTION_REFUND["id"]) self.assert_fks( charge, expected_blank_fks=self.default_expected_blank_fks | { "djstripe.Account.branding_logo", "djstripe.Account.branding_icon" }, )
def test_sync_from_stripe_data_refunded_on_update( self, subscription_retrieve_mock, product_retrieve_mock, paymentmethod_card_retrieve_mock, payment_intent_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, default_account_mock, ): # first sync charge (as per test_sync_from_stripe_data) # then sync refunded version, to hit the update code-path instead of insert default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) with patch( "stripe.BalanceTransaction.retrieve", return_value=deepcopy(FAKE_BALANCE_TRANSACTION), ): charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual(Decimal("20"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(False, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual(len(charge.refunds.all()), 0) fake_charge_refunded_copy = deepcopy(FAKE_CHARGE_REFUNDED) with patch( "stripe.BalanceTransaction.retrieve", return_value=deepcopy(FAKE_BALANCE_TRANSACTION_REFUND), ) as balance_transaction_retrieve_mock: charge_refunded = Charge.sync_from_stripe_data( fake_charge_refunded_copy) self.assertEqual(charge.id, charge_refunded.id) self.assertEqual(Decimal("20"), charge_refunded.amount) self.assertEqual(True, charge_refunded.paid) self.assertEqual(True, charge_refunded.refunded) self.assertEqual(True, charge_refunded.captured) self.assertEqual(False, charge_refunded.disputed) self.assertEqual("Subscription creation", charge_refunded.description) self.assertEqual(charge_refunded.amount, charge_refunded.amount_refunded) charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_called_once_with( api_key=djstripe_settings.STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION_REFUND["id"], stripe_account=None, ) refunds = list(charge_refunded.refunds.all()) self.assertEqual(len(refunds), 1) refund = refunds[0] self.assertEqual(refund.id, FAKE_REFUND["id"]) self.assertNotEqual(charge_refunded.balance_transaction.id, refund.balance_transaction.id) self.assertEqual(charge_refunded.balance_transaction.id, FAKE_BALANCE_TRANSACTION["id"]) self.assertEqual(refund.balance_transaction.id, FAKE_BALANCE_TRANSACTION_REFUND["id"]) self.assert_fks( charge_refunded, expected_blank_fks=self.default_expected_blank_fks | { "djstripe.Account.branding_logo", "djstripe.Account.branding_icon" }, )
def test_sync_from_stripe_data_refunded_on_update( self, subscription_retrieve_mock, product_retrieve_mock, invoice_retrieve_mock, charge_retrieve_mock, default_account_mock, ): # first sync charge (as per test_sync_from_stripe_data) then sync refunded version, # to hit the update code-path instead of insert from djstripe.settings import STRIPE_SECRET_KEY default_account_mock.return_value = self.account fake_charge_copy = deepcopy(FAKE_CHARGE) with patch( "stripe.BalanceTransaction.retrieve", return_value=deepcopy(FAKE_BALANCE_TRANSACTION) ): charge = Charge.sync_from_stripe_data(fake_charge_copy) self.assertEqual(Decimal("22"), charge.amount) self.assertEqual(True, charge.paid) self.assertEqual(False, charge.refunded) self.assertEqual(True, charge.captured) self.assertEqual(False, charge.disputed) self.assertEqual(len(charge.refunds.all()), 0) fake_charge_refunded_copy = deepcopy(FAKE_CHARGE_REFUNDED) with patch( "stripe.BalanceTransaction.retrieve", return_value=deepcopy(FAKE_BALANCE_TRANSACTION_REFUND), ) as balance_transaction_retrieve_mock: charge_refunded = Charge.sync_from_stripe_data(fake_charge_refunded_copy) self.assertEqual(charge.id, charge_refunded.id) self.assertEqual(Decimal("22"), charge_refunded.amount) self.assertEqual(True, charge_refunded.paid) self.assertEqual(True, charge_refunded.refunded) self.assertEqual(True, charge_refunded.captured) self.assertEqual(False, charge_refunded.disputed) self.assertEqual( "VideoDoc consultation for ivanp0001 berkp0001", charge_refunded.description ) self.assertEqual(charge_refunded.amount, charge_refunded.amount_refunded) charge_retrieve_mock.assert_not_called() balance_transaction_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_BALANCE_TRANSACTION_REFUND["id"] ) refunds = list(charge_refunded.refunds.all()) self.assertEqual(len(refunds), 1) refund = refunds[0] self.assertEqual(refund.id, FAKE_REFUND["id"]) self.assertNotEqual( charge_refunded.balance_transaction.id, refund.balance_transaction.id ) self.assertEqual( charge_refunded.balance_transaction.id, FAKE_BALANCE_TRANSACTION["id"] ) self.assertEqual(refund.balance_transaction.id, FAKE_BALANCE_TRANSACTION_REFUND["id"]) self.assert_fks( charge_refunded, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", }, )