···11mod common;
22-use common::{base_url, client, create_account_and_login, get_db_connection_string};
22+use common::{base_url, client, create_account_and_login, get_test_db_pool};
33use serde_json::{Value, json};
44-use sqlx::PgPool;
54use tranquil_pds::comms::{CommsType, NewComms, enqueue_comms};
6577-async fn get_pool() -> PgPool {
88- let conn_str = get_db_connection_string().await;
99- sqlx::postgres::PgPoolOptions::new()
1010- .max_connections(5)
1111- .connect(&conn_str)
1212- .await
1313- .expect("Failed to connect to test database")
1414-}
1515-166#[tokio::test]
177async fn test_get_notification_history() {
188 let client = client();
199 let base = base_url().await;
2020- let pool = get_pool().await;
1010+ let pool = get_test_db_pool().await;
2111 let (token, did) = create_account_and_login(&client).await;
22122313 let user_id: uuid::Uuid = sqlx::query_scalar!("SELECT id FROM users WHERE did = $1", did)
2424- .fetch_one(&pool)
1414+ .fetch_one(pool)
2515 .await
2616 .expect("User not found");
2717···3323 format!("Subject {}", i),
3424 format!("Body {}", i),
3525 );
3636- enqueue_comms(&pool, comms)
2626+ enqueue_comms(pool, comms)
3727 .await
3828 .expect("Failed to enqueue");
3929 }
···8676 .contains(&json!("discord"))
8777 );
88788989- let pool = get_pool().await;
7979+ let pool = get_test_db_pool().await;
9080 let user_id: uuid::Uuid = sqlx::query_scalar!("SELECT id FROM users WHERE did = $1", did)
9191- .fetch_one(&pool)
8181+ .fetch_one(pool)
9282 .await
9383 .expect("User not found");
9484···9686 "SELECT body, metadata FROM comms_queue WHERE user_id = $1 AND comms_type = 'channel_verification' ORDER BY created_at DESC LIMIT 1",
9787 user_id
9888 )
9999- .fetch_one(&pool)
8989+ .fetch_one(pool)
10090 .await
10191 .expect("Verification code not found");
10292···213203async fn test_update_email_via_notification_prefs() {
214204 let client = client();
215205 let base = base_url().await;
216216- let pool = get_pool().await;
206206+ let pool = get_test_db_pool().await;
217207 let (token, did) = create_account_and_login(&client).await;
218208219209 let unique_email = format!("newemail_{}@example.com", uuid::Uuid::new_v4());
···240230 );
241231242232 let user_id: uuid::Uuid = sqlx::query_scalar!("SELECT id FROM users WHERE did = $1", did)
243243- .fetch_one(&pool)
233233+ .fetch_one(pool)
244234 .await
245235 .expect("User not found");
246236···248238 "SELECT body FROM comms_queue WHERE user_id = $1 AND comms_type = 'email_update' ORDER BY created_at DESC LIMIT 1",
249239 user_id
250240 )
251251- .fetch_one(&pool)
241241+ .fetch_one(pool)
252242 .await
253243 .expect("Verification code not found");
254244
+6-16
tests/admin_email.rs
···2233use reqwest::StatusCode;
44use serde_json::{Value, json};
55-use sqlx::PgPool;
66-77-async fn get_pool() -> PgPool {
88- let conn_str = common::get_db_connection_string().await;
99- sqlx::postgres::PgPoolOptions::new()
1010- .max_connections(5)
1111- .connect(&conn_str)
1212- .await
1313- .expect("Failed to connect to test database")
1414-}
155166#[tokio::test]
177async fn test_send_email_success() {
188 let client = common::client();
199 let base_url = common::base_url().await;
2020- let pool = get_pool().await;
1010+ let pool = common::get_test_db_pool().await;
2111 let (access_jwt, did) = common::create_admin_account_and_login(&client).await;
2212 let res = client
2313 .post(format!("{}/xrpc/com.atproto.admin.sendEmail", base_url))
···3525 let body: Value = res.json().await.expect("Invalid JSON");
3626 assert_eq!(body["sent"], true);
3727 let user = sqlx::query!("SELECT id FROM users WHERE did = $1", did)
3838- .fetch_one(&pool)
2828+ .fetch_one(pool)
3929 .await
4030 .expect("User not found");
4131 let notification = sqlx::query!(
4232 "SELECT subject, body, comms_type as \"comms_type: String\" FROM comms_queue WHERE user_id = $1 AND comms_type = 'admin_email' ORDER BY created_at DESC LIMIT 1",
4333 user.id
4434 )
4545- .fetch_one(&pool)
3535+ .fetch_one(pool)
4636 .await
4737 .expect("Notification not found");
4838 assert_eq!(notification.subject.as_deref(), Some("Test Admin Email"));
···5747async fn test_send_email_default_subject() {
5848 let client = common::client();
5949 let base_url = common::base_url().await;
6060- let pool = get_pool().await;
5050+ let pool = common::get_test_db_pool().await;
6151 let (access_jwt, did) = common::create_admin_account_and_login(&client).await;
6252 let res = client
6353 .post(format!("{}/xrpc/com.atproto.admin.sendEmail", base_url))
···7464 let body: Value = res.json().await.expect("Invalid JSON");
7565 assert_eq!(body["sent"], true);
7666 let user = sqlx::query!("SELECT id FROM users WHERE did = $1", did)
7777- .fetch_one(&pool)
6767+ .fetch_one(pool)
7868 .await
7969 .expect("User not found");
8070 let notification = sqlx::query!(
8171 "SELECT subject FROM comms_queue WHERE user_id = $1 AND comms_type = 'admin_email' AND body = 'Email without subject' LIMIT 1",
8272 user.id
8373 )
8484- .fetch_one(&pool)
7474+ .fetch_one(pool)
8575 .await
8676 .expect("Notification not found");
8777 assert!(notification.subject.is_some());
···1818static SERVER_URL: OnceLock<String> = OnceLock::new();
1919static APP_PORT: OnceLock<u16> = OnceLock::new();
2020static MOCK_APPVIEW: OnceLock<MockServer> = OnceLock::new();
2121+static TEST_DB_POOL: OnceLock<sqlx::PgPool> = OnceLock::new();
21222223#[cfg(not(feature = "external-infra"))]
2324use testcontainers::core::ContainerPort;
···237238async fn spawn_app(database_url: String) -> String {
238239 use tranquil_pds::rate_limit::RateLimiters;
239240 let pool = PgPoolOptions::new()
240240- .max_connections(50)
241241+ .max_connections(3)
242242+ .acquire_timeout(std::time::Duration::from_secs(30))
241243 .connect(&database_url)
242244 .await
243245 .expect("Failed to connect to Postgres. Make sure the database is running.");
···245247 .run(&pool)
246248 .await
247249 .expect("Failed to run migrations");
250250+ let test_pool = PgPoolOptions::new()
251251+ .max_connections(5)
252252+ .acquire_timeout(std::time::Duration::from_secs(30))
253253+ .connect(&database_url)
254254+ .await
255255+ .expect("Failed to create test pool");
256256+ TEST_DB_POOL.set(test_pool).ok();
248257 let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
249258 let addr = listener.local_addr().unwrap();
250259 APP_PORT.set(addr.port()).ok();
···292301}
293302294303#[allow(dead_code)]
304304+pub async fn get_test_db_pool() -> &'static sqlx::PgPool {
305305+ base_url().await;
306306+ TEST_DB_POOL.get().expect("TEST_DB_POOL not initialized")
307307+}
308308+309309+#[allow(dead_code)]
295310pub async fn verify_new_account(client: &Client, did: &str) -> String {
296296- let conn_str = get_db_connection_string().await;
297297- let pool = sqlx::postgres::PgPoolOptions::new()
298298- .max_connections(2)
299299- .connect(&conn_str)
300300- .await
301301- .expect("Failed to connect to test database");
311311+ let pool = get_test_db_pool().await;
302312 let body_text: String = sqlx::query_scalar!(
303313 "SELECT body FROM comms_queue WHERE user_id = (SELECT id FROM users WHERE did = $1) AND comms_type = 'email_verification' ORDER BY created_at DESC LIMIT 1",
304314 did
305315 )
306306- .fetch_one(&pool)
316316+ .fetch_one(pool)
307317 .await
308318 .expect("Failed to get verification code");
309319···454464 if res.status() == StatusCode::OK {
455465 let body: Value = res.json().await.expect("Invalid JSON");
456466 let did = body["did"].as_str().expect("No did").to_string();
457457- let conn_str = get_db_connection_string().await;
458458- let pool = sqlx::postgres::PgPoolOptions::new()
459459- .max_connections(2)
460460- .connect(&conn_str)
461461- .await
462462- .expect("Failed to connect to test database");
467467+ let pool = get_test_db_pool().await;
463468 if make_admin {
464469 sqlx::query!("UPDATE users SET is_admin = TRUE WHERE did = $1", &did)
465465- .execute(&pool)
470470+ .execute(pool)
466471 .await
467472 .expect("Failed to mark user as admin");
468473 }
···476481 "SELECT body FROM comms_queue WHERE user_id = (SELECT id FROM users WHERE did = $1) AND comms_type = 'email_verification' ORDER BY created_at DESC LIMIT 1",
477482 &did
478483 )
479479- .fetch_one(&pool)
484484+ .fetch_one(pool)
480485 .await
481486 .expect("Failed to get verification from comms_queue");
482487 let lines: Vec<&str> = body_text.lines().collect();
+13-23
tests/delete_account.rs
···44use common::*;
55use reqwest::StatusCode;
66use serde_json::{Value, json};
77-use sqlx::PgPool;
88-99-async fn get_pool() -> PgPool {
1010- let conn_str = get_db_connection_string().await;
1111- sqlx::postgres::PgPoolOptions::new()
1212- .max_connections(5)
1313- .connect(&conn_str)
1414- .await
1515- .expect("Failed to connect to test database")
1616-}
177188async fn create_verified_account(
199 client: &reqwest::Client,
···6151 .await
6252 .expect("Failed to request account deletion");
6353 assert_eq!(request_delete_res.status(), StatusCode::OK);
6464- let pool = get_pool().await;
5454+ let pool = get_test_db_pool().await;
6555 let row = sqlx::query!(
6656 "SELECT token FROM account_deletion_requests WHERE did = $1",
6757 did
6858 )
6969- .fetch_one(&pool)
5959+ .fetch_one(pool)
7060 .await
7161 .expect("Failed to query deletion token");
7262 let token = row.token;
···8676 .expect("Failed to delete account");
8777 assert_eq!(delete_res.status(), StatusCode::OK);
8878 let user_row = sqlx::query!("SELECT id FROM users WHERE did = $1", did)
8989- .fetch_optional(&pool)
7979+ .fetch_optional(pool)
9080 .await
9181 .expect("Failed to query user");
9282 assert!(user_row.is_none(), "User should be deleted from database");
···118108 .await
119109 .expect("Failed to request account deletion");
120110 assert_eq!(request_delete_res.status(), StatusCode::OK);
121121- let pool = get_pool().await;
111111+ let pool = get_test_db_pool().await;
122112 let row = sqlx::query!(
123113 "SELECT token FROM account_deletion_requests WHERE did = $1",
124114 did
125115 )
126126- .fetch_one(&pool)
116116+ .fetch_one(pool)
127117 .await
128118 .expect("Failed to query deletion token");
129119 let token = row.token;
···208198 .await
209199 .expect("Failed to request account deletion");
210200 assert_eq!(request_delete_res.status(), StatusCode::OK);
211211- let pool = get_pool().await;
201201+ let pool = get_test_db_pool().await;
212202 let row = sqlx::query!(
213203 "SELECT token FROM account_deletion_requests WHERE did = $1",
214204 did
215205 )
216216- .fetch_one(&pool)
206206+ .fetch_one(pool)
217207 .await
218208 .expect("Failed to query deletion token");
219209 let token = row.token;
···221211 "UPDATE account_deletion_requests SET expires_at = NOW() - INTERVAL '1 hour' WHERE token = $1",
222212 token
223213 )
224224- .execute(&pool)
214214+ .execute(pool)
225215 .await
226216 .expect("Failed to expire token");
227217 let delete_payload = json!({
···267257 .await
268258 .expect("Failed to request account deletion");
269259 assert_eq!(request_delete_res.status(), StatusCode::OK);
270270- let pool = get_pool().await;
260260+ let pool = get_test_db_pool().await;
271261 let row = sqlx::query!(
272262 "SELECT token FROM account_deletion_requests WHERE did = $1",
273263 did1
274264 )
275275- .fetch_one(&pool)
265265+ .fetch_one(pool)
276266 .await
277267 .expect("Failed to query deletion token");
278268 let token = row.token;
···328318 .await
329319 .expect("Failed to request account deletion");
330320 assert_eq!(request_delete_res.status(), StatusCode::OK);
331331- let pool = get_pool().await;
321321+ let pool = get_test_db_pool().await;
332322 let row = sqlx::query!(
333323 "SELECT token FROM account_deletion_requests WHERE did = $1",
334324 did
335325 )
336336- .fetch_one(&pool)
326326+ .fetch_one(pool)
337327 .await
338328 .expect("Failed to query deletion token");
339329 let token = row.token;
···353343 .expect("Failed to delete account");
354344 assert_eq!(delete_res.status(), StatusCode::OK);
355345 let user_row = sqlx::query!("SELECT id FROM users WHERE did = $1", did)
356356- .fetch_optional(&pool)
346346+ .fetch_optional(pool)
357347 .await
358348 .expect("Failed to query user");
359349 assert!(user_row.is_none(), "User should be deleted from database");
+12-21
tests/email_update.rs
···33use serde_json::{Value, json};
44use sqlx::PgPool;
5566-async fn get_pool() -> PgPool {
77- let conn_str = common::get_db_connection_string().await;
88- sqlx::postgres::PgPoolOptions::new()
99- .max_connections(5)
1010- .connect(&conn_str)
1111- .await
1212- .expect("Failed to connect to test database")
1313-}
1414-156async fn get_email_update_token(pool: &PgPool, did: &str) -> String {
167 let body_text: String = sqlx::query_scalar!(
178 "SELECT body FROM comms_queue WHERE user_id = (SELECT id FROM users WHERE did = $1) AND comms_type = 'email_update' ORDER BY created_at DESC LIMIT 1",
···8879async fn test_update_email_flow_success() {
8980 let client = common::client();
9081 let base_url = common::base_url().await;
9191- let pool = get_pool().await;
8282+ let pool = common::get_test_db_pool().await;
9283 let handle = format!("emailup-{}", uuid::Uuid::new_v4());
9384 let email = format!("{}@example.com", handle);
9485 let (access_jwt, did) = create_verified_account(&client, &base_url, &handle, &email).await;
···10798 let body: Value = res.json().await.expect("Invalid JSON");
10899 assert_eq!(body["tokenRequired"], true);
109100110110- let code = get_email_update_token(&pool, &did).await;
101101+ let code = get_email_update_token(pool, &did).await;
111102112103 let res = client
113104 .post(format!("{}/xrpc/com.atproto.server.updateEmail", base_url))
···122113 assert_eq!(res.status(), StatusCode::OK);
123114124115 let user_email: Option<String> = sqlx::query_scalar!("SELECT email FROM users WHERE did = $1", did)
125125- .fetch_one(&pool)
116116+ .fetch_one(pool)
126117 .await
127118 .expect("User not found");
128119 assert_eq!(user_email, Some(new_email));
···244235async fn test_confirm_email_confirms_existing_email() {
245236 let client = common::client();
246237 let base_url = common::base_url().await;
247247- let pool = get_pool().await;
238238+ let pool = common::get_test_db_pool().await;
248239 let handle = format!("emailconfirm-{}", uuid::Uuid::new_v4());
249240 let email = format!("{}@example.com", handle);
250241···270261 "SELECT body FROM comms_queue WHERE user_id = (SELECT id FROM users WHERE did = $1) AND comms_type = 'email_verification' ORDER BY created_at DESC LIMIT 1",
271262 did
272263 )
273273- .fetch_one(&pool)
264264+ .fetch_one(pool)
274265 .await
275266 .expect("Verification email not found");
276267···296287 "SELECT email_verified FROM users WHERE did = $1",
297288 did
298289 )
299299- .fetch_one(&pool)
290290+ .fetch_one(pool)
300291 .await
301292 .expect("User not found");
302293 assert!(verified);
···306297async fn test_confirm_email_rejects_wrong_email() {
307298 let client = common::client();
308299 let base_url = common::base_url().await;
309309- let pool = get_pool().await;
300300+ let pool = common::get_test_db_pool().await;
310301 let handle = format!("emailconf-wrong-{}", uuid::Uuid::new_v4());
311302 let email = format!("{}@example.com", handle);
312303···332323 "SELECT body FROM comms_queue WHERE user_id = (SELECT id FROM users WHERE did = $1) AND comms_type = 'email_verification' ORDER BY created_at DESC LIMIT 1",
333324 did
334325 )
335335- .fetch_one(&pool)
326326+ .fetch_one(pool)
336327 .await
337328 .expect("Verification email not found");
338329···400391async fn test_unverified_account_can_update_email_without_token() {
401392 let client = common::client();
402393 let base_url = common::base_url().await;
403403- let pool = get_pool().await;
394394+ let pool = common::get_test_db_pool().await;
404395 let handle = format!("emailup-unverified-{}", uuid::Uuid::new_v4());
405396 let email = format!("{}@example.com", handle);
406397···454445455446 let user_email: Option<String> =
456447 sqlx::query_scalar!("SELECT email FROM users WHERE did = $1", did)
457457- .fetch_one(&pool)
448448+ .fetch_one(pool)
458449 .await
459450 .expect("User not found");
460451 assert_eq!(user_email, Some(new_email));
···464455async fn test_update_email_taken_by_another_user() {
465456 let client = common::client();
466457 let base_url = common::base_url().await;
467467- let pool = get_pool().await;
458458+ let pool = common::get_test_db_pool().await;
468459469460 let handle1 = format!("emailup-dup1-{}", uuid::Uuid::new_v4());
470461 let email1 = format!("{}@example.com", handle1);
···485476 .expect("Failed to request email update");
486477 assert_eq!(res.status(), StatusCode::OK);
487478488488- let code = get_email_update_token(&pool, &did2).await;
479479+ let code = get_email_update_token(pool, &did2).await;
489480490481 let res = client
491482 .post(format!("{}/xrpc/com.atproto.server.updateEmail", base_url))
+4-14
tests/helpers/mod.rs
···217217218218#[allow(dead_code)]
219219pub async fn set_account_takedown(did: &str, takedown_ref: Option<&str>) {
220220- let conn_str = get_db_connection_string().await;
221221- let pool = sqlx::postgres::PgPoolOptions::new()
222222- .max_connections(2)
223223- .connect(&conn_str)
224224- .await
225225- .expect("Failed to connect to test database");
220220+ let pool = get_test_db_pool().await;
226221 sqlx::query!(
227222 "UPDATE users SET takedown_ref = $1 WHERE did = $2",
228223 takedown_ref,
229224 did
230225 )
231231- .execute(&pool)
226226+ .execute(pool)
232227 .await
233228 .expect("Failed to update takedown_ref");
234229}
235230236231#[allow(dead_code)]
237232pub async fn set_account_deactivated(did: &str, deactivated: bool) {
238238- let conn_str = get_db_connection_string().await;
239239- let pool = sqlx::postgres::PgPoolOptions::new()
240240- .max_connections(2)
241241- .connect(&conn_str)
242242- .await
243243- .expect("Failed to connect to test database");
233233+ let pool = get_test_db_pool().await;
244234 let deactivated_at: Option<chrono::DateTime<Utc>> =
245235 if deactivated { Some(Utc::now()) } else { None };
246236 sqlx::query!(
···248238 deactivated_at,
249239 did
250240 )
251251- .execute(&pool)
241241+ .execute(pool)
252242 .await
253243 .expect("Failed to update deactivated_at");
254244}
+3-7
tests/jwt_security.rs
···22mod common;
33use base64::{Engine as _, engine::general_purpose::URL_SAFE_NO_PAD};
44use chrono::{Duration, Utc};
55-use common::{base_url, client, create_account_and_login, get_db_connection_string};
55+use common::{base_url, client, create_account_and_login, get_test_db_pool};
66use k256::SecretKey;
77use k256::ecdsa::{Signature, SigningKey, signature::Signer};
88use rand::rngs::OsRng;
···683683 let account: Value = create_res.json().await.unwrap();
684684 let did = account["did"].as_str().unwrap();
685685686686- let pool = sqlx::postgres::PgPoolOptions::new()
687687- .max_connections(2)
688688- .connect(&get_db_connection_string().await)
689689- .await
690690- .unwrap();
686686+ let pool = get_test_db_pool().await;
691687 let body_text: String = sqlx::query_scalar!(
692688 "SELECT body FROM comms_queue WHERE user_id = (SELECT id FROM users WHERE did = $1) AND comms_type = 'email_verification' ORDER BY created_at DESC LIMIT 1",
693689 did
694694- ).fetch_one(&pool).await.unwrap();
690690+ ).fetch_one(pool).await.unwrap();
695691 let lines: Vec<&str> = body_text.lines().collect();
696692 let code = lines
697693 .iter()
+13-23
tests/notifications.rs
···11mod common;
22-use sqlx::PgPool;
32use tranquil_pds::comms::{
43 CommsChannel, CommsStatus, CommsType, NewComms, enqueue_comms, enqueue_welcome,
54};
6577-async fn get_pool() -> PgPool {
88- let conn_str = common::get_db_connection_string().await;
99- sqlx::postgres::PgPoolOptions::new()
1010- .max_connections(5)
1111- .connect(&conn_str)
1212- .await
1313- .expect("Failed to connect to test database")
1414-}
1515-166#[tokio::test]
177async fn test_enqueue_comms() {
1818- let pool = get_pool().await;
88+ let pool = common::get_test_db_pool().await;
199 let (_, did) = common::create_account_and_login(&common::client()).await;
2010 let user_id: uuid::Uuid = sqlx::query_scalar!("SELECT id FROM users WHERE did = $1", did)
2121- .fetch_one(&pool)
1111+ .fetch_one(pool)
2212 .await
2313 .expect("User not found");
2414 let item = NewComms::email(
···2818 "Test Subject".to_string(),
2919 "Test body".to_string(),
3020 );
3131- let comms_id = enqueue_comms(&pool, item)
2121+ let comms_id = enqueue_comms(pool, item)
3222 .await
3323 .expect("Failed to enqueue comms");
3424 let row = sqlx::query!(
···4333 "#,
4434 comms_id
4535 )
4646- .fetch_one(&pool)
3636+ .fetch_one(pool)
4737 .await
4838 .expect("Comms not found");
4939 assert_eq!(row.user_id, user_id);
···57475848#[tokio::test]
5949async fn test_enqueue_welcome() {
6060- let pool = get_pool().await;
5050+ let pool = common::get_test_db_pool().await;
6151 let (_, did) = common::create_account_and_login(&common::client()).await;
6252 let user_row = sqlx::query!("SELECT id, email, handle FROM users WHERE did = $1", did)
6363- .fetch_one(&pool)
5353+ .fetch_one(pool)
6454 .await
6555 .expect("User not found");
6666- let comms_id = enqueue_welcome(&pool, user_row.id, "example.com")
5656+ let comms_id = enqueue_welcome(pool, user_row.id, "example.com")
6757 .await
6858 .expect("Failed to enqueue welcome comms");
6959 let row = sqlx::query!(
···7666 "#,
7767 comms_id
7868 )
7979- .fetch_one(&pool)
6969+ .fetch_one(pool)
8070 .await
8171 .expect("Comms not found");
8272 assert_eq!(Some(row.recipient), user_row.email);
···87778878#[tokio::test]
8979async fn test_comms_queue_status_index() {
9090- let pool = get_pool().await;
8080+ let pool = common::get_test_db_pool().await;
9181 let (_, did) = common::create_account_and_login(&common::client()).await;
9282 let user_id: uuid::Uuid = sqlx::query_scalar!("SELECT id FROM users WHERE did = $1", did)
9393- .fetch_one(&pool)
8383+ .fetch_one(pool)
9484 .await
9585 .expect("User not found");
9686 let initial_count: i64 = sqlx::query_scalar!(
9787 "SELECT COUNT(*) FROM comms_queue WHERE status = 'pending' AND user_id = $1",
9888 user_id
9989 )
100100- .fetch_one(&pool)
9090+ .fetch_one(pool)
10191 .await
10292 .expect("Failed to count")
10393 .unwrap_or(0);
···10999 "Test".to_string(),
110100 "Body".to_string(),
111101 );
112112- enqueue_comms(&pool, item).await.expect("Failed to enqueue");
102102+ enqueue_comms(pool, item).await.expect("Failed to enqueue");
113103 }
114104 let final_count: i64 = sqlx::query_scalar!(
115105 "SELECT COUNT(*) FROM comms_queue WHERE status = 'pending' AND user_id = $1",
116106 user_id
117107 )
118118- .fetch_one(&pool)
108108+ .fetch_one(pool)
119109 .await
120110 .expect("Failed to count")
121111 .unwrap_or(0);
+9-24
tests/oauth.rs
···22mod helpers;
33use base64::{Engine as _, engine::general_purpose::URL_SAFE_NO_PAD};
44use chrono::Utc;
55-use common::{base_url, client, get_db_connection_string};
55+use common::{base_url, client, get_test_db_pool};
66use helpers::verify_new_account;
77use reqwest::{StatusCode, redirect};
88use serde_json::{Value, json};
···449449 let account: Value = create_res.json().await.unwrap();
450450 let user_did = account["did"].as_str().unwrap();
451451 verify_new_account(&http_client, user_did).await;
452452- let db_url = get_db_connection_string().await;
453453- let pool = sqlx::postgres::PgPoolOptions::new()
454454- .max_connections(1)
455455- .connect(&db_url)
456456- .await
457457- .unwrap();
452452+ let pool = get_test_db_pool().await;
458453 sqlx::query("UPDATE users SET two_factor_enabled = true WHERE did = $1")
459454 .bind(user_did)
460460- .execute(&pool)
455455+ .execute(pool)
461456 .await
462457 .unwrap();
463458 let redirect_uri = "https://example.com/2fa-callback";
···516511 let twofa_code: String =
517512 sqlx::query_scalar("SELECT code FROM oauth_2fa_challenge WHERE request_uri = $1")
518513 .bind(request_uri)
519519- .fetch_one(&pool)
514514+ .fetch_one(pool)
520515 .await
521516 .unwrap();
522517 let twofa_res = http_client
···575570 let account: Value = create_res.json().await.unwrap();
576571 let user_did = account["did"].as_str().unwrap();
577572 verify_new_account(&http_client, user_did).await;
578578- let db_url = get_db_connection_string().await;
579579- let pool = sqlx::postgres::PgPoolOptions::new()
580580- .max_connections(1)
581581- .connect(&db_url)
582582- .await
583583- .unwrap();
573573+ let pool = get_test_db_pool().await;
584574 sqlx::query("UPDATE users SET two_factor_enabled = true WHERE did = $1")
585575 .bind(user_did)
586586- .execute(&pool)
576576+ .execute(pool)
587577 .await
588578 .unwrap();
589579 let redirect_uri = "https://example.com/2fa-lockout-callback";
···754744 .json::<Value>()
755745 .await
756746 .unwrap();
757757- let db_url = get_db_connection_string().await;
758758- let pool = sqlx::postgres::PgPoolOptions::new()
759759- .max_connections(1)
760760- .connect(&db_url)
761761- .await
762762- .unwrap();
747747+ let pool = get_test_db_pool().await;
763748 sqlx::query("UPDATE users SET two_factor_enabled = true WHERE did = $1")
764749 .bind(&user_did)
765765- .execute(&pool)
750750+ .execute(pool)
766751 .await
767752 .unwrap();
768753 let (code_verifier2, code_challenge2) = generate_pkce();
···803788 let twofa_code: String =
804789 sqlx::query_scalar("SELECT code FROM oauth_2fa_challenge WHERE request_uri = $1")
805790 .bind(request_uri2)
806806- .fetch_one(&pool)
791791+ .fetch_one(pool)
807792 .await
808793 .unwrap();
809794 let twofa_res = http_client
+14-24
tests/password_reset.rs
···33use helpers::verify_new_account;
44use reqwest::StatusCode;
55use serde_json::{Value, json};
66-use sqlx::PgPool;
77-88-async fn get_pool() -> PgPool {
99- let conn_str = common::get_db_connection_string().await;
1010- sqlx::postgres::PgPoolOptions::new()
1111- .max_connections(5)
1212- .connect(&conn_str)
1313- .await
1414- .expect("Failed to connect to test database")
1515-}
166177#[tokio::test]
188async fn test_request_password_reset_creates_code() {
199 let client = common::client();
2010 let base_url = common::base_url().await;
2121- let pool = get_pool().await;
1111+ let pool = common::get_test_db_pool().await;
2212 let handle = format!("pwreset-{}", uuid::Uuid::new_v4());
2313 let email = format!("{}@example.com", handle);
2414 let payload = json!({
···5040 "SELECT password_reset_code, password_reset_code_expires_at FROM users WHERE email = $1",
5141 email
5242 )
5353- .fetch_one(&pool)
4343+ .fetch_one(pool)
5444 .await
5545 .expect("User not found");
5646 assert!(user.password_reset_code.is_some());
···8070async fn test_reset_password_with_valid_token() {
8171 let client = common::client();
8272 let base_url = common::base_url().await;
8383- let pool = get_pool().await;
7373+ let pool = common::get_test_db_pool().await;
8474 let handle = format!("pwreset2-{}", uuid::Uuid::new_v4());
8575 let email = format!("{}@example.com", handle);
8676 let old_password = "Oldpass123!";
···117107 "SELECT password_reset_code FROM users WHERE email = $1",
118108 email
119109 )
120120- .fetch_one(&pool)
110110+ .fetch_one(pool)
121111 .await
122112 .expect("User not found");
123113 let token = user.password_reset_code.expect("No reset code");
···138128 "SELECT password_reset_code, password_reset_code_expires_at FROM users WHERE email = $1",
139129 email
140130 )
141141- .fetch_one(&pool)
131131+ .fetch_one(pool)
142132 .await
143133 .expect("User not found");
144134 assert!(user.password_reset_code.is_none());
···196186async fn test_reset_password_with_expired_token() {
197187 let client = common::client();
198188 let base_url = common::base_url().await;
199199- let pool = get_pool().await;
189189+ let pool = common::get_test_db_pool().await;
200190 let handle = format!("pwreset3-{}", uuid::Uuid::new_v4());
201191 let email = format!("{}@example.com", handle);
202192 let payload = json!({
···228218 "SELECT password_reset_code FROM users WHERE email = $1",
229219 email
230220 )
231231- .fetch_one(&pool)
221221+ .fetch_one(pool)
232222 .await
233223 .expect("User not found");
234224 let token = user.password_reset_code.expect("No reset code");
···236226 "UPDATE users SET password_reset_code_expires_at = NOW() - INTERVAL '1 hour' WHERE email = $1",
237227 email
238228 )
239239- .execute(&pool)
229229+ .execute(pool)
240230 .await
241231 .expect("Failed to expire token");
242232 let res = client
···260250async fn test_reset_password_invalidates_sessions() {
261251 let client = common::client();
262252 let base_url = common::base_url().await;
263263- let pool = get_pool().await;
253253+ let pool = common::get_test_db_pool().await;
264254 let handle = format!("pwreset4-{}", uuid::Uuid::new_v4());
265255 let email = format!("{}@example.com", handle);
266256 let payload = json!({
···302292 "SELECT password_reset_code FROM users WHERE email = $1",
303293 email
304294 )
305305- .fetch_one(&pool)
295295+ .fetch_one(pool)
306296 .await
307297 .expect("User not found");
308298 let token = user.password_reset_code.expect("No reset code");
···348338349339#[tokio::test]
350340async fn test_reset_password_creates_notification() {
351351- let pool = get_pool().await;
341341+ let pool = common::get_test_db_pool().await;
352342 let client = common::client();
353343 let base_url = common::base_url().await;
354344 let handle = format!("pwreset5-{}", uuid::Uuid::new_v4());
···369359 .expect("Failed to create account");
370360 assert_eq!(res.status(), StatusCode::OK);
371361 let user = sqlx::query!("SELECT id FROM users WHERE email = $1", email)
372372- .fetch_one(&pool)
362362+ .fetch_one(pool)
373363 .await
374364 .expect("User not found");
375365 let initial_count: i64 = sqlx::query_scalar!(
376366 "SELECT COUNT(*) FROM comms_queue WHERE user_id = $1 AND comms_type = 'password_reset'",
377367 user.id
378368 )
379379- .fetch_one(&pool)
369369+ .fetch_one(pool)
380370 .await
381371 .expect("Failed to count")
382372 .unwrap_or(0);
···394384 "SELECT COUNT(*) FROM comms_queue WHERE user_id = $1 AND comms_type = 'password_reset'",
395385 user.id
396386 )
397397- .fetch_one(&pool)
387387+ .fetch_one(pool)
398388 .await
399389 .expect("Failed to count")
400390 .unwrap_or(0);
+6-16
tests/signing_key.rs
···33use helpers::verify_new_account;
44use reqwest::StatusCode;
55use serde_json::{Value, json};
66-use sqlx::PgPool;
77-88-async fn get_pool() -> PgPool {
99- let conn_str = common::get_db_connection_string().await;
1010- sqlx::postgres::PgPoolOptions::new()
1111- .max_connections(5)
1212- .connect(&conn_str)
1313- .await
1414- .expect("Failed to connect to test database")
1515-}
166177#[tokio::test]
188async fn test_reserve_signing_key_without_did() {
···4131async fn test_reserve_signing_key_with_did() {
4232 let client = common::client();
4333 let base_url = common::base_url().await;
4444- let pool = get_pool().await;
3434+ let pool = common::get_test_db_pool().await;
4535 let target_did = "did:plc:test123456";
4636 let res = client
4737 .post(format!(
···6050 "SELECT did, public_key_did_key FROM reserved_signing_keys WHERE public_key_did_key = $1",
6151 signing_key
6252 )
6363- .fetch_one(&pool)
5353+ .fetch_one(pool)
6454 .await
6555 .expect("Reserved key not found in database");
6656 assert_eq!(row.did.as_deref(), Some(target_did));
···7161async fn test_reserve_signing_key_stores_private_key() {
7262 let client = common::client();
7363 let base_url = common::base_url().await;
7474- let pool = get_pool().await;
6464+ let pool = common::get_test_db_pool().await;
7565 let res = client
7666 .post(format!(
7767 "{}/xrpc/com.atproto.server.reserveSigningKey",
···8878 "SELECT private_key_bytes, expires_at, used_at FROM reserved_signing_keys WHERE public_key_did_key = $1",
8979 signing_key
9080 )
9191- .fetch_one(&pool)
8181+ .fetch_one(pool)
9282 .await
9383 .expect("Reserved key not found in database");
9484 assert_eq!(
···161151async fn test_create_account_with_reserved_signing_key() {
162152 let client = common::client();
163153 let base_url = common::base_url().await;
164164- let pool = get_pool().await;
154154+ let pool = common::get_test_db_pool().await;
165155 let res = client
166156 .post(format!(
167157 "{}/xrpc/com.atproto.server.reserveSigningKey",
···199189 "SELECT used_at FROM reserved_signing_keys WHERE public_key_did_key = $1",
200190 signing_key
201191 )
202202- .fetch_one(&pool)
192192+ .fetch_one(pool)
203193 .await
204194 .expect("Reserved key not found");
205195 assert!(