use std::path::PathBuf;
use std::sync::atomic::{AtomicUsize, Ordering};
use crate::database::{DatabaseConfig, URL_ENV};
mod idp;
pub use idp::{TEST_CLIENT_ID, TestIdentityProvider, TokenSpec};
pub struct TestDatabase {
config: DatabaseConfig,
dir: PathBuf,
}
impl TestDatabase {
pub fn start() -> Self {
static COUNTER: AtomicUsize = AtomicUsize::new(0);
let n = COUNTER.fetch_add(1, Ordering::Relaxed);
let dir = std::env::temp_dir().join(format!("slave-testdb-{}-{n}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).expect("create test database directory");
let config = DatabaseConfig {
url: format!("turso:{}", dir.join("test.db").display()),
};
Self { config, dir }
}
pub fn config(&self) -> &DatabaseConfig {
&self.config
}
pub fn envs(&self) -> [(&'static str, &str); 1] {
[(URL_ENV, self.config.url.as_str())]
}
pub async fn connect(&self, models: toasty::ModelSet) -> toasty::Db {
crate::database::connect(models, &self.config)
.await
.expect("open the test database")
}
}
impl Drop for TestDatabase {
fn drop(&mut self) {
let _ = std::fs::remove_dir_all(&self.dir);
}
}