this repo has no description
1mod common;
2use sqlx::PgPool;
3use tranquil_pds::comms::{
4 CommsChannel, CommsStatus, CommsType, NewComms, enqueue_comms, enqueue_welcome,
5};
6
7async fn get_pool() -> PgPool {
8 let conn_str = common::get_db_connection_string().await;
9 sqlx::postgres::PgPoolOptions::new()
10 .max_connections(5)
11 .connect(&conn_str)
12 .await
13 .expect("Failed to connect to test database")
14}
15
16#[tokio::test]
17async fn test_enqueue_comms() {
18 let pool = get_pool().await;
19 let (_, did) = common::create_account_and_login(&common::client()).await;
20 let user_id: uuid::Uuid = sqlx::query_scalar!("SELECT id FROM users WHERE did = $1", did)
21 .fetch_one(&pool)
22 .await
23 .expect("User not found");
24 let item = NewComms::email(
25 user_id,
26 CommsType::Welcome,
27 "test@example.com".to_string(),
28 "Test Subject".to_string(),
29 "Test body".to_string(),
30 );
31 let comms_id = enqueue_comms(&pool, item)
32 .await
33 .expect("Failed to enqueue comms");
34 let row = sqlx::query!(
35 r#"
36 SELECT
37 id, user_id, recipient, subject, body,
38 channel as "channel: CommsChannel",
39 comms_type as "comms_type: CommsType",
40 status as "status: CommsStatus"
41 FROM comms_queue
42 WHERE id = $1
43 "#,
44 comms_id
45 )
46 .fetch_one(&pool)
47 .await
48 .expect("Comms not found");
49 assert_eq!(row.user_id, user_id);
50 assert_eq!(row.recipient, "test@example.com");
51 assert_eq!(row.subject.as_deref(), Some("Test Subject"));
52 assert_eq!(row.body, "Test body");
53 assert_eq!(row.channel, CommsChannel::Email);
54 assert_eq!(row.comms_type, CommsType::Welcome);
55 assert_eq!(row.status, CommsStatus::Pending);
56}
57
58#[tokio::test]
59async fn test_enqueue_welcome() {
60 let pool = get_pool().await;
61 let (_, did) = common::create_account_and_login(&common::client()).await;
62 let user_row = sqlx::query!("SELECT id, email, handle FROM users WHERE did = $1", did)
63 .fetch_one(&pool)
64 .await
65 .expect("User not found");
66 let comms_id = enqueue_welcome(&pool, user_row.id, "example.com")
67 .await
68 .expect("Failed to enqueue welcome comms");
69 let row = sqlx::query!(
70 r#"
71 SELECT
72 recipient, subject, body,
73 comms_type as "comms_type: CommsType"
74 FROM comms_queue
75 WHERE id = $1
76 "#,
77 comms_id
78 )
79 .fetch_one(&pool)
80 .await
81 .expect("Comms not found");
82 assert_eq!(Some(row.recipient), user_row.email);
83 assert_eq!(row.subject.as_deref(), Some("Welcome to example.com"));
84 assert!(row.body.contains(&format!("@{}", user_row.handle)));
85 assert_eq!(row.comms_type, CommsType::Welcome);
86}
87
88#[tokio::test]
89async fn test_comms_queue_status_index() {
90 let pool = get_pool().await;
91 let (_, did) = common::create_account_and_login(&common::client()).await;
92 let user_id: uuid::Uuid = sqlx::query_scalar!("SELECT id FROM users WHERE did = $1", did)
93 .fetch_one(&pool)
94 .await
95 .expect("User not found");
96 let initial_count: i64 = sqlx::query_scalar!(
97 "SELECT COUNT(*) FROM comms_queue WHERE status = 'pending' AND user_id = $1",
98 user_id
99 )
100 .fetch_one(&pool)
101 .await
102 .expect("Failed to count")
103 .unwrap_or(0);
104 for i in 0..5 {
105 let item = NewComms::email(
106 user_id,
107 CommsType::PasswordReset,
108 format!("test{}@example.com", i),
109 "Test".to_string(),
110 "Body".to_string(),
111 );
112 enqueue_comms(&pool, item).await.expect("Failed to enqueue");
113 }
114 let final_count: i64 = sqlx::query_scalar!(
115 "SELECT COUNT(*) FROM comms_queue WHERE status = 'pending' AND user_id = $1",
116 user_id
117 )
118 .fetch_one(&pool)
119 .await
120 .expect("Failed to count")
121 .unwrap_or(0);
122 assert_eq!(final_count - initial_count, 5);
123}