use dbnexus::db_entity;
use dbnexus::foundation::DatabaseType;
use dbnexus::{Migration, MigrationExecutor, TableChange};
use sea_orm::entity::prelude::*;
use sea_orm::{ConnectionTrait, DbBackend, Statement};
#[db_entity(table_name = "users", primary_key = "id")]
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "users")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i64,
pub name: String,
pub email: String,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
#[tokio::test]
async fn test_schema_returns_complete_table() {
let table = Model::schema(DbBackend::Sqlite);
assert_eq!(table.name, "users");
assert!(
table.columns.len() >= 3,
"should have at least id, name, email columns; got: {:?}",
table.columns.iter().map(|c| &c.name).collect::<Vec<_>>()
);
let id_col = table
.columns
.iter()
.find(|c| c.name == "id")
.expect("id column should exist");
assert!(id_col.is_primary_key, "id should be primary key");
assert!(
table.primary_key_columns.contains(&"id".to_string()),
"primary_key_columns should contain 'id'; got: {:?}",
table.primary_key_columns
);
assert!(
table.columns.iter().any(|c| c.name == "name"),
"name column should exist"
);
assert!(
table.columns.iter().any(|c| c.name == "email"),
"email column should exist"
);
}
#[tokio::test]
async fn test_schema_table_applied_by_executor() {
let conn = sea_orm::Database::connect("sqlite::memory:")
.await
.expect("Failed to connect to SQLite");
let mut executor = MigrationExecutor::new(conn, DatabaseType::Sqlite);
let table = Model::schema(DbBackend::Sqlite);
let mut migration = Migration::new(1, "create_users_table".to_string());
migration.add_table_change(TableChange::CreateTable(table));
executor
.apply_migration(&migration)
.await
.expect("Migration should succeed");
let stmt = Statement::from_sql_and_values(
DbBackend::Sqlite,
"SELECT name FROM sqlite_master WHERE type='table' AND name='users'",
[],
);
let rows = executor
.connection
.query_all_raw(stmt)
.await
.expect("Query should succeed");
assert_eq!(
rows.len(),
1,
"users table should exist in sqlite_master after migration"
);
assert_eq!(
executor.get_all_versions(),
vec![1],
"migration version 1 should be recorded in history"
);
}
#[tokio::test]
async fn test_schema_table_compatible_with_sea_orm_entity() {
let conn = sea_orm::Database::connect("sqlite::memory:")
.await
.expect("Failed to connect to SQLite");
let mut executor = MigrationExecutor::new(conn.clone(), DatabaseType::Sqlite);
let table = Model::schema(DbBackend::Sqlite);
let mut migration = Migration::new(1, "create_users_for_compat_test".to_string());
migration.add_table_change(TableChange::CreateTable(table));
executor
.apply_migration(&migration)
.await
.expect("Migration should succeed");
let active_model: ActiveModel = Model {
id: 1,
name: "Alice".to_string(),
email: "alice@example.com".to_string(),
}
.into();
let result = Entity::insert(active_model)
.exec(&conn)
.await
.expect("Insert should succeed");
assert_eq!(result.last_insert_id, 1);
let found: Option<Model> = Entity::find_by_id(1).one(&conn).await.expect("Query should succeed");
let found = found.expect("Record should exist");
assert_eq!(found.name, "Alice");
assert_eq!(found.email, "alice@example.com");
}