diff --git a/src/database/connection.rs b/src/database/connection.rs index 17cc9d0f..a4231181 100644 --- a/src/database/connection.rs +++ b/src/database/connection.rs @@ -94,6 +94,7 @@ impl DatabaseConnection { pub fn as_mock_connection(&self) -> &MockDatabaseConnection { match self { + #[cfg(feature = "mock")] DatabaseConnection::MockDatabaseConnection(mock_conn) => mock_conn, _ => panic!("not mock connection"), } diff --git a/src/database/mock.rs b/src/database/mock.rs index c635bcb8..083e5538 100644 --- a/src/database/mock.rs +++ b/src/database/mock.rs @@ -1,14 +1,14 @@ use crate::{ Database, DatabaseConnection, EntityTrait, ExecErr, ExecResult, ExecResultHolder, Iden, Iterable, MockDatabaseConnection, MockDatabaseTrait, ModelTrait, QueryErr, QueryResult, - QueryResultRow, Statement, TypeErr, + QueryResultRow, Statement, Transaction, TypeErr, }; use sea_query::{Value, ValueType}; use std::collections::BTreeMap; #[derive(Debug, Default)] pub struct MockDatabase { - transaction_log: Vec, + transaction_log: Vec, exec_results: Vec, query_results: Vec>, } @@ -73,7 +73,7 @@ impl MockDatabase { impl MockDatabaseTrait for MockDatabase { fn execute(&mut self, counter: usize, statement: Statement) -> Result { - self.transaction_log.push(statement); + self.transaction_log.push(Transaction::one(statement)); if counter < self.exec_results.len() { Ok(ExecResult { result: ExecResultHolder::Mock(std::mem::take(&mut self.exec_results[counter])), @@ -88,7 +88,7 @@ impl MockDatabaseTrait for MockDatabase { counter: usize, statement: Statement, ) -> Result, QueryErr> { - self.transaction_log.push(statement); + self.transaction_log.push(Transaction::one(statement)); if counter < self.query_results.len() { Ok(std::mem::take(&mut self.query_results[counter]) .into_iter() @@ -101,7 +101,7 @@ impl MockDatabaseTrait for MockDatabase { } } - fn drain_transaction_log(&mut self) -> Vec { + fn drain_transaction_log(&mut self) -> Vec { std::mem::take(&mut self.transaction_log) } } diff --git a/src/database/mod.rs b/src/database/mod.rs index 894278d8..381f6fe0 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -2,11 +2,13 @@ mod connection; #[cfg(feature = "mock")] mod mock; mod statement; +mod transaction; pub use connection::*; #[cfg(feature = "mock")] pub use mock::*; pub use statement::*; +pub use transaction::*; #[derive(Debug, Default)] pub struct Database { diff --git a/src/database/transaction.rs b/src/database/transaction.rs new file mode 100644 index 00000000..d31a9303 --- /dev/null +++ b/src/database/transaction.rs @@ -0,0 +1,31 @@ +use crate::Statement; + +#[derive(Debug, Clone, PartialEq)] +pub struct Transaction { + stmts: Vec, +} + +impl Transaction { + /// Create a Transaction with one statement + pub fn one(stmt: Statement) -> Self { + Self { stmts: vec![stmt] } + } + + /// Create a Transaction with many statements + pub fn many(stmts: I) -> Self + where + I: IntoIterator, + { + Self { + stmts: stmts.into_iter().collect(), + } + } + + /// Wrap each Statement as a single-statement Transaction + pub fn wrap(stmts: I) -> Vec + where + I: IntoIterator, + { + stmts.into_iter().map(Self::one).collect() + } +} diff --git a/src/driver/mock.rs b/src/driver/mock.rs index 39cec2f9..2622fdde 100644 --- a/src/driver/mock.rs +++ b/src/driver/mock.rs @@ -1,6 +1,6 @@ use crate::{ debug_print, ConnectionErr, DatabaseConnection, ExecErr, ExecResult, MockDatabase, QueryErr, - QueryResult, Statement, + QueryResult, Statement, Transaction, }; use std::sync::{ atomic::{AtomicUsize, Ordering}, @@ -19,7 +19,7 @@ pub trait MockDatabaseTrait: Send { fn query(&mut self, counter: usize, stmt: Statement) -> Result, QueryErr>; - fn drain_transaction_log(&mut self) -> Vec; + fn drain_transaction_log(&mut self) -> Vec; } impl MockDatabaseConnector { diff --git a/src/executor/paginator.rs b/src/executor/paginator.rs index 50e4a96a..172ea2d6 100644 --- a/src/executor/paginator.rs +++ b/src/executor/paginator.rs @@ -105,7 +105,7 @@ where mod tests { use crate::entity::prelude::*; use crate::tests_cfg::*; - use crate::{Database, MockDatabase, QueryErr}; + use crate::{Database, MockDatabase, QueryErr, Transaction}; use futures::TryStreamExt; use sea_query::{Alias, Expr, SelectStatement, Value}; @@ -181,7 +181,7 @@ mod tests { .lock() .unwrap(); - assert_eq!(mocker.drain_transaction_log(), stmts); + assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts)); Ok(()) } @@ -221,7 +221,7 @@ mod tests { .lock() .unwrap(); - assert_eq!(mocker.drain_transaction_log(), stmts); + assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts)); Ok(()) } @@ -259,7 +259,7 @@ mod tests { .lock() .unwrap(); - assert_eq!(mocker.drain_transaction_log(), stmts); + assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts)); Ok(()) } @@ -316,7 +316,7 @@ mod tests { .lock() .unwrap(); - assert_eq!(mocker.drain_transaction_log(), stmts); + assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts)); Ok(()) } @@ -354,7 +354,7 @@ mod tests { .lock() .unwrap(); - assert_eq!(mocker.drain_transaction_log(), stmts); + assert_eq!(mocker.drain_transaction_log(), Transaction::wrap(stmts)); Ok(()) } }