billing_subscription_tests.rs

 1use std::sync::Arc;
 2
 3use crate::db::billing_subscription::StripeSubscriptionStatus;
 4use crate::db::tests::new_test_user;
 5use crate::db::{CreateBillingCustomerParams, CreateBillingSubscriptionParams};
 6use crate::test_both_dbs;
 7
 8use super::Database;
 9
10test_both_dbs!(
11    test_get_active_billing_subscriptions,
12    test_get_active_billing_subscriptions_postgres,
13    test_get_active_billing_subscriptions_sqlite
14);
15
16async fn test_get_active_billing_subscriptions(db: &Arc<Database>) {
17    // A user with no subscription has no active billing subscriptions.
18    {
19        let user_id = new_test_user(db, "no-subscription-user@example.com").await;
20        let subscription_count = db
21            .count_active_billing_subscriptions(user_id)
22            .await
23            .unwrap();
24
25        assert_eq!(subscription_count, 0);
26    }
27
28    // A user with an active subscription has one active billing subscription.
29    {
30        let user_id = new_test_user(db, "active-user@example.com").await;
31        let customer = db
32            .create_billing_customer(&CreateBillingCustomerParams {
33                user_id,
34                stripe_customer_id: "cus_active_user".into(),
35            })
36            .await
37            .unwrap();
38        assert_eq!(customer.stripe_customer_id, "cus_active_user".to_string());
39
40        db.create_billing_subscription(&CreateBillingSubscriptionParams {
41            billing_customer_id: customer.id,
42            kind: None,
43            stripe_subscription_id: "sub_active_user".into(),
44            stripe_subscription_status: StripeSubscriptionStatus::Active,
45            stripe_cancellation_reason: None,
46            stripe_current_period_start: None,
47            stripe_current_period_end: None,
48        })
49        .await
50        .unwrap();
51
52        let subscriptions = db.get_billing_subscriptions(user_id).await.unwrap();
53        assert_eq!(subscriptions.len(), 1);
54
55        let subscription = &subscriptions[0];
56        assert_eq!(
57            subscription.stripe_subscription_id,
58            "sub_active_user".to_string()
59        );
60        assert_eq!(
61            subscription.stripe_subscription_status,
62            StripeSubscriptionStatus::Active
63        );
64    }
65
66    // A user with a past-due subscription has no active billing subscriptions.
67    {
68        let user_id = new_test_user(db, "past-due-user@example.com").await;
69        let customer = db
70            .create_billing_customer(&CreateBillingCustomerParams {
71                user_id,
72                stripe_customer_id: "cus_past_due_user".into(),
73            })
74            .await
75            .unwrap();
76        assert_eq!(customer.stripe_customer_id, "cus_past_due_user".to_string());
77
78        db.create_billing_subscription(&CreateBillingSubscriptionParams {
79            billing_customer_id: customer.id,
80            kind: None,
81            stripe_subscription_id: "sub_past_due_user".into(),
82            stripe_subscription_status: StripeSubscriptionStatus::PastDue,
83            stripe_cancellation_reason: None,
84            stripe_current_period_start: None,
85            stripe_current_period_end: None,
86        })
87        .await
88        .unwrap();
89
90        let subscription_count = db
91            .count_active_billing_subscriptions(user_id)
92            .await
93            .unwrap();
94        assert_eq!(subscription_count, 0);
95    }
96}