#sea-orm #database-migrations #testing

assert-migrator-reversible

用于测试 Sea Orm 迁移器是否可逆

10 个稳定版本 (5 个主要版本)

6.1.0 2024年5月13日
6.0.0 2024年3月23日
5.0.0 2023年8月13日
4.1.0 2023年5月12日
1.1.0 2022年10月30日

#201数据库接口

Download history 27/week @ 2024-05-07 155/week @ 2024-05-14 16/week @ 2024-05-21 1/week @ 2024-05-28 3/week @ 2024-06-04 4/week @ 2024-06-11 24/week @ 2024-07-02 80/week @ 2024-07-23

每月下载量 104

MIT 许可证

29KB
460

Assert Migrator Reversible
为 Sea Orm

crate docs

一个用于测试 Sea Orm 迁移器的库。用于检查在调用 updown 时,它们是否在两个方向上工作。

它一次运行一个迁移的上和下。检查它对数据库所做的差异。检查逆向操作是否将数据库恢复到先前状态。

支持 Postgres 和 SQLite 迁移。

示例

最常见的情况是简单地测试您的 Migrator 是否可逆。在测试中,如果不可逆则引发错误。

为此,将以下测试添加到您的迁移项目中...

assert-migrator-reversible = "1"
#[cfg(test)]
mod test_migrator {
    use crate::path::to::my::Migrator;
    use ::assert_migrator_reversible::assert_migrator_reversible;

    #[test]
    fn it_should_have_reversible_migrations() {
        assert_migrator_reversible(Migrator, None);
    }
}

此测试将默认使用 SQLite(这就是为什么传递 None)的原因。

使用 tokio::test 的示例

如果您已经在使用 Tokio 测试您的项目,那么以下可能更好。

assert-migrator-reversible = { version = "1", default-features = false }
#[cfg(test)]
mod test_migrator {
    use crate::path::to::my::Migrator;
    use ::assert_migrator_reversible::assert_migrator_reversible_async;

    #[tokio::test]
    async fn it_should_have_reversible_migrations() {
        assert_migrator_reversible_async(Migrator, None).await
    }
}

(同样,此示例将使用 SQLite,因为它传递了 None)。

使用 PostgreSQL 的示例

测试 PostgreSQL 需要传递数据库的 URL。它不会默认从环境变量中获取。您必须指定它。

#[cfg(test)]
mod test_migrator {
    use crate::path::to::my::Migrator;
    use ::assert_migrator_reversible::assert_migrator_reversible;
    use ::assert_migrator_reversible::DbConnection;

    const POSTGRES_DB_URL : &'static str = &"postgres://user:password@localhost:5432/my_database";

    #[test]
    fn it_should_have_reversible_migrations() {
        let db_conn = Some(DbConnection::Url(POSTGRES_DB_URL));
        assert_migrator_reversible(Migrator, db_conn);
    }
}

使用自己的 DatabaseConnection

您还可以构建自己的 Sea Orm DatabaseConnection 对象并将其传递以供使用...

#[cfg(test)]
mod test_migrator {
    use crate::path::to::my::Migrator;

    use ::assert_migrator_reversible::assert_migrator_reversible;
    use ::assert_migrator_reversible::DbConnection;

    use ::sea_orm_migration::sea_orm::Database;
    use ::sea_orm_migration::sea_orm::DatabaseConnection;

    const POSTGRES_DB_URL : &'static str = &"postgres://user:password@localhost:5432/my_database";

    #[tokio::test]
    async fn it_should_have_reversible_migrations() {
        let db_connection = Database::connect(db_url)
            .await
            .expect("expect DatabaseConnection to be created");

        let db_conn = Some(DbConnection::DatabaseConnection(db_connection));
        assert_migrator_reversible_async(Migrator, db_conn).await
    }
}

注意事项

  • 此工具仅检查数据库表结构更改。它不会查找其他更改,例如数据、枚举、索引、SQL 函数等。
  • 默认选项是使用内存中的 SQLite 数据库;这相当有限,因为许多功能不受支持。
  • 测试 PostgreSQL 需要启动自己的 PostgreSQL 服务器。此库不会为您执行此操作。
  • 它不支持 MySQL(也许将来会支持)。

API

该库提供两个非异步函数。这些函数通过捆绑 Tokio 来为您处理异步部分。

  • assert_migrator_reversible - 测试您的迁移器是否可逆的主要方式。传递一个迁移器。它将运行它上下。如果不可逆,它将引发恐慌。
  • find_index_of_non_reversible_migration - 这与 assert_migrator_reversible 非常相似。它会找到一个不可逆的迁移。找到后,它会返回索引。它不会崩溃。

这些函数的异步版本也是可用的。如果您不想引入 Tokio(因为它相当庞大),这将非常有用。相反,自己处理。

功能

  • tokio 默认 - 这增加了 Tokio 支持。这启用了 assert_migrator_reversiblefind_index_of_non_reversible_migration 函数。这使得测试更加简单。如果您已经在测试中使用 Tokio,并希望减小这个依赖项,您可能想要禁用此功能。
  • runtime-actix-native-tls - 将 Sea-Orm 迁移设置为使用此运行时。
  • runtime-actix-rustls - 将 Sea-Orm 迁移设置为使用此运行时。
  • runtime-async-std-native-tls - 将 Sea-Orm 迁移设置为使用此运行时。
  • runtime-async-std-rustls - 将 Sea-Orm 迁移设置为使用此运行时。
  • runtime-tokio-native-tls 默认 - 将 Sea-Orm 迁移设置为使用此运行时。
  • runtime-tokio-rustls - 将 Sea-Orm 迁移设置为使用此运行时。

本地开发

要运行此项目的测试,您需要安装 Docker,并首先启动 Postgres Docker 镜像。

运行测试的确切步骤是 ...

./scripts/start-postgres.sh
cargo test
./scripts/stop-postgres.sh

依赖项

~55MB
~1M SLoC