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}