use std::sync::{
OnceLock,
atomic::{AtomicU32, Ordering},
};
use toasty::Db;
pub const TEST_DATABASE_URL: &str = "TABLO_TEST_DATABASE_URL";
pub async fn test_db(models: toasty::schema::ModelSet) -> Db {
let mut builder = Db::builder();
builder.models(models);
let url = match std::env::var(TEST_DATABASE_URL) {
Ok(url) => {
builder.table_name_prefix(&table_prefix());
url
}
Err(_) => "sqlite::memory:".to_string(),
};
let db = builder.connect(&url).await.expect("connect");
db.push_schema().await.expect("push_schema");
db
}
fn table_prefix() -> String {
static RUN: OnceLock<u32> = OnceLock::new();
static NEXT: AtomicU32 = AtomicU32::new(0);
let run = RUN.get_or_init(|| {
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default();
now.as_secs() as u32 ^ now.subsec_nanos()
});
let call = NEXT.fetch_add(1, Ordering::Relaxed);
format!("t{run:08x}{call}_")
}