test: add migration tests
This commit is contained in:
62
tests/migrations.rs
Normal file
62
tests/migrations.rs
Normal file
@@ -0,0 +1,62 @@
|
||||
use sqlx::migrate::Migrator;
|
||||
use sqlx::sqlite::SqlitePoolOptions;
|
||||
use sqlx::SqlitePool;
|
||||
|
||||
static MIGRATOR: Migrator = sqlx::migrate!("./migrations");
|
||||
|
||||
async fn mem_pool() -> SqlitePool {
|
||||
// NOTE: max_connections(1) is required because each :memory: connection
|
||||
// creates a separate database
|
||||
SqlitePoolOptions::new()
|
||||
.max_connections(1)
|
||||
.connect("sqlite::memory:")
|
||||
.await
|
||||
.expect("cannot open in-memory db")
|
||||
}
|
||||
|
||||
async fn user_tables(pool: &SqlitePool) -> Vec<String> {
|
||||
sqlx::query_scalar::<_, String>(
|
||||
"SELECT name FROM sqlite_master
|
||||
WHERE type = 'table'
|
||||
AND name NOT LIKE '_sqlx%'
|
||||
AND name NOT LIKE 'sqlite_%'
|
||||
ORDER BY name",
|
||||
)
|
||||
.fetch_all(pool)
|
||||
.await
|
||||
.expect("cannot query sqlite_master")
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn migrations_up() {
|
||||
let pool = mem_pool().await;
|
||||
MIGRATOR.run(&pool).await.expect("migrations failed");
|
||||
|
||||
let tables = user_tables(&pool).await;
|
||||
assert!(tables.contains(&"todos".to_string()));
|
||||
assert!(tables.contains(&"todo_tags".to_string()));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn migrations_down() {
|
||||
let pool = mem_pool().await;
|
||||
MIGRATOR.run(&pool).await.expect("run failed");
|
||||
MIGRATOR.undo(&pool, 0).await.expect("undo failed");
|
||||
|
||||
let tables = user_tables(&pool).await;
|
||||
assert!(tables.is_empty(), "tables should be gone after revert: {tables:?}");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn migrations_round_trip() {
|
||||
let pool = mem_pool().await;
|
||||
|
||||
MIGRATOR.run(&pool).await.expect("first run failed");
|
||||
let tables_before = user_tables(&pool).await;
|
||||
|
||||
MIGRATOR.undo(&pool, 0).await.expect("undo failed");
|
||||
MIGRATOR.run(&pool).await.expect("second run failed");
|
||||
let tables_after = user_tables(&pool).await;
|
||||
|
||||
assert_eq!(tables_before, tables_after);
|
||||
}
|
||||
Reference in New Issue
Block a user