diff --git a/corporate/lib/stripe.py b/corporate/lib/stripe.py index e554e49b1e..5734b5e59c 100644 --- a/corporate/lib/stripe.py +++ b/corporate/lib/stripe.py @@ -1421,7 +1421,7 @@ class BillingSession(ABC): stripe.InvoiceItem.create( currency="usd", customer=customer.stripe_customer_id, - description=f"${customer.flat_discount}/month new customer discount", + description=f"${cents_to_dollar_string(customer.flat_discount)}/month new customer discount", # Negative value to apply discount. amount=(-1 * discount), ) diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.create.1.json new file mode 100644 index 0000000000..c356e43b60 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.modify.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.modify.1.json new file mode 100644 index 0000000000..e147115282 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.modify.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.1.json new file mode 100644 index 0000000000..2e2feec7c7 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.2.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.2.json new file mode 100644 index 0000000000..2e2feec7c7 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.2.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.3.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.3.json new file mode 100644 index 0000000000..2e2feec7c7 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.3.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.4.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.4.json new file mode 100644 index 0000000000..2e2feec7c7 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Customer.retrieve.4.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.1.json new file mode 100644 index 0000000000..bf846c330a Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.2.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.2.json new file mode 100644 index 0000000000..ecd3baa43d Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.2.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.3.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.3.json new file mode 100644 index 0000000000..e7fd98e0df Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.3.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.4.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.4.json new file mode 100644 index 0000000000..6d922067af Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Event.list.4.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.create.1.json new file mode 100644 index 0000000000..32088ec377 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.finalize_invoice.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.finalize_invoice.1.json new file mode 100644 index 0000000000..b5c676650e Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.finalize_invoice.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.list.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.list.1.json new file mode 100644 index 0000000000..e39960ab72 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.list.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.list.2.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.list.2.json new file mode 100644 index 0000000000..0abe66f45c Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--Invoice.list.2.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--InvoiceItem.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--InvoiceItem.create.1.json new file mode 100644 index 0000000000..02afb0c5bf Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--InvoiceItem.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--InvoiceItem.create.2.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--InvoiceItem.create.2.json new file mode 100644 index 0000000000..2b9b2e31b6 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--InvoiceItem.create.2.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--InvoiceItem.create.3.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--InvoiceItem.create.3.json new file mode 100644 index 0000000000..6dd0b9bba7 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--InvoiceItem.create.3.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--PaymentIntent.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--PaymentIntent.create.1.json new file mode 100644 index 0000000000..99adf8661c Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--PaymentIntent.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--SetupIntent.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--SetupIntent.create.1.json new file mode 100644 index 0000000000..0c778c2321 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--SetupIntent.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--SetupIntent.list.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--SetupIntent.list.1.json new file mode 100644 index 0000000000..bc1fed01ab Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--SetupIntent.list.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--SetupIntent.retrieve.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--SetupIntent.retrieve.1.json new file mode 100644 index 0000000000..0c778c2321 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--SetupIntent.retrieve.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--checkout.Session.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--checkout.Session.create.1.json new file mode 100644 index 0000000000..c2c6b2aa31 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--checkout.Session.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--checkout.Session.list.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--checkout.Session.list.1.json new file mode 100644 index 0000000000..acd035d7d8 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_realm_upgrade--checkout.Session.list.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.create.1.json new file mode 100644 index 0000000000..05b326f8db Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.modify.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.modify.1.json new file mode 100644 index 0000000000..fc54f8f801 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.modify.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.1.json new file mode 100644 index 0000000000..ad7b096a0f Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.2.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.2.json new file mode 100644 index 0000000000..ad7b096a0f Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.2.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.3.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.3.json new file mode 100644 index 0000000000..ad7b096a0f Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.3.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.4.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.4.json new file mode 100644 index 0000000000..ad7b096a0f Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Customer.retrieve.4.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.1.json new file mode 100644 index 0000000000..9e933033df Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.2.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.2.json new file mode 100644 index 0000000000..a30985a4fe Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.2.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.3.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.3.json new file mode 100644 index 0000000000..9477f1675f Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.3.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.4.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.4.json new file mode 100644 index 0000000000..3d46e7c9e0 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.4.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.5.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.5.json new file mode 100644 index 0000000000..36cc19d60e Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.5.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.6.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.6.json new file mode 100644 index 0000000000..6d922067af Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Event.list.6.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.create.1.json new file mode 100644 index 0000000000..de730d68ca Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.finalize_invoice.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.finalize_invoice.1.json new file mode 100644 index 0000000000..cf782642ed Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.finalize_invoice.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.list.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.list.1.json new file mode 100644 index 0000000000..e39960ab72 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.list.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.list.2.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.list.2.json new file mode 100644 index 0000000000..eeaeda09b8 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--Invoice.list.2.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--InvoiceItem.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--InvoiceItem.create.1.json new file mode 100644 index 0000000000..d92f7dd1ce Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--InvoiceItem.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--InvoiceItem.create.2.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--InvoiceItem.create.2.json new file mode 100644 index 0000000000..fc528ef8a5 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--InvoiceItem.create.2.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--InvoiceItem.create.3.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--InvoiceItem.create.3.json new file mode 100644 index 0000000000..575b311045 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--InvoiceItem.create.3.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--PaymentIntent.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--PaymentIntent.create.1.json new file mode 100644 index 0000000000..49edb78f38 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--PaymentIntent.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--SetupIntent.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--SetupIntent.create.1.json new file mode 100644 index 0000000000..ef19a1cf9f Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--SetupIntent.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--SetupIntent.list.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--SetupIntent.list.1.json new file mode 100644 index 0000000000..d7ca834a50 Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--SetupIntent.list.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--SetupIntent.retrieve.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--SetupIntent.retrieve.1.json new file mode 100644 index 0000000000..ef19a1cf9f Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--SetupIntent.retrieve.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--checkout.Session.create.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--checkout.Session.create.1.json new file mode 100644 index 0000000000..f4caa1f07c Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--checkout.Session.create.1.json differ diff --git a/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--checkout.Session.list.1.json b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--checkout.Session.list.1.json new file mode 100644 index 0000000000..843a558b2e Binary files /dev/null and b/corporate/tests/stripe_fixtures/invoice_initial_remote_server_upgrade--checkout.Session.list.1.json differ diff --git a/corporate/tests/test_stripe.py b/corporate/tests/test_stripe.py index bb4faab0a3..223f624a18 100644 --- a/corporate/tests/test_stripe.py +++ b/corporate/tests/test_stripe.py @@ -6163,6 +6163,53 @@ class TestRemoteRealmBillingFlow(StripeTestCase, RemoteRealmBillingTestCase): zulip_realm_plan.refresh_from_db() self.assertEqual(zulip_realm_plan.licenses_at_next_renewal(), None) + @responses.activate + @mock_stripe() + def test_invoice_initial_remote_realm_upgrade(self, *mocks: Mock) -> None: + self.login("hamlet") + hamlet = self.example_user("hamlet") + + realm_user_count = UserProfile.objects.filter( + realm=hamlet.realm, is_bot=False, is_active=True + ).count() + + self.add_mock_response() + with time_machine.travel(self.now, tick=False): + send_server_data_to_push_bouncer(consider_usage_statistics=False) + + self.execute_remote_billing_authentication_flow(hamlet) + with time_machine.travel(self.now, tick=False): + stripe_customer = self.add_card_and_upgrade( + tier=CustomerPlan.TIER_SELF_HOSTED_BASIC, schedule="monthly" + ) + + [invoice0] = iter(stripe.Invoice.list(customer=stripe_customer.id)) + + [invoice_item0, invoice_item1, invoice_item2] = iter(invoice0.lines) + invoice_item_params = { + "amount": -2000, + "description": "$20.00/month new customer discount", + "quantity": 1, + } + for key, value in invoice_item_params.items(): + self.assertEqual(invoice_item0[key], value) + + invoice_item_params = { + "amount": realm_user_count * 3.5 * 100, + "description": "Zulip Basic", + "quantity": realm_user_count, + } + for key, value in invoice_item_params.items(): + self.assertEqual(invoice_item1[key], value) + + invoice_item_params = { + "amount": -1 * (realm_user_count * 3.5 * 100 - 2000), + "description": "Payment (Card ending in 4242)", + "quantity": 1, + } + for key, value in invoice_item_params.items(): + self.assertEqual(invoice_item2[key], value) + @override_settings(PUSH_NOTIFICATION_BOUNCER_URL="https://push.zulip.org.example.com") class TestRemoteServerBillingFlow(StripeTestCase, RemoteServerTestCase): @@ -6673,3 +6720,48 @@ class TestRemoteServerBillingFlow(StripeTestCase, RemoteServerTestCase): result = self.client_post("/serverlogin/", payload, subdomain="selfhosting") self.assertEqual(result.status_code, 200) self.assert_in_success_response(["Your server registration has been deactivated."], result) + + @responses.activate + @mock_stripe() + def test_invoice_initial_remote_server_upgrade(self, *mocks: Mock) -> None: + self.login("hamlet") + hamlet = self.example_user("hamlet") + + server_user_count = UserProfile.objects.filter(is_bot=False, is_active=True).count() + + self.add_mock_response() + with time_machine.travel(self.now, tick=False): + send_server_data_to_push_bouncer(consider_usage_statistics=False) + + self.execute_remote_billing_authentication_flow(hamlet.delivery_email, hamlet.full_name) + with time_machine.travel(self.now, tick=False): + stripe_customer = self.add_card_and_upgrade( + tier=CustomerPlan.TIER_SELF_HOSTED_BASIC, schedule="monthly" + ) + + [invoice0] = iter(stripe.Invoice.list(customer=stripe_customer.id)) + + [invoice_item0, invoice_item1, invoice_item2] = iter(invoice0.lines) + invoice_item_params = { + "amount": -2000, + "description": "$20.00/month new customer discount", + "quantity": 1, + } + for key, value in invoice_item_params.items(): + self.assertEqual(invoice_item0[key], value) + + invoice_item_params = { + "amount": server_user_count * 3.5 * 100, + "description": "Zulip Basic", + "quantity": server_user_count, + } + for key, value in invoice_item_params.items(): + self.assertEqual(invoice_item1[key], value) + + invoice_item_params = { + "amount": -1 * (server_user_count * 3.5 * 100 - 2000), + "description": "Payment (Card ending in 4242)", + "quantity": 1, + } + for key, value in invoice_item_params.items(): + self.assertEqual(invoice_item2[key], value)