Beispiel #1
0
    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",
            },
        )
Beispiel #2
0
	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",
			},
		)
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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",
            },
        )
Beispiel #6
0
    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)
Beispiel #7
0
	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",
			},
		)
Beispiel #8
0
	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.")
Beispiel #10
0
	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",
			},
		)
Beispiel #11
0
    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"))
Beispiel #12
0
    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"))
Beispiel #13
0
    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",
            },
        )
Beispiel #14
0
    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"
            },
        )
Beispiel #15
0
    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)
Beispiel #16
0
    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)
Beispiel #17
0
    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)
Beispiel #18
0
    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)
Beispiel #19
0
    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"
            },
        )
Beispiel #20
0
    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)
Beispiel #21
0
    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)
Beispiel #22
0
	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",
			},
		)
Beispiel #23
0
    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",
            },
        )
Beispiel #24
0
	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",
			},
		)
Beispiel #25
0
    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"
            },
        )
Beispiel #26
0
    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"
            },
        )
Beispiel #27
0
	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",
			},
		)