#![cfg(any(feature = "sqlite", feature = "postgresql", feature = "mysql"))]
mod _test_common;
define_test_user_simple!(TestUser, "test_collect_users_1");
define_test_role_for_collect!(TestRole, "test_collect_roles_1");
define_test_user_id!(UserId, "test_collect_user_ids_1");
async fn test_collect_with_impl(
config: &_test_common::DbConfig,
) -> Result<(), Box<dyn std::error::Error>> {
let db = _test_common::create_db_connection(config).await?;
println!("[TEST] Created database connection");
let _ = db.drop_table::<TestRole>().execute().await;
let _ = db.drop_table::<TestUser>().execute().await;
db.create_table::<TestUser>().execute().await?;
println!("[TEST] Created TestUser table");
db.create_table::<TestRole>().execute().await?;
println!("[TEST] Created TestRole table");
db.insert(&TestUser {
id: 1,
name: "Alice".to_string(),
age: 25,
})
.execute()
.await?;
println!("[TEST] Inserted TestUser 1");
db.insert(&TestUser {
id: 2,
name: "Bob".to_string(),
age: 30,
})
.execute()
.await?;
println!("[TEST] Inserted TestUser 2");
db.insert(&TestUser {
id: 3,
name: "Charlie".to_string(),
age: 35,
})
.execute()
.await?;
println!("[TEST] Inserted TestUser 3");
db.insert(&TestRole {
id: 1,
user_id: 1,
role_name: "admin".to_string(),
})
.execute()
.await?;
db.insert(&TestRole {
id: 2,
user_id: 2,
role_name: "admin".to_string(),
})
.execute()
.await?;
db.insert(&TestRole {
id: 3,
user_id: 3,
role_name: "user".to_string(),
})
.execute()
.await?;
let admin_user_ids: Vec<i32> = db
.select::<TestRole>()
.filter(|r| r.role_name.eq("admin"))
.map_to(|r| r.user_id)
.collect::<Vec<i32>>()
.await?;
println!("Admin user IDs (as i32): {:?}", admin_user_ids);
assert_eq!(admin_user_ids, vec![1, 2]);
let admin_user_ids_as_model: Vec<UserId> = db
.select::<TestRole>()
.filter(|r| r.role_name.eq("admin"))
.map_to(|r| r.user_id)
.collect_with(|id| UserId { id })
.await?;
println!(
"Admin user IDs (as UserId Model): {:?}",
admin_user_ids_as_model
);
assert_eq!(admin_user_ids_as_model.len(), 2);
assert_eq!(admin_user_ids_as_model[0].id, 1);
assert_eq!(admin_user_ids_as_model[1].id, 2);
let role_data: Vec<(i32, String)> = db
.select::<TestRole>()
.filter(|r| r.role_name.eq("admin"))
.map_to(|r| (r.user_id, r.role_name))
.collect::<Vec<(i32, String)>>()
.await?;
println!("Role data (as tuple): {:?}", role_data);
assert_eq!(role_data.len(), 2);
assert_eq!(role_data[0], (1, "admin".to_string()));
println!("\n✅ All tests passed!");
db.drop_table::<TestRole>().execute().await?;
db.drop_table::<TestUser>().execute().await?;
Ok(())
}
test_on_all_dbs_result!(test_collect_with_impl);