mod common;
use common::MigrateCommand;
use common::TestDatabase;
#[tokio::test]
async fn run_reversible_migrations() {
let all_migrations: Vec<i64> = vec![
20230101000000,
20230201000000,
20230301000000,
20230401000000,
20230501000000,
];
{
let db = TestDatabase::new("run_reversible_latest", "migrations_reversible");
db.run_migration(MigrateCommand::Run, None, false).success();
assert_eq!(db.applied_migrations().await, all_migrations);
}
{
let db = TestDatabase::new("run_reversible_latest_explicit", "migrations_reversible");
db.run_migration(MigrateCommand::Run, Some(20230501000000), false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations);
db.run_migration(MigrateCommand::Run, Some(20230501000000), false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations);
db.run_migration(MigrateCommand::Run, Some(20230301000000), false)
.failure();
assert_eq!(db.applied_migrations().await, all_migrations);
}
{
let db = TestDatabase::new("run_reversible_incremental", "migrations_reversible");
db.run_migration(MigrateCommand::Run, Some(20230101000000), false)
.success();
assert_eq!(db.applied_migrations().await, vec![20230101000000]);
db.run_migration(MigrateCommand::Run, None, true).success();
assert_eq!(db.applied_migrations().await, vec![20230101000000]);
db.run_migration(MigrateCommand::Run, Some(20230301000000), true)
.success();
assert_eq!(db.applied_migrations().await, vec![20230101000000]);
db.run_migration(MigrateCommand::Run, Some(20230901000000999), false)
.failure();
assert_eq!(db.applied_migrations().await, vec![20230101000000]);
db.run_migration(MigrateCommand::Run, Some(20230201000000), false)
.success();
assert_eq!(
db.applied_migrations().await,
vec![20230101000000, 20230201000000]
);
db.run_migration(MigrateCommand::Run, Some(20230401000000), false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations[..4]);
}
}
#[tokio::test]
async fn revert_migrations() {
let all_migrations: Vec<i64> = vec![
20230101000000,
20230201000000,
20230301000000,
20230401000000,
20230501000000,
];
{
let db = TestDatabase::new("revert_incremental", "migrations_reversible");
db.run_migration(MigrateCommand::Run, None, false).success();
db.run_migration(MigrateCommand::Revert, None, true)
.success();
assert_eq!(db.applied_migrations().await, all_migrations);
db.run_migration(MigrateCommand::Revert, None, false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations[..4]);
db.run_migration(MigrateCommand::Revert, None, false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations[..3]);
}
{
let db = TestDatabase::new("revert_incremental", "migrations_reversible");
db.run_migration(MigrateCommand::Run, None, false).success();
db.run_migration(MigrateCommand::Revert, Some(20230301000000), true)
.success();
assert_eq!(db.applied_migrations().await, all_migrations);
db.run_migration(MigrateCommand::Revert, Some(20230301000000), false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations[..3]);
db.run_migration(MigrateCommand::Revert, Some(20230301000000), false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations[..3]);
db.run_migration(MigrateCommand::Revert, Some(20230401000000), false)
.failure();
assert_eq!(db.applied_migrations().await, all_migrations[..3]);
db.run_migration(MigrateCommand::Revert, Some(9999), false)
.failure();
assert_eq!(db.applied_migrations().await, all_migrations[..3]);
db.run_migration(MigrateCommand::Run, Some(20230401000000), false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations[..4]);
db.run_migration(MigrateCommand::Revert, Some(0), false)
.success();
assert_eq!(db.applied_migrations().await, Vec::<i64>::new());
}
}
#[tokio::test]
async fn skip_reversible_migrations() {
let all_migrations: Vec<i64> = vec![
20230101000000,
20230201000000,
20230301000000,
20230401000000,
20230501000000,
];
{
let db = TestDatabase::new("migrate_skip_reversible_latest", "migrations_reversible");
db.run_migration(MigrateCommand::Skip, None, false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations);
}
{
let db = TestDatabase::new(
"migrate_skip_reversible_latest_explicit",
"migrations_reversible",
);
db.run_migration(MigrateCommand::Run, Some(20230501000000), false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations);
db.run_migration(MigrateCommand::Skip, Some(20230501000000), false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations);
db.run_migration(MigrateCommand::Skip, Some(20230301000000), false)
.failure();
assert_eq!(db.applied_migrations().await, all_migrations);
}
{
let db = TestDatabase::new(
"migrate_skip_reversible_incremental",
"migrations_reversible",
);
db.run_migration(MigrateCommand::Run, Some(20230101000000), false)
.success();
assert_eq!(db.applied_migrations().await, vec![20230101000000]);
db.run_migration(MigrateCommand::Skip, None, true).success();
assert_eq!(db.applied_migrations().await, vec![20230101000000]);
db.run_migration(MigrateCommand::Skip, Some(20230301000000), true)
.success();
assert_eq!(db.applied_migrations().await, vec![20230101000000]);
db.run_migration(MigrateCommand::Skip, Some(20230901000000999), false)
.failure();
assert_eq!(db.applied_migrations().await, vec![20230101000000]);
db.run_migration(MigrateCommand::Run, Some(20230201000000), false)
.success();
assert_eq!(
db.applied_migrations().await,
vec![20230101000000, 20230201000000]
);
db.run_migration(MigrateCommand::Skip, Some(20230401000000), false)
.success();
assert_eq!(db.applied_migrations().await, all_migrations[..4]);
}
}
#[tokio::test]
async fn ignored_chars() {
let mut db = TestDatabase::new("ignored-chars", "ignored-chars/LF");
db.config_path = Some("tests/ignored-chars/sqlx.toml".into());
db.run_migration(MigrateCommand::Run, None, false).success();
db.set_migrations("ignored-chars/CRLF");
let expected_info = "1/installed user\n2/installed post\n3/installed comment\n";
db.migrate_info().success().stdout(expected_info);
db.run_migration(MigrateCommand::Run, None, false)
.success()
.stdout("");
db.set_migrations("ignored-chars/BOM");
db.migrate_info().success().stdout(expected_info);
db.run_migration(MigrateCommand::Run, None, false)
.success()
.stdout("");
db.set_migrations("ignored-chars/oops-all-tabs");
db.migrate_info().success().stdout(expected_info);
db.run_migration(MigrateCommand::Run, None, false)
.success()
.stdout("");
}