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::{
DeleteStatement, InsertStatement, MysqlQueryBuilder, PostgresQueryBuilder, SelectStatement,
UpdateStatement,
@ -91,6 +91,13 @@ impl DatabaseConnection {
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 {

View File

@ -51,10 +51,6 @@ impl MockDatabase {
}
self
}
pub fn into_transaction_log(self) -> Vec<Statement> {
self.transaction_log
}
}
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)
}
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 {

View File

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

View File

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

View File

@ -104,7 +104,7 @@ where
#[cfg(feature = "mock")]
mod tests {
use crate::entity::prelude::*;
use crate::tests_cfg::{util::*, *};
use crate::tests_cfg::*;
use crate::{Database, MockDatabase, QueryErr};
use futures::TryStreamExt;
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(4).limit(2)),
];
let mut mocker = get_mock_db_connection(&db).mocker.lock().unwrap();
mocker.assert_transaction_log(stmts);
let mut mocker = db
.get_connection()
.as_mock_connection()
.get_mocker_mutex()
.lock()
.unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts);
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(4).limit(2)),
];
let mut mocker = get_mock_db_connection(&db).mocker.lock().unwrap();
mocker.assert_transaction_log(stmts);
let mut mocker = db
.get_connection()
.as_mock_connection()
.get_mocker_mutex()
.lock()
.unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts);
Ok(())
}
@ -242,8 +252,13 @@ mod tests {
let query_builder = db.get_query_builder_backend();
let stmts = vec![query_builder.build_select_statement(&select)];
let mut mocker = get_mock_db_connection(&db).mocker.lock().unwrap();
mocker.assert_transaction_log(stmts);
let mut mocker = db
.get_connection()
.as_mock_connection()
.get_mocker_mutex()
.lock()
.unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts);
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(4).limit(2)),
];
let mut mocker = get_mock_db_connection(&db).mocker.lock().unwrap();
mocker.assert_transaction_log(stmts);
let mut mocker = db
.get_connection()
.as_mock_connection()
.get_mocker_mutex()
.lock()
.unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts);
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(4).limit(2)),
];
let mut mocker = get_mock_db_connection(&db).mocker.lock().unwrap();
mocker.assert_transaction_log(stmts[0..1].to_vec());
mocker.assert_transaction_log(stmts[1..].to_vec());
let mut mocker = db
.get_connection()
.as_mock_connection()
.get_mocker_mutex()
.lock()
.unwrap();
assert_eq!(mocker.drain_transaction_log(), stmts);
Ok(())
}

View File

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