Files
komp_ac/server/tests/common/mod.rs
2025-06-21 15:11:27 +02:00

76 lines
2.2 KiB
Rust

// tests/common/mod.rs
use dotenvy::dotenv;
// --- CHANGE 1: Add Alphanumeric to the use statement ---
use rand::distr::Alphanumeric;
use rand::Rng;
use sqlx::{postgres::PgPoolOptions, Connection, Executor, PgConnection, PgPool};
use std::env;
// (The get_database_url and get_root_connection functions remain the same)
fn get_database_url() -> String {
dotenv().ok();
env::var("TEST_DATABASE_URL").expect("TEST_DATABASE_URL must be set")
}
async fn get_root_connection() -> PgConnection {
PgConnection::connect(&get_database_url())
.await
.expect("Failed to create root connection to test database")
}
/// The primary test setup function.
/// Creates a new, unique schema and returns a connection pool that is scoped to that schema.
/// This is the key to test isolation.
pub async fn setup_isolated_db() -> PgPool {
let mut root_conn = get_root_connection().await;
let schema_name = format!(
"test_{}",
rand::thread_rng()
// --- CHANGE 2: Pass a reference to Alphanumeric directly ---
.sample_iter(&Alphanumeric)
.take(12)
.map(char::from)
.collect::<String>()
.to_lowercase()
);
root_conn
.execute(format!("CREATE SCHEMA \"{}\"", schema_name).as_str())
.await
.unwrap_or_else(|_| panic!("Failed to create schema: {}", schema_name));
let pool = PgPoolOptions::new()
.max_connections(5)
.after_connect(move |conn, _meta| {
let schema_name = schema_name.clone();
Box::pin(async move {
conn.execute(format!("SET search_path TO \"{}\"", schema_name).as_str())
.await?;
Ok(())
})
})
.connect(&get_database_url())
.await
.expect("Failed to create isolated pool");
sqlx::migrate!()
.run(&pool)
.await
.expect("Migrations failed in isolated schema");
sqlx::query!(
r#"
INSERT INTO schemas (name)
VALUES ('default')
ON CONFLICT (name) DO NOTHING
"#
)
.execute(&pool)
.await
.expect("Failed to insert test profile in isolated schema");
pool
}