Explicit COMMIT and ROLLBACK in Mock

This commit is contained in:
Chris Tsang 2021-10-11 12:11:40 +08:00
parent 91efa1fae2
commit f94c33d1ea
2 changed files with 22 additions and 3 deletions

View File

@ -117,7 +117,8 @@ impl MockDatabaseTrait for MockDatabase {
fn commit(&mut self) { fn commit(&mut self) {
if self.transaction.is_some() { if self.transaction.is_some() {
let transaction = self.transaction.take().unwrap(); let mut transaction = self.transaction.take().unwrap();
transaction.push(Statement::from_string(self.db_backend, "COMMIT".to_owned()));
self.transaction_log.push(transaction.into_transaction()); self.transaction_log.push(transaction.into_transaction());
} else { } else {
panic!("There is no open transaction to commit"); panic!("There is no open transaction to commit");
@ -126,7 +127,12 @@ impl MockDatabaseTrait for MockDatabase {
fn rollback(&mut self) { fn rollback(&mut self) {
if self.transaction.is_some() { if self.transaction.is_some() {
self.transaction = None; let mut transaction = self.transaction.take().unwrap();
transaction.push(Statement::from_string(
self.db_backend,
"ROLLBACK".to_owned(),
));
self.transaction_log.push(transaction.into_transaction());
} else { } else {
panic!("There is no open transaction to rollback"); panic!("There is no open transaction to rollback");
} }
@ -283,6 +289,7 @@ mod tests {
r#"SELECT "fruit"."id", "fruit"."name", "fruit"."cake_id" FROM "fruit""#, r#"SELECT "fruit"."id", "fruit"."name", "fruit"."cake_id" FROM "fruit""#,
vec![] vec![]
), ),
Statement::from_string(DbBackend::Postgres, "COMMIT".to_owned()),
]), ]),
Transaction::from_sql_and_values( Transaction::from_sql_and_values(
DbBackend::Postgres, DbBackend::Postgres,
@ -313,7 +320,17 @@ mod tests {
_ => panic!(), _ => panic!(),
} }
assert_eq!(db.into_transaction_log(), vec![]); assert_eq!(
db.into_transaction_log(),
vec![Transaction::many(vec![
Statement::from_sql_and_values(
DbBackend::Postgres,
r#"SELECT "cake"."id", "cake"."name" FROM "cake" LIMIT $1"#,
vec![1u64.into()]
),
Statement::from_string(DbBackend::Postgres, "ROLLBACK".to_owned()),
]),]
);
} }
#[smol_potat::test] #[smol_potat::test]

View File

@ -12,6 +12,8 @@ use futures::lock::MutexGuard;
use crate::{DbErr, InnerConnection, QueryResult, Statement}; use crate::{DbErr, InnerConnection, QueryResult, Statement};
#[ouroboros::self_referencing] #[ouroboros::self_referencing]
/// `TransactionStream` cannot be used in a `transaction` closure as it does not impl `Send`.
/// It seems to be a Rust limitation right now, and solution to work around this deemed to be extremely hard.
pub struct TransactionStream<'a> { pub struct TransactionStream<'a> {
stmt: Statement, stmt: Statement,
conn: MutexGuard<'a, InnerConnection>, conn: MutexGuard<'a, InnerConnection>,