mirror of https://github.com/zulip/zulip.git
test_stripe: Add remote server non-sponsorship E2E test.
This commit is contained in:
parent
1380319708
commit
2a6c93a2b9
|
@ -5846,9 +5846,129 @@ class TestRemoteServerBillingFlow(StripeTestCase, RemoteServerTestCase):
|
||||||
def setUp(self) -> None:
|
def setUp(self) -> None:
|
||||||
super().setUp()
|
super().setUp()
|
||||||
|
|
||||||
|
# Reset already created audit logs for this test as they have
|
||||||
|
# event_time=timezone_now() that will affects the LicenseLedger
|
||||||
|
# queries as their event_time would be more recent than other
|
||||||
|
# operations we perform in this test.
|
||||||
|
RealmAuditLog.objects.filter(event_type__in=RealmAuditLog.SYNCED_BILLING_EVENTS).delete()
|
||||||
|
zulip_realm = get_realm("zulip")
|
||||||
|
lear_realm = get_realm("lear")
|
||||||
|
zephyr_realm = get_realm("zephyr")
|
||||||
|
with time_machine.travel(self.now, tick=False):
|
||||||
|
for count in range(2):
|
||||||
|
for realm in [zulip_realm, zephyr_realm, lear_realm]:
|
||||||
|
do_create_user(
|
||||||
|
f"email {count}",
|
||||||
|
f"password {count}",
|
||||||
|
realm,
|
||||||
|
"name",
|
||||||
|
acting_user=None,
|
||||||
|
)
|
||||||
|
|
||||||
self.remote_server = RemoteZulipServer.objects.get(hostname="demo.example.com")
|
self.remote_server = RemoteZulipServer.objects.get(hostname="demo.example.com")
|
||||||
self.billing_session = RemoteServerBillingSession(remote_server=self.remote_server)
|
self.billing_session = RemoteServerBillingSession(remote_server=self.remote_server)
|
||||||
|
|
||||||
|
@responses.activate
|
||||||
|
@mock_stripe()
|
||||||
|
def test_non_sponsorship_billing(self, *mocks: Mock) -> None:
|
||||||
|
server_user_count = UserProfile.objects.filter(is_bot=False, is_active=True).count()
|
||||||
|
|
||||||
|
# Upload data
|
||||||
|
self.add_mock_response()
|
||||||
|
with time_machine.travel(self.now, tick=False):
|
||||||
|
send_server_data_to_push_bouncer(consider_usage_statistics=False)
|
||||||
|
|
||||||
|
self.login("hamlet")
|
||||||
|
hamlet = self.example_user("hamlet")
|
||||||
|
billing_base_url = self.billing_session.billing_base_url
|
||||||
|
|
||||||
|
result = self.execute_remote_billing_authentication_flow(
|
||||||
|
hamlet.delivery_email, hamlet.full_name, expect_tos=True, confirm_tos=True
|
||||||
|
)
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
self.assertEqual(result["Location"], f"{billing_base_url}/plans/")
|
||||||
|
|
||||||
|
# upgrade to business plan
|
||||||
|
with time_machine.travel(self.now, tick=False):
|
||||||
|
result = self.client_get(f"{billing_base_url}/upgrade/", subdomain="selfhosting")
|
||||||
|
self.assertEqual(result.status_code, 200)
|
||||||
|
self.assert_in_success_response(["Add card", "Purchase Zulip Business"], result)
|
||||||
|
|
||||||
|
self.assertFalse(Customer.objects.exists())
|
||||||
|
self.assertFalse(CustomerPlan.objects.exists())
|
||||||
|
self.assertFalse(LicenseLedger.objects.exists())
|
||||||
|
|
||||||
|
with time_machine.travel(self.now, tick=False):
|
||||||
|
stripe_customer = self.add_card_and_upgrade()
|
||||||
|
|
||||||
|
customer = Customer.objects.get(stripe_customer_id=stripe_customer.id)
|
||||||
|
plan = CustomerPlan.objects.get(customer=customer)
|
||||||
|
LicenseLedger.objects.get(plan=plan)
|
||||||
|
|
||||||
|
# Visit billing page
|
||||||
|
with time_machine.travel(self.now + timedelta(days=1), tick=False):
|
||||||
|
response = self.client_get(f"{billing_base_url}/billing/", subdomain="selfhosting")
|
||||||
|
for substring in [
|
||||||
|
"Zulip Business",
|
||||||
|
"Number of licenses",
|
||||||
|
f"{server_user_count} (managed automatically)",
|
||||||
|
"Your plan will automatically renew on",
|
||||||
|
"January 2, 2013",
|
||||||
|
f"${80 * server_user_count:,.2f}",
|
||||||
|
"Visa ending in 4242",
|
||||||
|
"Update card",
|
||||||
|
]:
|
||||||
|
self.assert_in_response(substring, response)
|
||||||
|
|
||||||
|
# Verify that change in user count of any realm collectively updates LicenseLedger.
|
||||||
|
audit_log_count = RemoteRealmAuditLog.objects.count()
|
||||||
|
self.assertEqual(LicenseLedger.objects.count(), 1)
|
||||||
|
|
||||||
|
with time_machine.travel(self.now + timedelta(days=2), tick=False):
|
||||||
|
# Create 4 new users in each lear and zulip realm.
|
||||||
|
for count in range(2, 6):
|
||||||
|
for realm in [get_realm("lear"), get_realm("zulip")]:
|
||||||
|
do_create_user(
|
||||||
|
f"email {count}",
|
||||||
|
f"password {count}",
|
||||||
|
realm,
|
||||||
|
"name",
|
||||||
|
acting_user=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
with time_machine.travel(self.now + timedelta(days=3), tick=False):
|
||||||
|
send_server_data_to_push_bouncer(consider_usage_statistics=False)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
RemoteRealmAuditLog.objects.count(),
|
||||||
|
audit_log_count + 8,
|
||||||
|
)
|
||||||
|
latest_ledger = LicenseLedger.objects.last()
|
||||||
|
assert latest_ledger is not None
|
||||||
|
self.assertEqual(latest_ledger.licenses, server_user_count + 8)
|
||||||
|
|
||||||
|
# Login again
|
||||||
|
result = self.execute_remote_billing_authentication_flow(
|
||||||
|
hamlet.delivery_email, hamlet.full_name, expect_tos=False, confirm_tos=False
|
||||||
|
)
|
||||||
|
self.assertEqual(result.status_code, 302)
|
||||||
|
self.assertEqual(result["Location"], f"{billing_base_url}/billing/")
|
||||||
|
|
||||||
|
# Downgrade
|
||||||
|
with self.assertLogs("corporate.stripe", "INFO") as m:
|
||||||
|
with time_machine.travel(self.now + timedelta(days=7), tick=False):
|
||||||
|
response = self.client_billing_patch(
|
||||||
|
"/billing/plan",
|
||||||
|
{"status": CustomerPlan.DOWNGRADE_AT_END_OF_CYCLE},
|
||||||
|
)
|
||||||
|
customer = Customer.objects.get(remote_server=self.remote_server)
|
||||||
|
new_plan = get_current_plan_by_customer(customer)
|
||||||
|
assert new_plan is not None
|
||||||
|
expected_log = f"INFO:corporate.stripe:Change plan status: Customer.id: {customer.id}, CustomerPlan.id: {new_plan.id}, status: {CustomerPlan.DOWNGRADE_AT_END_OF_CYCLE}"
|
||||||
|
self.assertEqual(m.output[0], expected_log)
|
||||||
|
self.assert_json_success(response)
|
||||||
|
self.assertEqual(new_plan.licenses_at_next_renewal(), None)
|
||||||
|
|
||||||
@responses.activate
|
@responses.activate
|
||||||
def test_request_sponsorship(self) -> None:
|
def test_request_sponsorship(self) -> None:
|
||||||
hamlet = self.example_user("hamlet")
|
hamlet = self.example_user("hamlet")
|
||||||
|
|
Loading…
Reference in New Issue