use sova_db::DbHandle;
use sea_orm::{Database, DatabaseConnection};
use sea_orm_migration::MigratorTrait;
use tempfile::TempDir;
pub struct SqliteTestDb {
_dir: TempDir,
url: String,
}
impl SqliteTestDb {
pub fn create() -> Self {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("test.db");
let url = format!("sqlite://{}?mode=rwc", path.display());
std::env::set_var("DATABASE_URL", &url);
Self { _dir: dir, url }
}
pub async fn migrate<M: MigratorTrait>() -> Self {
let db = Self::create();
apply_migrations::<M>(&db.url).await;
db
}
pub fn url(&self) -> &str {
&self.url
}
pub async fn connect(&self) -> DatabaseConnection {
Database::connect(&self.url)
.await
.expect("sqlite reconnect")
}
pub async fn handle(&self) -> DbHandle {
DbHandle::Conn(self.connect().await)
}
}
pub async fn apply_migrations<M: MigratorTrait>(url: &str) {
use sea_orm_migration::SchemaManager;
let conn = Database::connect(url).await.expect("sqlite connect");
let schema = SchemaManager::new(&conn);
for m in M::migrations() {
m.up(&schema).await.expect("migrate up");
}
}