This commit is contained in:
Chris Tsang 2021-06-19 02:24:45 +08:00
parent 62fb43c605
commit f4611c4939
6 changed files with 54 additions and 45 deletions

View File

@ -1,4 +1,4 @@
use crate::{ExecErr, ExecResult, QueryErr, QueryResult, Statement}; use crate::{ExecErr, ExecResult, MockDatabaseConnection, QueryErr, QueryResult, Statement};
use sea_query::{ use sea_query::{
DeleteStatement, InsertStatement, MysqlQueryBuilder, PostgresQueryBuilder, SelectStatement, DeleteStatement, InsertStatement, MysqlQueryBuilder, PostgresQueryBuilder, SelectStatement,
UpdateStatement, UpdateStatement,
@ -91,6 +91,13 @@ impl DatabaseConnection {
DatabaseConnection::Disconnected => panic!("Disconnected"), DatabaseConnection::Disconnected => panic!("Disconnected"),
} }
} }
pub fn as_mock_connection(&self) -> &MockDatabaseConnection {
match self {
DatabaseConnection::MockDatabaseConnection(mock_conn) => mock_conn,
_ => panic!("not mock connection"),
}
}
} }
impl QueryBuilderBackend { impl QueryBuilderBackend {

View File

@ -51,10 +51,6 @@ impl MockDatabase {
} }
self self
} }
pub fn into_transaction_log(self) -> Vec<Statement> {
self.transaction_log
}
} }
impl MockDatabaseTrait for MockDatabase { impl MockDatabaseTrait for MockDatabase {
@ -87,18 +83,9 @@ impl MockDatabaseTrait for MockDatabase {
} }
} }
fn into_transaction_log(&mut self) -> Vec<Statement> { fn drain_transaction_log(&mut self) -> Vec<Statement> {
std::mem::take(&mut self.transaction_log) std::mem::take(&mut self.transaction_log)
} }
fn assert_transaction_log(&mut self, stmts: Vec<Statement>) {
for stmt in stmts.iter() {
assert!(!self.transaction_log.is_empty());
let log = self.transaction_log.first().unwrap();
assert_eq!(log.to_string(), stmt.to_string());
self.transaction_log = self.transaction_log.drain(1..).collect();
}
}
} }
impl MockRow { impl MockRow {

View File

@ -1,7 +1,7 @@
use sea_query::{inject_parameters, MySqlQueryBuilder, Values}; use sea_query::{inject_parameters, MySqlQueryBuilder, Values};
use std::fmt; use std::fmt;
#[derive(Debug, Clone)] #[derive(Debug, Clone, PartialEq)]
pub struct Statement { pub struct Statement {
pub sql: String, pub sql: String,
pub values: Option<Values>, pub values: Option<Values>,

View File

@ -10,8 +10,8 @@ use std::sync::{
pub struct MockDatabaseConnector; pub struct MockDatabaseConnector;
pub struct MockDatabaseConnection { pub struct MockDatabaseConnection {
pub(crate) counter: AtomicUsize, counter: AtomicUsize,
pub(crate) mocker: Mutex<Box<dyn MockDatabaseTrait>>, mocker: Mutex<Box<dyn MockDatabaseTrait>>,
} }
pub trait MockDatabaseTrait: Send { pub trait MockDatabaseTrait: Send {
@ -19,9 +19,7 @@ pub trait MockDatabaseTrait: Send {
fn query(&mut self, counter: usize, stmt: Statement) -> Result<Vec<QueryResult>, QueryErr>; fn query(&mut self, counter: usize, stmt: Statement) -> Result<Vec<QueryResult>, QueryErr>;
fn into_transaction_log(&mut self) -> Vec<Statement>; fn drain_transaction_log(&mut self) -> Vec<Statement>;
fn assert_transaction_log(&mut self, stmts: Vec<Statement>);
} }
impl MockDatabaseConnector { impl MockDatabaseConnector {
@ -46,9 +44,11 @@ impl MockDatabaseConnection {
mocker: Mutex::new(Box::new(m)), mocker: Mutex::new(Box::new(m)),
} }
} }
}
impl MockDatabaseConnection { pub fn get_mocker_mutex(&self) -> &Mutex<Box<dyn MockDatabaseTrait>> {
&self.mocker
}
pub async fn execute(&self, statement: Statement) -> Result<ExecResult, ExecErr> { pub async fn execute(&self, statement: Statement) -> Result<ExecResult, ExecErr> {
debug_print!("{}", statement); debug_print!("{}", statement);
let counter = self.counter.fetch_add(1, Ordering::SeqCst); let counter = self.counter.fetch_add(1, Ordering::SeqCst);

View File

@ -104,7 +104,7 @@ where
#[cfg(feature = "mock")] #[cfg(feature = "mock")]
mod tests { mod tests {
use crate::entity::prelude::*; use crate::entity::prelude::*;
use crate::tests_cfg::{util::*, *}; use crate::tests_cfg::*;
use crate::{Database, MockDatabase, QueryErr}; use crate::{Database, MockDatabase, QueryErr};
use futures::TryStreamExt; use futures::TryStreamExt;
use sea_query::{Alias, Expr, SelectStatement, Value}; use sea_query::{Alias, Expr, SelectStatement, Value};
@ -174,8 +174,13 @@ mod tests {
query_builder.build_select_statement(select.clone().offset(2).limit(2)), query_builder.build_select_statement(select.clone().offset(2).limit(2)),
query_builder.build_select_statement(select.clone().offset(4).limit(2)), query_builder.build_select_statement(select.clone().offset(4).limit(2)),
]; ];
let mut mocker = get_mock_db_connection(&db).mocker.lock().unwrap(); let mut mocker = db
mocker.assert_transaction_log(stmts); .get_connection()
.as_mock_connection()
.get_mocker_mutex()
.lock()
.unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts);
Ok(()) Ok(())
} }
@ -209,8 +214,13 @@ mod tests {
query_builder.build_select_statement(select.clone().offset(2).limit(2)), query_builder.build_select_statement(select.clone().offset(2).limit(2)),
query_builder.build_select_statement(select.clone().offset(4).limit(2)), query_builder.build_select_statement(select.clone().offset(4).limit(2)),
]; ];
let mut mocker = get_mock_db_connection(&db).mocker.lock().unwrap(); let mut mocker = db
mocker.assert_transaction_log(stmts); .get_connection()
.as_mock_connection()
.get_mocker_mutex()
.lock()
.unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts);
Ok(()) Ok(())
} }
@ -242,8 +252,13 @@ mod tests {
let query_builder = db.get_query_builder_backend(); let query_builder = db.get_query_builder_backend();
let stmts = vec![query_builder.build_select_statement(&select)]; let stmts = vec![query_builder.build_select_statement(&select)];
let mut mocker = get_mock_db_connection(&db).mocker.lock().unwrap(); let mut mocker = db
mocker.assert_transaction_log(stmts); .get_connection()
.as_mock_connection()
.get_mocker_mutex()
.lock()
.unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts);
Ok(()) Ok(())
} }
@ -295,8 +310,13 @@ mod tests {
query_builder.build_select_statement(select.clone().offset(2).limit(2)), query_builder.build_select_statement(select.clone().offset(2).limit(2)),
query_builder.build_select_statement(select.clone().offset(4).limit(2)), query_builder.build_select_statement(select.clone().offset(4).limit(2)),
]; ];
let mut mocker = get_mock_db_connection(&db).mocker.lock().unwrap(); let mut mocker = db
mocker.assert_transaction_log(stmts); .get_connection()
.as_mock_connection()
.get_mocker_mutex()
.lock()
.unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts);
Ok(()) Ok(())
} }
@ -328,9 +348,13 @@ mod tests {
query_builder.build_select_statement(select.clone().offset(2).limit(2)), query_builder.build_select_statement(select.clone().offset(2).limit(2)),
query_builder.build_select_statement(select.clone().offset(4).limit(2)), query_builder.build_select_statement(select.clone().offset(4).limit(2)),
]; ];
let mut mocker = get_mock_db_connection(&db).mocker.lock().unwrap(); let mut mocker = db
mocker.assert_transaction_log(stmts[0..1].to_vec()); .get_connection()
mocker.assert_transaction_log(stmts[1..].to_vec()); .as_mock_connection()
.get_mocker_mutex()
.lock()
.unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts);
Ok(()) Ok(())
} }

View File

@ -1,6 +1,4 @@
use crate::{ use crate::{tests_cfg::*, IntoMockRow, MockRow};
tests_cfg::*, Database, DatabaseConnection, IntoMockRow, MockDatabaseConnection, MockRow,
};
use sea_query::Value; use sea_query::Value;
impl From<cake_filling::Model> for MockRow { impl From<cake_filling::Model> for MockRow {
@ -43,10 +41,3 @@ impl From<fruit::Model> for MockRow {
map.into_mock_row() map.into_mock_row()
} }
} }
pub fn get_mock_db_connection(db: &Database) -> &MockDatabaseConnection {
match db.get_connection() {
DatabaseConnection::MockDatabaseConnection(mock_conn) => mock_conn,
_ => unreachable!(),
}
}