Files
rust-user-api/tests/migration_tests.rs
enoch cf01d557b9 feat: 实现数据库迁移、搜索和分页功能
- 添加数据库迁移系统和初始用户表迁移
- 实现搜索功能模块和API
- 实现分页功能支持
- 添加相关测试文件
- 更新项目配置和文档
2025-08-05 23:44:01 +08:00

88 lines
3.3 KiB
Rust

//! 迁移系统测试
use rust_user_api::storage::{database::DatabaseUserStore, MigrationManager, UserStore};
use tempfile::tempdir;
#[tokio::test]
async fn test_migration_system_integration() {
// 创建临时数据库
let temp_dir = tempdir().expect("Failed to create temp directory");
let db_path = temp_dir.path().join("migration_test.db");
let database_url = format!("sqlite://{}?mode=rwc", db_path.display());
// 创建数据库存储(这会自动运行迁移)
let store = DatabaseUserStore::from_url(&database_url)
.await
.expect("Failed to create database store with migrations");
// 验证迁移系统创建了正确的表结构
// 通过尝试创建用户来验证表结构正确
let user = rust_user_api::models::user::User {
id: uuid::Uuid::new_v4(),
username: "migration_test_user".to_string(),
email: "migration_test@example.com".to_string(),
password_hash: "hashed_password".to_string(),
created_at: chrono::Utc::now(),
updated_at: chrono::Utc::now(),
};
let result = store.create_user(user).await;
assert!(result.is_ok(), "Failed to create user with migrated database: {:?}", result.err());
println!("✅ 迁移系统集成测试通过");
}
#[tokio::test]
async fn test_migration_manager_directly() {
use sqlx::SqlitePool;
// 创建内存数据库
let pool = SqlitePool::connect("sqlite::memory:")
.await
.expect("Failed to create test pool");
let migration_manager = MigrationManager::new(pool.clone());
// 运行迁移
let result = migration_manager.run_migrations().await;
assert!(result.is_ok(), "Failed to run migrations: {:?}", result.err());
// 检查当前版本
let version = migration_manager.get_current_version().await.unwrap();
assert!(version.is_some(), "No migration version found");
assert_eq!(version.unwrap(), 1, "Expected migration version 1");
// 检查迁移状态
let status = migration_manager.get_migration_status().await.unwrap();
assert_eq!(status.len(), 1, "Expected 1 executed migration");
assert_eq!(status[0].0, 1, "Expected migration version 1");
assert_eq!(status[0].1, "initial_users_table", "Expected migration name");
println!("✅ 迁移管理器直接测试通过");
}
#[tokio::test]
async fn test_migration_idempotency() {
use sqlx::SqlitePool;
// 创建内存数据库
let pool = SqlitePool::connect("sqlite::memory:")
.await
.expect("Failed to create test pool");
let migration_manager = MigrationManager::new(pool.clone());
// 第一次运行迁移
let result1 = migration_manager.run_migrations().await;
assert!(result1.is_ok(), "First migration run failed: {:?}", result1.err());
// 第二次运行迁移(应该跳过已执行的迁移)
let result2 = migration_manager.run_migrations().await;
assert!(result2.is_ok(), "Second migration run failed: {:?}", result2.err());
// 验证只有一个迁移记录
let status = migration_manager.get_migration_status().await.unwrap();
assert_eq!(status.len(), 1, "Expected only 1 migration record after multiple runs");
println!("✅ 迁移幂等性测试通过");
}