use ormer::Model;
use ormer::abstract_layer::Database;
#[derive(Model, Debug, Clone)]
#[table = "test_users"]
struct TestUser {
#[primary]
id: Option<i64>,
name: String,
email: String,
}
#[tokio::test]
async fn test_transaction_commit() {
let db = Database::connect(ormer::DbType::Turso, ":memory:")
.await
.expect("Failed to connect to database");
db.create_table::<TestUser>()
.await
.expect("Failed to create table");
let mut txn = db.begin().await.expect("Failed to begin transaction");
let user1 = TestUser {
id: None,
name: "Alice".to_string(),
email: "alice@example.com".to_string(),
};
txn.insert(&user1).await.expect("Failed to insert user1");
txn.commit().await.expect("Failed to commit transaction");
let users: Vec<TestUser> = db
.select::<TestUser>()
.collect::<Vec<TestUser>>()
.await
.expect("Failed to query users");
assert_eq!(users.len(), 1, "Should have 1 user after commit");
assert_eq!(users[0].name, "Alice");
}
#[tokio::test]
async fn test_transaction_rollback() {
let db = Database::connect(ormer::DbType::Turso, ":memory:")
.await
.expect("Failed to connect to database");
db.create_table::<TestUser>()
.await
.expect("Failed to create table");
let initial_user = TestUser {
id: None,
name: "Initial".to_string(),
email: "initial@example.com".to_string(),
};
db.insert(&initial_user)
.await
.expect("Failed to insert initial user");
let mut txn = db.begin().await.expect("Failed to begin transaction");
let user1 = TestUser {
id: None,
name: "Should Rollback".to_string(),
email: "rollback@example.com".to_string(),
};
txn.insert(&user1)
.await
.expect("Failed to insert user in transaction");
txn.rollback()
.await
.expect("Failed to rollback transaction");
let users: Vec<TestUser> = db
.select::<TestUser>()
.collect::<Vec<TestUser>>()
.await
.expect("Failed to query users");
assert_eq!(users.len(), 1, "Should have only 1 user after rollback");
assert_eq!(users[0].name, "Initial");
}
#[tokio::test]
async fn test_transaction_with_query() {
let db = Database::connect(ormer::DbType::Turso, ":memory:")
.await
.expect("Failed to connect to database");
db.create_table::<TestUser>()
.await
.expect("Failed to create table");
let mut txn = db.begin().await.expect("Failed to begin transaction");
let user = TestUser {
id: None,
name: "Query Test".to_string(),
email: "query@example.com".to_string(),
};
txn.insert(&user).await.expect("Failed to insert user");
let users: Vec<TestUser> = txn
.select::<TestUser>()
.collect::<Vec<TestUser>>()
.await
.expect("Failed to query users in transaction");
assert_eq!(users.len(), 1, "Should see 1 user in transaction");
assert_eq!(users[0].name, "Query Test");
txn.commit().await.expect("Failed to commit transaction");
let users: Vec<TestUser> = db
.select::<TestUser>()
.collect::<Vec<TestUser>>()
.await
.expect("Failed to query users after commit");
assert_eq!(users.len(), 1, "Should have 1 user after commit");
}
#[tokio::test]
async fn test_transaction_with_update() {
let db = Database::connect(ormer::DbType::Turso, ":memory:")
.await
.expect("Failed to connect to database");
db.create_table::<TestUser>()
.await
.expect("Failed to create table");
let user = TestUser {
id: None,
name: "Original".to_string(),
email: "original@example.com".to_string(),
};
db.insert(&user).await.expect("Failed to insert user");
let txn = db.begin().await.expect("Failed to begin transaction");
#[allow(unused_imports)]
use ormer::WhereColumn;
txn.update::<TestUser>()
.filter(|w| w.name.eq("Original"))
.set(|w| w.name, "Updated".to_string())
.execute()
.await
.expect("Failed to update user");
txn.commit().await.expect("Failed to commit transaction");
let users: Vec<TestUser> = db
.select::<TestUser>()
.filter(|w| w.name.eq("Updated"))
.collect::<Vec<TestUser>>()
.await
.expect("Failed to query updated user");
assert_eq!(users.len(), 1, "Should have 1 updated user after commit");
assert_eq!(users[0].name, "Updated");
}
#[tokio::test]
async fn test_transaction_with_delete() {
let db = Database::connect(ormer::DbType::Turso, ":memory:")
.await
.expect("Failed to connect to database");
db.create_table::<TestUser>()
.await
.expect("Failed to create table");
let user1 = TestUser {
id: None,
name: "ToDelete".to_string(),
email: "delete@example.com".to_string(),
};
let user2 = TestUser {
id: None,
name: "ToKeep".to_string(),
email: "keep@example.com".to_string(),
};
db.insert(&user1).await.expect("Failed to insert user1");
db.insert(&user2).await.expect("Failed to insert user2");
let txn = db.begin().await.expect("Failed to begin transaction");
txn.delete::<TestUser>()
.filter(|w| w.name.eq("ToDelete"))
.execute()
.await
.expect("Failed to delete user");
txn.commit().await.expect("Failed to commit transaction");
let users: Vec<TestUser> = db
.select::<TestUser>()
.collect::<Vec<TestUser>>()
.await
.expect("Failed to query users");
assert_eq!(users.len(), 1, "Should have 1 user after delete and commit");
assert_eq!(users[0].name, "ToKeep");
}