use crate::prelude::*;
use toasty_core::{
driver::{Operation, operation::Transaction},
stmt::Statement,
};
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_two_creates_same_model(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
t.log().clear();
let (alice, bob): (User, User) =
toasty::batch((User::create().name("Alice"), User::create().name("Bob")))
.exec(&mut db)
.await?;
assert_eq!(alice.name, "Alice");
assert_eq!(bob.name, "Bob");
assert_struct!(
t.log().pop_op(),
Operation::Transaction(Transaction::Start {
isolation: None,
read_only: false
})
);
assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Insert(_),
})); assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Insert(_),
})); assert!(t.log().pop_op().is_transaction_commit());
assert!(t.log().is_empty());
let all: Vec<_> = User::filter_by_id(alice.id).exec(&mut db).await?;
assert_eq!(all.len(), 1);
let all: Vec<_> = User::filter_by_id(bob.id).exec(&mut db).await?;
assert_eq!(all.len(), 1);
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_two_creates_different_models(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
t.log().clear();
let (user, post): (User, Post) =
toasty::batch((User::create().name("Alice"), Post::create().title("Hello")))
.exec(&mut db)
.await?;
assert_eq!(user.name, "Alice");
assert_eq!(post.title, "Hello");
assert_struct!(
t.log().pop_op(),
Operation::Transaction(Transaction::Start {
isolation: None,
read_only: false
})
);
assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Insert(_),
})); assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Insert(_),
})); assert!(t.log().pop_op().is_transaction_commit());
assert!(t.log().is_empty());
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_query_and_create(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
User::create().name("Alice").exec(&mut db).await?;
t.log().clear();
let (users, post): (Vec<User>, Post) =
toasty::batch((User::filter_by_name("Alice"), Post::create().title("Hello")))
.exec(&mut db)
.await?;
assert_struct!(users, [{ name: "Alice" }]);
assert_eq!(post.title, "Hello");
assert_struct!(
t.log().pop_op(),
Operation::Transaction(Transaction::Start {
isolation: None,
read_only: false
})
);
assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Query(_),
})); assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Insert(_),
})); assert!(t.log().pop_op().is_transaction_commit());
assert!(t.log().is_empty());
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_create_then_query(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
User::create().name("Alice").exec(&mut db).await?;
t.log().clear();
let (created, existing): (User, Vec<User>) =
toasty::batch((User::create().name("Bob"), User::filter_by_name("Alice")))
.exec(&mut db)
.await?;
assert_eq!(created.name, "Bob");
assert_struct!(existing, [{ name: "Alice" }]);
assert_struct!(
t.log().pop_op(),
Operation::Transaction(Transaction::Start {
isolation: None,
read_only: false
})
);
assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Insert(_),
})); assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Query(_),
})); assert!(t.log().pop_op().is_transaction_commit());
assert!(t.log().is_empty());
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_create_query_create(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
User::create().name("Alice").exec(&mut db).await?;
t.log().clear();
let (bob, existing, carol): (User, Vec<User>, User) = toasty::batch((
User::create().name("Bob"),
User::filter_by_name("Alice"),
User::create().name("Carol"),
))
.exec(&mut db)
.await?;
assert_eq!(bob.name, "Bob");
assert_struct!(existing, [{ name: "Alice" }]);
assert_eq!(carol.name, "Carol");
assert_struct!(
t.log().pop_op(),
Operation::Transaction(Transaction::Start {
isolation: None,
read_only: false
})
);
assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Insert(_),
})); assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Query(_),
})); assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Insert(_),
})); assert!(t.log().pop_op().is_transaction_commit());
assert!(t.log().is_empty());
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_creates_from_array(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
t.log().clear();
let users = toasty::batch([
User::create().name("Alice"),
User::create().name("Bob"),
User::create().name("Carol"),
])
.exec(&mut db)
.await?;
assert_struct!(users, [{ name: "Alice" }, { name: "Bob" }, { name: "Carol" }]);
assert_struct!(
t.log().pop_op(),
Operation::Transaction(Transaction::Start {
isolation: None,
read_only: false
})
);
for _ in 0..3 {
assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Insert(_),
}));
}
assert!(t.log().pop_op().is_transaction_commit());
assert!(t.log().is_empty());
for user in &users {
let found = User::get_by_id(&mut db, user.id).await?;
assert_eq!(found.name, user.name);
}
Ok(())
}
#[driver_test(id(ID), requires(sql), scenario(crate::scenarios::two_models))]
pub async fn batch_creates_from_vec(t: &mut Test) -> Result<()> {
let mut db = setup(t).await;
let names = ["Alice", "Bob", "Carol"];
let builders: Vec<_> = names.iter().map(|n| User::create().name(*n)).collect();
t.log().clear();
let users = toasty::batch(builders).exec(&mut db).await?;
assert_struct!(users, [{ name: "Alice" }, { name: "Bob" }, { name: "Carol" }]);
assert_struct!(
t.log().pop_op(),
Operation::Transaction(Transaction::Start {
isolation: None,
read_only: false
})
);
for _ in 0..3 {
assert_struct!(t.log().pop_op(), Operation::QuerySql({
stmt: Statement::Insert(_),
}));
}
assert!(t.log().pop_op().is_transaction_commit());
assert!(t.log().is_empty());
for user in &users {
let found = User::get_by_id(&mut db, user.id).await?;
assert_eq!(found.name, user.name);
}
Ok(())
}