fake_stripe_client.rs

 1use std::sync::Arc;
 2
 3use anyhow::Result;
 4use async_trait::async_trait;
 5use collections::HashMap;
 6use parking_lot::Mutex;
 7use uuid::Uuid;
 8
 9use crate::stripe_client::{
10    CreateCustomerParams, StripeClient, StripeCustomer, StripeCustomerId, StripeMeter,
11    StripeMeterId, StripePrice, StripePriceId,
12};
13
14pub struct FakeStripeClient {
15    pub customers: Arc<Mutex<HashMap<StripeCustomerId, StripeCustomer>>>,
16    pub prices: Arc<Mutex<HashMap<StripePriceId, StripePrice>>>,
17    pub meters: Arc<Mutex<HashMap<StripeMeterId, StripeMeter>>>,
18}
19
20impl FakeStripeClient {
21    pub fn new() -> Self {
22        Self {
23            customers: Arc::new(Mutex::new(HashMap::default())),
24            prices: Arc::new(Mutex::new(HashMap::default())),
25            meters: Arc::new(Mutex::new(HashMap::default())),
26        }
27    }
28}
29
30#[async_trait]
31impl StripeClient for FakeStripeClient {
32    async fn list_customers_by_email(&self, email: &str) -> Result<Vec<StripeCustomer>> {
33        Ok(self
34            .customers
35            .lock()
36            .values()
37            .filter(|customer| customer.email.as_deref() == Some(email))
38            .cloned()
39            .collect())
40    }
41
42    async fn create_customer(&self, params: CreateCustomerParams<'_>) -> Result<StripeCustomer> {
43        let customer = StripeCustomer {
44            id: StripeCustomerId(format!("cus_{}", Uuid::new_v4()).into()),
45            email: params.email.map(|email| email.to_string()),
46        };
47
48        self.customers
49            .lock()
50            .insert(customer.id.clone(), customer.clone());
51
52        Ok(customer)
53    }
54
55    async fn list_prices(&self) -> Result<Vec<StripePrice>> {
56        let prices = self.prices.lock().values().cloned().collect();
57
58        Ok(prices)
59    }
60
61    async fn list_meters(&self) -> Result<Vec<StripeMeter>> {
62        let meters = self.meters.lock().values().cloned().collect();
63
64        Ok(meters)
65    }
66}