//! 迁移系统测试 use rust_user_api::{ storage::{database::DatabaseUserStore, MigrationManager, UserStore}, models::role::UserRole, }; 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(), role: UserRole::User, 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!("✅ 迁移幂等性测试通过"); }