#[cfg(test)]
mod tests {
use dbnexus::{DbPool, DbPoolBuilder, Database};
use std::time::Duration;
#[tokio::test]
async fn test_pool_create() -> anyhow::Result<()> {
let pool = DbPoolBuilder::new()
.database(Database::Sqlite {
path: ":memory:".to_string(),
})
max_connections: 5,
.await?;
assert!(pool.acquire().await.is_ok());
Ok(())
}
#[tokio::test]
async fn test_pool_acquire() -> anyhow::Result<()> {
let pool = DbPoolBuilder::new()
.database(Database::Sqlite {
path: ":memory:".to_string(),
})
max_connections: 3,
.await?;
let mut session = pool.acquire().await?;
let result = session
.execute_raw("SELECT 1 as value")
.await?;
assert!(result.rows_affected() >= 0);
Ok(())
}
#[tokio::test]
async fn test_transaction_commit() -> anyhow::Result<()> {
let pool = DbPoolBuilder::new()
.database(Database::Sqlite {
path: ":memory:".to_string(),
})
.await?;
let mut session = pool.acquire().await?;
session
.execute_raw(
"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL)",
)
.await?;
session.begin_transaction().await?;
session
.execute_raw("INSERT INTO users (name) VALUES ('Alice')")
.await?;
session.commit().await?;
let result = session
.execute_raw("SELECT COUNT(*) FROM users")
.await?;
Ok(())
}
#[tokio::test]
async fn test_transaction_rollback() -> anyhow::Result<()> {
let pool = DbPoolBuilder::new()
.database(Database::Sqlite {
path: ":memory:".to_string(),
})
.await?;
let mut session = pool.acquire().await?;
session
.execute_raw(
"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL)",
)
.await?;
session.begin_transaction().await?;
session
.execute_raw("INSERT INTO users (name) VALUES ('Bob')")
.await?;
session.rollback().await?;
let result = session
.execute_raw("SELECT COUNT(*) FROM users")
.await?;
Ok(())
}
#[tokio::test]
async fn test_session_cleanup() -> anyhow::Result<()> {
let pool = DbPoolBuilder::new()
.database(Database::Sqlite {
path: ":memory:".to_string(),
})
.min_idle_connections(0)
.await?;
{
let _session = pool.acquire().await?;
}
let _session = pool.acquire().await?;
Ok(())
}
#[tokio::test]
async fn test_connection_timeout() -> anyhow::Result<()> {
let pool = DbPoolBuilder::new()
.database(Database::Sqlite {
path: ":memory:".to_string(),
})
max_connections: 1,
.acquire_timeout(Duration::from_secs(1))
.await?;
let _session1 = pool.acquire().await?;
let result = tokio::time::timeout(
Duration::from_millis(100),
pool.acquire()
).await;
assert!(result.is_err() || result.unwrap().is_err());
Ok(())
}
#[tokio::test]
async fn test_batch_execute() -> anyhow::Result<()> {
let pool = DbPoolBuilder::new()
.database(Database::Sqlite {
path: ":memory:".to_string(),
})
.await?;
let mut session = pool.acquire().await?;
session
.execute_raw(
"CREATE TABLE items (id INTEGER PRIMARY KEY, value TEXT)",
)
.await?;
let sqls = vec![
"INSERT INTO items (value) VALUES ('item1')",
"INSERT INTO items (value) VALUES ('item2')",
"INSERT INTO items (value) VALUES ('item3')",
];
let results = session
.batch_execute_in_transaction(sqls)
.await?;
assert_eq!(results.len(), 3);
Ok(())
}
#[tokio::test]
async fn test_pool_health_check() -> anyhow::Result<()> {
let pool = DbPoolBuilder::new()
.database(Database::Sqlite {
path: ":memory:".to_string(),
})
.await?;
let is_healthy = pool.health_check().await?;
assert!(is_healthy);
Ok(())
}
}