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}