#![cfg(any(feature = "turso", feature = "postgresql", feature = "mysql"))]
mod _test_common;
define_test_user_simple!(TestUserIOU, "test_users_iou1_1");
define_test_role_with_unique_group!(TestRoleIOU, "test_roles_iou1_1");
define_test_user_simple!(TestUserIOU2, "test_users_iou2_1");
define_test_user_simple!(TestUserIOU3, "test_users_iou3_1");
#[allow(dead_code)]
define_test_user_simple!(TestUserIOU4, "test_users_iou4_1");
define_test_user_simple!(TestUserIOU5, "test_users_iou5_1");
define_test_role_with_unique_group!(TestRoleIOU4, "test_roles_iou4_1");
async fn test_insert_or_update_all_patterns_impl(
config: &_test_common::DbConfig,
) -> Result<(), Box<dyn std::error::Error>> {
let db = _test_common::create_db_connection(config).await?;
let _ = db.drop_table::<TestRoleIOU>().execute().await;
let _ = db.drop_table::<TestUserIOU>().execute().await;
db.create_table::<TestUserIOU>().execute().await?;
db.create_table::<TestRoleIOU>().execute().await?;
db.insert_or_update(&TestUserIOU {
id: 1,
name: "Alice".to_string(),
age: 18,
})
.await?;
db.insert_or_update(&vec![TestUserIOU {
id: 2,
name: "Bob".to_string(),
age: 20,
}])
.await?;
db.insert_or_update(&vec![TestUserIOU {
id: 3,
name: "Charlie".to_string(),
age: 22,
}])
.await?;
db.insert_or_update(&[TestUserIOU {
id: 4,
name: "David".to_string(),
age: 24,
}])
.await?;
db.insert_or_update(&[TestUserIOU {
id: 5,
name: "Eve".to_string(),
age: 26,
}])
.await?;
db.insert_or_update(
&[TestUserIOU {
id: 6,
name: "Frank".to_string(),
age: 28,
}][..],
)
.await?;
db.insert_or_update(
&[TestUserIOU {
id: 7,
name: "Grace".to_string(),
age: 30,
}][..],
)
.await?;
let users: Vec<TestUserIOU> = db.select::<TestUserIOU>().collect::<Vec<_>>().await?;
assert_eq!(users.len(), 7);
assert_eq!(users[0].name, "Alice");
assert_eq!(users[1].name, "Bob");
assert_eq!(users[2].name, "Charlie");
assert_eq!(users[3].name, "David");
assert_eq!(users[4].name, "Eve");
assert_eq!(users[5].name, "Frank");
assert_eq!(users[6].name, "Grace");
println!("所有 insert_or_update 插入用法测试通过!");
db.drop_table::<TestRoleIOU>().execute().await?;
db.drop_table::<TestUserIOU>().execute().await?;
Ok(())
}
async fn test_insert_or_update_update_behavior_impl(
config: &_test_common::DbConfig,
) -> Result<(), Box<dyn std::error::Error>> {
let db = _test_common::create_db_connection(config).await?;
let _ = db.drop_table::<TestUserIOU2>().execute().await;
db.create_table::<TestUserIOU2>().execute().await?;
db.insert_or_update(&TestUserIOU2 {
id: 1,
name: "Alice".to_string(),
age: 18,
})
.await?;
let users: Vec<TestUserIOU2> = db.select::<TestUserIOU2>().collect::<Vec<_>>().await?;
assert_eq!(users.len(), 1);
assert_eq!(users[0].name, "Alice");
assert_eq!(users[0].age, 18);
db.insert_or_update(&TestUserIOU2 {
id: 1,
name: "Alice Updated".to_string(),
age: 25,
})
.await?;
let users: Vec<TestUserIOU2> = db.select::<TestUserIOU2>().collect::<Vec<_>>().await?;
assert_eq!(users.len(), 1);
assert_eq!(users[0].name, "Alice Updated");
assert_eq!(users[0].age, 25);
println!("insert_or_update 更新行为测试通过!");
db.drop_table::<TestUserIOU2>().execute().await?;
Ok(())
}
async fn test_insert_or_update_batch_update_impl(
config: &_test_common::DbConfig,
) -> Result<(), Box<dyn std::error::Error>> {
let db = _test_common::create_db_connection(config).await?;
let _ = db.drop_table::<TestUserIOU3>().execute().await;
db.create_table::<TestUserIOU3>().execute().await?;
db.insert_or_update(&vec![
TestUserIOU3 {
id: 1,
name: "User1".to_string(),
age: 20,
},
TestUserIOU3 {
id: 2,
name: "User2".to_string(),
age: 25,
},
TestUserIOU3 {
id: 3,
name: "User3".to_string(),
age: 30,
},
])
.await?;
let users: Vec<TestUserIOU3> = db.select::<TestUserIOU3>().collect::<Vec<_>>().await?;
assert_eq!(users.len(), 3);
db.insert_or_update(&vec![
TestUserIOU3 {
id: 1,
name: "User1 Updated".to_string(),
age: 21,
},
TestUserIOU3 {
id: 4,
name: "User4".to_string(),
age: 35,
},
])
.await?;
let users: Vec<TestUserIOU3> = db.select::<TestUserIOU3>().collect::<Vec<_>>().await?;
assert_eq!(users.len(), 4);
let user1 = users
.iter()
.find(|u| u.id == 1)
.expect("User with id=1 should exist");
assert_eq!(user1.name, "User1 Updated"); assert_eq!(user1.age, 21);
let user4 = users
.iter()
.find(|u| u.id == 4)
.expect("User with id=4 should exist");
assert_eq!(user4.name, "User4");
println!("insert_or_update 批量更新测试通过!");
db.drop_table::<TestUserIOU3>().execute().await?;
Ok(())
}
async fn test_insert_or_update_with_array_impl(
config: &_test_common::DbConfig,
) -> Result<(), Box<dyn std::error::Error>> {
let db = _test_common::create_db_connection(config).await?;
let _ = db.drop_table::<TestRoleIOU4>().execute().await;
db.create_table::<TestRoleIOU4>().execute().await?;
db.insert_or_update(&[TestRoleIOU4 {
id: 1,
uid: 100,
name: "admin".to_string(),
}])
.await?;
db.insert_or_update(
&[TestRoleIOU4 {
id: 1,
uid: 100,
name: "super_admin".to_string(),
}][..],
)
.await?;
let roles: Vec<TestRoleIOU4> = db.select::<TestRoleIOU4>().collect::<Vec<_>>().await?;
assert_eq!(roles.len(), 1);
assert_eq!(roles[0].name, "super_admin");
println!("insert_or_update 数组引用测试通过!");
db.drop_table::<TestRoleIOU4>().execute().await?;
Ok(())
}
async fn test_insert_and_insert_or_update_mix_impl(
config: &_test_common::DbConfig,
) -> Result<(), Box<dyn std::error::Error>> {
let db = _test_common::create_db_connection(config).await?;
let _ = db.drop_table::<TestUserIOU5>().execute().await;
db.create_table::<TestUserIOU5>().execute().await?;
db.insert(&TestUserIOU5 {
id: 1,
name: "Alice".to_string(),
age: 18,
})
.await?;
db.insert(&vec![TestUserIOU5 {
id: 2,
name: "Bob".to_string(),
age: 20,
}])
.await?;
db.insert_or_update(&TestUserIOU5 {
id: 1,
name: "Alice Updated".to_string(),
age: 25,
})
.await?;
db.insert_or_update(&[TestUserIOU5 {
id: 3,
name: "Charlie".to_string(),
age: 22,
}])
.await?;
let users: Vec<TestUserIOU5> = db.select::<TestUserIOU5>().collect::<Vec<_>>().await?;
assert_eq!(users.len(), 3);
let alice = users
.iter()
.find(|u| u.id == 1)
.expect("User with id=1 should exist");
assert_eq!(alice.name, "Alice Updated");
let bob = users
.iter()
.find(|u| u.id == 2)
.expect("User with id=2 should exist");
assert_eq!(bob.name, "Bob");
let charlie = users
.iter()
.find(|u| u.id == 3)
.expect("User with id=3 should exist");
assert_eq!(charlie.name, "Charlie");
println!("insert 和 insert_or_update 混合使用测试通过!");
db.drop_table::<TestUserIOU5>().execute().await?;
Ok(())
}
test_on_all_dbs_result!(test_insert_or_update_all_patterns_impl);
test_on_all_dbs_result!(test_insert_or_update_update_behavior_impl);
test_on_all_dbs_result!(test_insert_or_update_batch_update_impl);
test_on_all_dbs_result!(test_insert_or_update_with_array_impl);
test_on_all_dbs_result!(test_insert_and_insert_or_update_mix_impl);