Skip to main content

MockDatabaseBackend

Struct MockDatabaseBackend 

Source
pub struct MockDatabaseBackend { /* private fields */ }
Expand description

Mock implementation of DatabaseBackend trait using mockall

This mock provides automatic verification of method calls and arguments.

§Usage with rstest Fixtures

For complete examples using rstest fixtures, see the unit tests in this module:

  • test_mock_execute_with_verification() - Demonstrates strict argument verification
  • test_with_mock_database() - Shows usage with the mock_database fixture
  • test_with_mock_connection() - Shows usage with the mock_connection fixture

§Direct Usage Example

use reinhardt_testkit::fixtures::MockDatabaseBackend;
use reinhardt_db::backends::types::{QueryResult, QueryValue};
use reinhardt_db::backends::backend::DatabaseBackend as BackendTrait;

#[tokio::main]
async fn main() {
    let mut mock = MockDatabaseBackend::new();

    // Set expectations with strict argument verification
    mock.expect_execute()
        .withf(|sql, params| {
            sql.contains("INSERT INTO users") && params.len() == 2
        })
        .times(1)
        .returning(|_, _| Ok(QueryResult { rows_affected: 1 }));

    // Execute the query (must call to satisfy .times(1) expectation)
    let result = mock.execute(
        "INSERT INTO users (name, email) VALUES ($1, $2)",
        vec![
            QueryValue::String("Alice".to_string()),
            QueryValue::String("alice@example.com".to_string()),
        ],
    ).await;

    assert!(result.is_ok());
    // Mock automatically verifies expectations on drop
}

Implementations§

Source§

impl MockDatabaseBackend

Source

pub fn checkpoint(&mut self)

Validate that all current expectations for all methods have been satisfied, and discard them.

Source

pub fn new() -> Self

Create a new mock object with no expectations.

This method will not be generated if the real struct already has a new method. However, it will be generated if the struct implements a trait with a new method. The trait’s new method can still be called like <MockX as TraitY>::new

Source§

impl MockDatabaseBackend

Source

pub fn expect_database_type(&mut self) -> &mut Expectation

Create an Expectation for mocking the database_type method

Source

pub fn expect_placeholder(&mut self) -> &mut Expectation

Create an Expectation for mocking the placeholder method

Source

pub fn expect_supports_returning(&mut self) -> &mut Expectation

Create an Expectation for mocking the supports_returning method

Source

pub fn expect_supports_on_conflict(&mut self) -> &mut Expectation

Create an Expectation for mocking the supports_on_conflict method

Source

pub fn expect_execute(&mut self) -> &mut Expectation

Create an Expectation for mocking the execute method

Source

pub fn expect_fetch_one(&mut self) -> &mut Expectation

Create an Expectation for mocking the fetch_one method

Source

pub fn expect_fetch_all(&mut self) -> &mut Expectation

Create an Expectation for mocking the fetch_all method

Source

pub fn expect_fetch_optional(&mut self) -> &mut Expectation

Create an Expectation for mocking the fetch_optional method

Source

pub fn expect_begin(&mut self) -> &mut Expectation

Create an Expectation for mocking the begin method

Source

pub fn expect_as_any(&mut self) -> &mut Expectation

Create an Expectation for mocking the as_any method

Trait Implementations§

Source§

impl DatabaseBackend for MockDatabaseBackend

Source§

fn database_type(&self) -> DatabaseType

Returns the database type
Source§

fn placeholder(&self, index: usize) -> String

Generates a placeholder for the given parameter index (1-based)
Source§

fn supports_returning(&self) -> bool

Returns whether the database supports RETURNING clause
Source§

fn supports_on_conflict(&self) -> bool

Returns whether the database supports ON CONFLICT clause
Source§

fn execute<'life0, 'life1, 'async_trait>( &'life0 self, sql: &'life1 str, params: Vec<QueryValue>, ) -> Pin<Box<dyn Future<Output = Result<QueryResult>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Executes a query that modifies the database
Source§

fn fetch_one<'life0, 'life1, 'async_trait>( &'life0 self, sql: &'life1 str, params: Vec<QueryValue>, ) -> Pin<Box<dyn Future<Output = Result<Row>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Fetches a single row from the database
Source§

fn fetch_all<'life0, 'life1, 'async_trait>( &'life0 self, sql: &'life1 str, params: Vec<QueryValue>, ) -> Pin<Box<dyn Future<Output = Result<Vec<Row>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Fetches all matching rows from the database
Source§

fn fetch_optional<'life0, 'life1, 'async_trait>( &'life0 self, sql: &'life1 str, params: Vec<QueryValue>, ) -> Pin<Box<dyn Future<Output = Result<Option<Row>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Fetches an optional single row from the database
Source§

fn begin<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<Box<dyn TransactionExecutor>>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Begin a database transaction and return a dedicated executor Read more
Source§

fn as_any(&self) -> &dyn Any

Returns self as &dyn std::any::Any for downcasting
Source§

fn supports_transactional_ddl(&self) -> bool

Returns whether DDL statements can be rolled back in transactions Read more
Source§

fn begin_with_isolation<'life0, 'async_trait>( &'life0 self, isolation_level: IsolationLevel, ) -> Pin<Box<dyn Future<Output = Result<Box<dyn TransactionExecutor>, DatabaseError>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Begin a database transaction with a specific isolation level Read more
Source§

impl Default for MockDatabaseBackend

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Send for MockDatabaseBackend

Source§

impl Sync for MockDatabaseBackend

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Any for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Source§

fn type_name(&self) -> &'static str

Source§

impl<T> AnySync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more