Transaction

This commit is contained in:
Chris Tsang 2021-06-19 16:41:47 +08:00
parent ddcdd33bd5
commit f9ba6eeb1f
6 changed files with 47 additions and 13 deletions

View File

@ -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"),
}

View File

@ -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<Statement>,
transaction_log: Vec<Transaction>,
exec_results: Vec<MockExecResult>,
query_results: Vec<Vec<MockRow>>,
}
@ -73,7 +73,7 @@ impl MockDatabase {
impl MockDatabaseTrait for MockDatabase {
fn execute(&mut self, counter: usize, statement: Statement) -> Result<ExecResult, ExecErr> {
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<Vec<QueryResult>, 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<Statement> {
fn drain_transaction_log(&mut self) -> Vec<Transaction> {
std::mem::take(&mut self.transaction_log)
}
}

View File

@ -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 {

View File

@ -0,0 +1,31 @@
use crate::Statement;
#[derive(Debug, Clone, PartialEq)]
pub struct Transaction {
stmts: Vec<Statement>,
}
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<I>(stmts: I) -> Self
where
I: IntoIterator<Item = Statement>,
{
Self {
stmts: stmts.into_iter().collect(),
}
}
/// Wrap each Statement as a single-statement Transaction
pub fn wrap<I>(stmts: I) -> Vec<Self>
where
I: IntoIterator<Item = Statement>,
{
stmts.into_iter().map(Self::one).collect()
}
}

View File

@ -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<Vec<QueryResult>, QueryErr>;
fn drain_transaction_log(&mut self) -> Vec<Statement>;
fn drain_transaction_log(&mut self) -> Vec<Transaction>;
}
impl MockDatabaseConnector {

View File

@ -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(())
}
}