test(core): 添加事务回滚测试基础设施
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

This commit is contained in:
iven
2026-04-28 11:17:46 +08:00
parent aa5b26bf12
commit c556bda82b
2 changed files with 44 additions and 0 deletions

View File

@@ -11,5 +11,8 @@ pub mod request_info;
pub mod sanitize;
pub mod types;
#[cfg(test)]
pub mod test_helpers;
// 便捷导出
pub use module::{ModuleContext, ModuleType, PermissionDescriptor};

View File

@@ -0,0 +1,41 @@
//! 测试基础设施 — 事务回滚模式解决并行化问题
//!
//! 每个测试在独立事务中执行,测试结束自动回滚,无数据残留。
//! 多个测试共享同一个数据库连接池,无连接竞争。
use sea_orm::{ConnectOptions, DatabaseConnection, DatabaseTransaction};
use std::sync::OnceLock;
use tokio::sync::OnceCell;
static DB_POOL: OnceCell<DatabaseConnection> = OnceCell::const_new();
static DB_URL: OnceLock<String> = OnceLock::new();
fn db_url() -> String {
DB_URL
.get_or_init(|| {
std::env::var("TEST_DATABASE_URL")
.unwrap_or_else(|_| "postgres://erp:erp@localhost:5432/erp_test".into())
})
.clone()
}
async fn db_pool() -> &'static DatabaseConnection {
DB_POOL
.get_or_init(|| async {
let opt = ConnectOptions::new(db_url())
.max_connections(5)
.to_owned();
DatabaseConnection::connect(opt)
.await
.expect("测试数据库连接失败")
})
.await
}
/// 创建测试用事务。测试结束自动回滚,无数据残留。
pub async fn test_txn() -> DatabaseTransaction {
let pool = db_pool().await;
pool.begin()
.await
.expect("测试事务创建失败")
}