def test_sync_with_subscription( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({"subscription": FAKE_SUBSCRIPTION_III["id"]}) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) expected_blank_fks = { "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", "djstripe.Customer.subscriber", "djstripe.Plan.product", "djstripe.InvoiceItem.plan", } self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks) # Coverage of sync of existing data invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks) invoice_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_INVOICE_II["id"])
def test_sync_with_subscription( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({"subscription": FAKE_SUBSCRIPTION_III["id"]}) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) expected_blank_fks = self.default_expected_blank_fks | { "djstripe.InvoiceItem.plan" } self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks) # Coverage of sync of existing data invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks) invoice_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_INVOICE_II["id"])
def test_sync_with_subscription( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({"subscription": FAKE_SUBSCRIPTION_III["id"]}) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) expected_blank_fks = { "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", "djstripe.Customer.subscriber", "djstripe.InvoiceItem.plan", } self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks) # Coverage of sync of existing data invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks) invoice_retrieve_mock.assert_called_once_with( api_key=STRIPE_SECRET_KEY, expand=[], id=FAKE_INVOICE_II["id"] )
def test_sync_expanded_invoice_with_subscription( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) # Expand the Invoice data invoiceitem_data.update({ "subscription": FAKE_SUBSCRIPTION_III["id"], "invoice": deepcopy(dict(FAKE_INVOICE_II)), }) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) expected_blank_fks = self.default_expected_blank_fks | { "djstripe.InvoiceItem.plan" } self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks) # Coverage of sync of existing data invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks)
def test_sync_with_subscription( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, paymentintent_retrieve_mock, paymentmethod_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): fake_payment_intent = deepcopy(FAKE_PAYMENT_INTENT_II) fake_payment_intent["invoice"] = FAKE_INVOICE_II["id"] paymentintent_retrieve_mock.return_value = fake_payment_intent fake_subscription = deepcopy(FAKE_SUBSCRIPTION_III) fake_subscription["latest_invoice"] = FAKE_INVOICE_II["id"] subscription_retrieve_mock.return_value = fake_subscription fake_customer = deepcopy(FAKE_CUSTOMER_II) customer_retrieve_mock.return_value = fake_customer fake_card = deepcopy(FAKE_CARD_II) fake_card["customer"] = None # create Card for FAKE_CUSTOMER_III Card.sync_from_stripe_data(fake_card) default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({"subscription": fake_subscription["id"]}) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) expected_blank_fks = self.default_expected_blank_fks | { "djstripe.InvoiceItem.plan", "djstripe.InvoiceItem.price", } expected_blank_fks.difference_update({ "djstripe.PaymentIntent.invoice (related name)", "djstripe.Invoice.payment_intent", }) self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks) # Coverage of sync of existing data invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks) invoice_retrieve_mock.assert_called_once_with( api_key=djstripe_settings.STRIPE_SECRET_KEY, expand=[], id=FAKE_INVOICE_II["id"], stripe_account=None, )
def test_str( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data["plan"] = FAKE_PLAN_II invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual( invoiceitem.get_stripe_dashboard_url(), invoiceitem.invoice.get_stripe_dashboard_url(), ) self.assertEqual(str(invoiceitem), FAKE_PRODUCT["name"]) invoiceitem.plan = None self.assertEqual( str(invoiceitem), "<amount=20, date=2015-08-08 11:26:56+00:00, id=ii_16XVTY2eZvKYlo2Cxz5n3RaS>", )
def test_sync_null_invoice( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, plan_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update( {"proration": True, "plan": FAKE_PLAN_II["id"], "invoice": None} ) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(FAKE_PLAN_II["id"], invoiceitem.plan.id) self.assert_fks( invoiceitem, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", "djstripe.Customer.subscriber", "djstripe.InvoiceItem.invoice", "djstripe.InvoiceItem.subscription", }, )
def test_str( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data["plan"] = FAKE_PLAN_II invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual( invoiceitem.get_stripe_dashboard_url(), invoiceitem.invoice.get_stripe_dashboard_url(), ) self.assertEqual(str(invoiceitem), FAKE_PRODUCT["name"]) invoiceitem.plan = None self.assertEqual( str(invoiceitem), "<amount=20, date=2015-08-08 11:26:56+00:00, " "id=ii_16XVTY2eZvKYlo2Cxz5n3RaS>", )
def test_sync_with_subscription( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({"subscription": FAKE_SUBSCRIPTION_III["id"]}) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assert_fks( invoiceitem, expected_blank_fks={ "djstripe.Account.business_logo", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", "djstripe.Customer.subscriber", "djstripe.Plan.product", "djstripe.InvoiceItem.plan", }, )
def test_sync_proration( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, plan_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({ "proration": True, "plan": FAKE_PLAN_II["id"] }) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(FAKE_PLAN_II["id"], invoiceitem.plan.id) self.assert_fks( invoiceitem, expected_blank_fks={ "djstripe.Account.branding_logo", "djstripe.Account.branding_icon", "djstripe.Charge.dispute", "djstripe.Charge.transfer", "djstripe.Customer.coupon", "djstripe.Customer.subscriber", "djstripe.InvoiceItem.subscription", }, )
def test_sync_null_invoice( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, plan_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({ "proration": True, "plan": FAKE_PLAN_II["id"], "invoice": None }) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(FAKE_PLAN_II["id"], invoiceitem.plan.id) self.assert_fks( invoiceitem, expected_blank_fks=self.default_expected_blank_fks | { "djstripe.InvoiceItem.invoice", "djstripe.InvoiceItem.subscription" }, )
def resync_invoiceitems(apps, schema_editor): """ Since invoiceitem IDs were not previously stored (the ``stripe_id`` field held the id of the linked subsription), a direct migration will leave us with a bunch of orphaned objects. It was decided [here](https://github.com/kavdev/dj-stripe/issues/162) that a purge and re-sync would be the best option for subscriptions. That's being extended to InvoiceItems. No data that is currently available on stripe will be deleted. Anything stored locally will be purged. """ # This is okay, since we're only doing a forward migration. from djstripe.models import InvoiceItem from djstripe.context_managers import stripe_temporary_api_version with stripe_temporary_api_version("2016-03-07"): if InvoiceItem.objects.count(): print("Purging invoiceitems. Don't worry, all invoiceitems will be re-synced from stripe. Just in case you \ didn't get the memo, we'll print out a json representation of each object for your records:") print(serializers.serialize("json", InvoiceItem.objects.all())) InvoiceItem.objects.all().delete() print("Re-syncing invoiceitems. This may take a while.") for stripe_invoiceitem in tqdm(iterable=InvoiceItem.api_list(), desc="Sync", unit=" invoiceitems"): invoice = InvoiceItem.sync_from_stripe_data(stripe_invoiceitem) if not invoice.customer: tqdm.write("The customer for this invoiceitem ({invoiceitem_id}) does not exist \ locally (so we won't sync the invoiceitem). You'll want to figure out how that \ happened.".format(invoiceitem_id=stripe_invoiceitem['id'])) print("InvoiceItem re-sync complete.")
def test_sync_with_subscription(self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, default_account_mock): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({"subscription": FAKE_SUBSCRIPTION_III["id"]}) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(FAKE_SUBSCRIPTION_III["id"], invoiceitem.subscription.stripe_id)
def test_sync_proration(self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, plan_retrieve_mock, default_account_mock): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({"proration": True, "plan": FAKE_PLAN_II["id"]}) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(FAKE_PLAN_II["id"], invoiceitem.plan.stripe_id)
def test_sync_proration(self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, plan_retrieve_mock, default_account_mock): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({"proration": True, "plan": FAKE_PLAN_II["id"]}) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(FAKE_PLAN_II["id"], invoiceitem.plan.id)
def test_sync_with_subscription(self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, default_account_mock): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({"subscription": FAKE_SUBSCRIPTION_III["id"]}) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(FAKE_SUBSCRIPTION_III["id"], invoiceitem.subscription.id)
def test_sync_proration( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, paymentintent_retrieve_mock, paymentmethod_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, plan_retrieve_mock, price_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): fake_payment_intent = deepcopy(FAKE_PAYMENT_INTENT_II) fake_payment_intent["invoice"] = FAKE_INVOICE_II["id"] paymentintent_retrieve_mock.return_value = fake_payment_intent fake_subscription = deepcopy(FAKE_SUBSCRIPTION_III) fake_subscription["latest_invoice"] = FAKE_INVOICE_II["id"] subscription_retrieve_mock.return_value = fake_subscription fake_card = deepcopy(FAKE_CARD_II) fake_card["customer"] = None # create Card for FAKE_CUSTOMER_III Card.sync_from_stripe_data(fake_card) # create invoice Invoice.sync_from_stripe_data(deepcopy(FAKE_INVOICE_II)) default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data.update({ "proration": True, "plan": FAKE_PLAN_II["id"], "price": FAKE_PRICE_II["id"], }) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(FAKE_PLAN_II["id"], invoiceitem.plan.id) self.assertEqual(FAKE_PRICE_II["id"], invoiceitem.price.id) expected_blank_fks = self.default_expected_blank_fks | { "djstripe.InvoiceItem.subscription" } expected_blank_fks.difference_update({ "djstripe.PaymentIntent.invoice (related name)", "djstripe.Invoice.payment_intent", }) self.assert_fks( invoiceitem, expected_blank_fks=expected_blank_fks, )
def test_sync_expanded_invoice_with_subscription( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) # Expand the Invoice data invoiceitem_data.update( { "subscription": FAKE_SUBSCRIPTION_III["id"], "invoice": deepcopy(dict(FAKE_INVOICE_II)), } ) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) expected_blank_fks = { "djstripe.Account.branding_logo", "djstripe.Account.branding_icon", "djstripe.Charge.dispute", "djstripe.Charge.payment_intent", "djstripe.Charge.transfer", "djstripe.Customer.coupon", "djstripe.Customer.subscriber", "djstripe.InvoiceItem.plan", "djstripe.Invoice.payment_intent", "djstripe.Subscription.pending_setup_intent", } self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks) # Coverage of sync of existing data invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assert_fks(invoiceitem, expected_blank_fks=expected_blank_fks)
def test_str(self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, default_account_mock): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(invoiceitem.get_stripe_dashboard_url(), invoiceitem.invoice.get_stripe_dashboard_url()) self.assertEqual(str(invoiceitem), "<amount={amount}, date={date}, stripe_id={stripe_id}>".format( amount=invoiceitem.amount, date=invoiceitem.date, stripe_id=invoiceitem_data["id"] ))
def test___str__( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, paymentintent_retrieve_mock, paymentmethod_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, plan_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): fake_subscription = deepcopy(FAKE_SUBSCRIPTION_III) fake_subscription["latest_invoice"] = FAKE_INVOICE["id"] subscription_retrieve_mock.side_effect = [ deepcopy(FAKE_SUBSCRIPTION), fake_subscription, ] fake_customer = deepcopy(FAKE_CUSTOMER_II) customer_retrieve_mock.side_effect = [ deepcopy(FAKE_CUSTOMER), fake_customer ] fake_card = deepcopy(FAKE_CARD_II) fake_card["customer"] = None # create Card for FAKE_CUSTOMER_III Card.sync_from_stripe_data(fake_card) # create invoice for latest_invoice in subscription to work. Invoice.sync_from_stripe_data(deepcopy(FAKE_INVOICE)) # create invoice Invoice.sync_from_stripe_data(deepcopy(FAKE_INVOICE_II)) default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data["plan"] = FAKE_PLAN_II invoiceitem_data["price"] = FAKE_PRICE_II invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual( invoiceitem.get_stripe_dashboard_url(), invoiceitem.invoice.get_stripe_dashboard_url(), ) assert str(invoiceitem) == invoiceitem.description
def test_str(self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, plan_retrieve_mock, default_account_mock): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data["plan"] = FAKE_PLAN_II invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(invoiceitem.get_stripe_dashboard_url(), invoiceitem.invoice.get_stripe_dashboard_url()) self.assertEqual( str(invoiceitem), "Subscription to New plan name ({price})".format(price=invoiceitem.plan.human_readable_price) ) invoiceitem.plan = None self.assertEqual(str(invoiceitem), "<amount={amount}, date={date}, stripe_id={stripe_id}>".format( amount=invoiceitem.amount, date=invoiceitem.date, stripe_id=invoiceitem_data["id"] ))
def test_sync_with_taxes( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM_III) invoiceitem_data["plan"] = FAKE_PLAN_II invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(invoiceitem.tax_rates.count(), 1) self.assertEqual(invoiceitem.tax_rates.first().id, FAKE_TAX_RATE_EXAMPLE_1_VAT["id"])
def test_sync_with_taxes( self, invoice_retrieve_mock, paymentintent_retrieve_mock, paymentmethod_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): fake_payment_intent = deepcopy(FAKE_PAYMENT_INTENT_II) fake_payment_intent["invoice"] = FAKE_INVOICE_II["id"] paymentintent_retrieve_mock.return_value = fake_payment_intent fake_subscription = deepcopy(FAKE_SUBSCRIPTION_III) fake_subscription["latest_invoice"] = FAKE_INVOICE_II["id"] subscription_retrieve_mock.return_value = fake_subscription fake_card = deepcopy(FAKE_CARD_II) fake_card["customer"] = None # create Card for FAKE_CUSTOMER_III Card.sync_from_stripe_data(fake_card) # create invoice Invoice.sync_from_stripe_data(deepcopy(FAKE_INVOICE_II)) default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM_III) invoiceitem_data["plan"] = FAKE_PLAN_II invoiceitem_data["price"] = FAKE_PRICE_II invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual(invoiceitem.tax_rates.count(), 1) self.assertEqual(invoiceitem.tax_rates.first().id, FAKE_TAX_RATE_EXAMPLE_1_VAT["id"])
def test___str__( self, invoice_retrieve_mock, charge_retrieve_mock, customer_retrieve_mock, paymentintent_retrieve_mock, paymentmethod_retrieve_mock, subscription_retrieve_mock, product_retrieve_mock, balance_transaction_retrieve_mock, default_account_mock, ): default_account_mock.return_value = self.account invoiceitem_data = deepcopy(FAKE_INVOICEITEM) invoiceitem_data["plan"] = FAKE_PLAN_II invoiceitem_data["price"] = FAKE_PRICE_II invoiceitem = InvoiceItem.sync_from_stripe_data(invoiceitem_data) self.assertEqual( invoiceitem.get_stripe_dashboard_url(), invoiceitem.invoice.get_stripe_dashboard_url(), ) assert str(invoiceitem) == invoiceitem.description