pub enum PgGuard {
External,
Embedded(Box<(pglite::PGlite, tempfile::TempDir)>),
}
pub async fn test_pool(_db_name: &str) -> (sqlx::PgPool, PgGuard) {
if let Ok(url) = std::env::var("DATABASE_URL") {
let pool = sqlx::PgPool::connect(&url)
.await
.expect("connect to DATABASE_URL");
return (pool, PgGuard::External);
}
let dir = tempfile::tempdir().expect("create temp data dir");
let db = pglite::PGlite::open_multi_process(dir.path(), pglite::MultiProcessOptions::default())
.await
.expect("start embedded postgres");
let url = db.unix_uri().await.expect("embedded postgres socket uri");
let pool = sqlx::PgPool::connect(&url)
.await
.expect("connect to embedded postgres");
(pool, PgGuard::Embedded(Box::new((db, dir))))
}
pub async fn shutdown(pool: sqlx::PgPool, guard: PgGuard) {
pool.close().await;
if let PgGuard::Embedded(embedded) = guard {
let (db, dir) = *embedded;
db.close().await.ok();
drop(dir);
}
}