use crate::prelude::*;
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_two_models(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
User::create().name("Alice").exec(&mut db).await?;
User::create().name("Bob").exec(&mut db).await?;
Post::create().title("Hello").exec(&mut db).await?;
let (users, posts): (Vec<User>, Vec<Post>) = toasty::batch((
User::filter_by_name("Alice"),
Post::filter_by_title("Hello"),
))
.exec(&mut db)
.await?;
assert_struct!(users, [{ name: "Alice" }]);
assert_struct!(posts, [{ title: "Hello" }]);
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_one_empty(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
User::create().name("Alice").exec(&mut db).await?;
let (users, posts): (Vec<User>, Vec<Post>) = toasty::batch((
User::filter_by_name("Alice"),
Post::filter_by_title("nonexistent"),
))
.exec(&mut db)
.await?;
assert_struct!(users, [{ name: "Alice" }]);
assert!(posts.is_empty());
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_same_model(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
User::create().name("Alice").exec(&mut db).await?;
User::create().name("Bob").exec(&mut db).await?;
User::create().name("Carol").exec(&mut db).await?;
let (alices, bobs): (Vec<User>, Vec<User>) =
toasty::batch((User::filter_by_name("Alice"), User::filter_by_name("Bob")))
.exec(&mut db)
.await?;
assert_struct!(alices, [{ name: "Alice" }]);
assert_struct!(bobs, [{ name: "Bob" }]);
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_three_queries(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
User::create().name("Alice").exec(&mut db).await?;
User::create().name("Bob").exec(&mut db).await?;
User::create().name("Carol").exec(&mut db).await?;
let (alices, bobs, carols): (Vec<User>, Vec<User>, Vec<User>) = toasty::batch((
User::filter_by_name("Alice"),
User::filter_by_name("Bob"),
User::filter_by_name("Carol"),
))
.exec(&mut db)
.await?;
assert_struct!(alices, [{ name: "Alice" }]);
assert_struct!(bobs, [{ name: "Bob" }]);
assert_struct!(carols, [{ name: "Carol" }]);
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_both_empty(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
let (users, posts): (Vec<User>, Vec<Post>) = toasty::batch((
User::filter_by_name("nobody"),
Post::filter_by_title("nothing"),
))
.exec(&mut db)
.await?;
assert!(users.is_empty());
assert!(posts.is_empty());
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_select_and_create(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
User::create().name("Alice").exec(&mut db).await?;
let (users, created): (Vec<User>, User) =
toasty::batch((User::filter_by_name("Alice"), User::create().name("Bob")))
.exec(&mut db)
.await?;
assert_struct!(users, [{ name: "Alice" }]);
assert_eq!(created.name, "Bob");
let res = User::filter_by_name("Bob").exec(&mut db).await?;
assert_struct!(res, [{ name: "Bob" }]);
Ok(())
}