Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
database::testing::mock_database Class Reference

Configurable mock for database_backend interface. More...

#include <mock_database.h>

Inheritance diagram for database::testing::mock_database:
Inheritance graph
Collaboration diagram for database::testing::mock_database:
Collaboration graph

Public Member Functions

 mock_database ()
 
 ~mock_database () override=default
 
 mock_database (const mock_database &)=delete
 
mock_databaseoperator= (const mock_database &)=delete
 
 mock_database (mock_database &&other) noexcept
 
mock_databaseoperator= (mock_database &&other) noexcept
 
database_types type () const override
 Get the database type of this backend.
 
kcenon::common::VoidResult initialize (const core::connection_config &config) override
 Initialize the database backend.
 
kcenon::common::VoidResult shutdown () override
 Shutdown the database backend gracefully.
 
bool is_initialized () const override
 Check if backend is initialized and ready.
 
kcenon::common::Result< core::database_resultselect_query (const std::string &query_string) override
 Execute a SELECT query.
 
kcenon::common::VoidResult execute_query (const std::string &query_string) override
 Execute a general SQL query (DDL, DML)
 
kcenon::common::VoidResult begin_transaction () override
 Begin a transaction.
 
kcenon::common::VoidResult commit_transaction () override
 Commit the current transaction.
 
kcenon::common::VoidResult rollback_transaction () override
 Rollback the current transaction.
 
bool in_transaction () const override
 Check if backend is currently in a transaction.
 
std::string last_error () const override
 Get last error message from backend.
 
std::map< std::string, std::string > connection_info () const override
 Get backend-specific connection information.
 
mock_databaseset_database_type (database_types type)
 
mock_databaseset_connect_result (bool result)
 
mock_databaseset_default_select_result (const core::database_result &result)
 
mock_databaseset_default_rows_affected (uint64_t rows)
 
expectation_builder expect_query (const std::string &query)
 
expectation_builder expect_pattern (const std::string &regex_pattern)
 
expectation_builder expect_any ()
 
mock_databasesimulate_connection_failure ()
 
mock_databasesimulate_disconnect ()
 
bool verify_all_expectations () const
 
std::vector< std::string > get_executed_queries () const
 
size_t get_query_count () const
 
size_t get_query_count (const std::string &pattern) const
 
void reset ()
 
void clear_expectations ()
 
void clear_history ()
 
bool is_connected () const
 
std::string get_connection_string () const
 
- Public Member Functions inherited from database::core::database_backend
virtual ~database_backend ()=default
 
virtual kcenon::common::Result< database_resultselect_prepared (const std::string &query, const std::vector< database_value > &params)
 Execute a parameterized SELECT query (prepared statement)
 
virtual kcenon::common::VoidResult execute_prepared (const std::string &query, const std::vector< database_value > &params)
 Execute a parameterized DML/DDL query (prepared statement)
 

Private Member Functions

void record_query (const std::string &query)
 
expectationfind_expectation (const std::string &query)
 

Private Attributes

database_types db_type_
 
bool initialized_
 
bool connect_result_
 
bool in_transaction_
 
std::string connection_string_
 
core::database_result default_result_
 
uint64_t default_rows_affected_
 
std::string last_error_
 
std::vector< expectationexpectations_
 
std::vector< std::string > executed_queries_
 
std::mutex mutex_
 

Friends

class expectation_builder
 

Additional Inherited Members

- Static Protected Member Functions inherited from database::core::database_backend
static std::string expand_params (const std::string &query, const std::vector< database_value > &params)
 Expand positional parameters into a SQL string (fallback)
 

Detailed Description

Configurable mock for database_backend interface.

Features:

  • Set expected queries and results
  • Simulate errors and exceptions
  • Record all executed queries for verification
  • Pattern matching for flexible expectations

Example usage:

// Set up expectation
db.expect_query("SELECT * FROM users")
.will_return({{{"id", 1}, {"name", std::string("John")}}});
// Execute query
auto result = db.select_query("SELECT * FROM users");
// Verify
EXPECT_TRUE(db.verify_all_expectations());
expectation_builder & will_return(const core::database_result &result)
Configurable mock for database_backend interface.
kcenon::common::Result< core::database_result > select_query(const std::string &query_string) override
Execute a SELECT query.
expectation_builder expect_query(const std::string &query)

Definition at line 41 of file mock_database.h.

Constructor & Destructor Documentation

◆ mock_database() [1/3]

database::testing::mock_database::mock_database ( )

◆ ~mock_database()

database::testing::mock_database::~mock_database ( )
overridedefault

◆ mock_database() [2/3]

database::testing::mock_database::mock_database ( const mock_database & )
delete

◆ mock_database() [3/3]

database::testing::mock_database::mock_database ( mock_database && other)
noexcept

Definition at line 20 of file mock_database.cpp.

21 : db_type_(other.db_type_)
22 , initialized_(other.initialized_)
23 , connect_result_(other.connect_result_)
24 , in_transaction_(other.in_transaction_)
25 , connection_string_(std::move(other.connection_string_))
26 , default_result_(std::move(other.default_result_))
27 , default_rows_affected_(other.default_rows_affected_)
28 , last_error_(std::move(other.last_error_))
29 , expectations_(std::move(other.expectations_))
30 , executed_queries_(std::move(other.executed_queries_))
31{
32 other.initialized_ = false;
33 other.in_transaction_ = false;
34}
std::vector< std::string > executed_queries_
std::vector< expectation > expectations_
core::database_result default_result_

Member Function Documentation

◆ begin_transaction()

kcenon::common::VoidResult database::testing::mock_database::begin_transaction ( )
overridevirtual

Begin a transaction.

Returns
VoidResult::ok() on success, error on failure

Implements database::core::database_backend.

Definition at line 111 of file mock_database.cpp.

111 {
112 std::lock_guard<std::mutex> lock(mutex_);
113 if (in_transaction_) {
114 return kcenon::common::VoidResult::err(kcenon::common::error_info{"Transaction already active"});
115 }
116 in_transaction_ = true;
117 return kcenon::common::VoidResult::ok(std::monostate{});
118}

References in_transaction_, and mutex_.

◆ clear_expectations()

void database::testing::mock_database::clear_expectations ( )

Definition at line 235 of file mock_database.cpp.

235 {
236 std::lock_guard<std::mutex> lock(mutex_);
237 expectations_.clear();
238}

References expectations_, and mutex_.

◆ clear_history()

void database::testing::mock_database::clear_history ( )

Definition at line 240 of file mock_database.cpp.

240 {
241 std::lock_guard<std::mutex> lock(mutex_);
242 executed_queries_.clear();
243}

References executed_queries_, and mutex_.

◆ commit_transaction()

kcenon::common::VoidResult database::testing::mock_database::commit_transaction ( )
overridevirtual

Commit the current transaction.

Returns
VoidResult::ok() on success, error on failure

Implements database::core::database_backend.

Definition at line 120 of file mock_database.cpp.

120 {
121 std::lock_guard<std::mutex> lock(mutex_);
122 if (!in_transaction_) {
123 return kcenon::common::VoidResult::err(kcenon::common::error_info{"No active transaction"});
124 }
125 in_transaction_ = false;
126 return kcenon::common::VoidResult::ok(std::monostate{});
127}

References in_transaction_, and mutex_.

◆ connection_info()

std::map< std::string, std::string > database::testing::mock_database::connection_info ( ) const
overridevirtual

Get backend-specific connection information.

Returns
Map of connection properties (for debugging/monitoring)

Example keys: "server_version", "connection_id", "protocol_version"

Implements database::core::database_backend.

Definition at line 146 of file mock_database.cpp.

146 {
147 std::map<std::string, std::string> info;
148 info["connection_string"] = connection_string_;
149 info["initialized"] = initialized_ ? "true" : "false";
150 info["in_transaction"] = in_transaction_ ? "true" : "false";
151 return info;
152}
@ info
Informational messages (default)

References connection_string_, in_transaction_, and initialized_.

◆ execute_query()

kcenon::common::VoidResult database::testing::mock_database::execute_query ( const std::string & query_string)
overridevirtual

Execute a general SQL query (DDL, DML)

Parameters
query_stringSQL statement
Returns
VoidResult::ok() on success, error on failure

Implements database::core::database_backend.

Definition at line 94 of file mock_database.cpp.

94 {
95 std::lock_guard<std::mutex> lock(mutex_);
96 record_query(query_string);
97
98 if (auto* exp = find_expectation(query_string)) {
99 if (exp->should_throw()) {
100 last_error_ = exp->get_error_message();
101 return kcenon::common::VoidResult::err(kcenon::common::error_info{last_error_});
102 }
103 if (!exp->get_execute_result()) {
104 last_error_ = "Query execution failed";
105 return kcenon::common::VoidResult::err(kcenon::common::error_info{last_error_});
106 }
107 }
108 return kcenon::common::VoidResult::ok(std::monostate{});
109}
void record_query(const std::string &query)
expectation * find_expectation(const std::string &query)

References find_expectation(), last_error_, mutex_, and record_query().

Here is the call graph for this function:

◆ expect_any()

expectation_builder database::testing::mock_database::expect_any ( )

Definition at line 186 of file mock_database.cpp.

186 {
187 expectation exp;
188 exp.for_any();
189 return expectation_builder(this, std::move(exp));
190}

References expectation_builder, and database::testing::expectation::for_any().

Referenced by database::testing::mock_database_builder::failing_database().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ expect_pattern()

expectation_builder database::testing::mock_database::expect_pattern ( const std::string & regex_pattern)

Definition at line 180 of file mock_database.cpp.

180 {
181 expectation exp;
182 exp.for_pattern(regex_pattern);
183 return expectation_builder(this, std::move(exp));
184}

References expectation_builder, and database::testing::expectation::for_pattern().

Referenced by database::testing::mock_database_builder::with_data().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ expect_query()

expectation_builder database::testing::mock_database::expect_query ( const std::string & query)

Definition at line 174 of file mock_database.cpp.

174 {
175 expectation exp;
176 exp.for_query(query, match_type::EXACT);
177 return expectation_builder(this, std::move(exp));
178}
@ EXACT
Exact string match.

References database::testing::EXACT, expectation_builder, and database::testing::expectation::for_query().

Here is the call graph for this function:

◆ find_expectation()

expectation * database::testing::mock_database::find_expectation ( const std::string & query)
private

Definition at line 257 of file mock_database.cpp.

257 {
258 for (auto& exp : expectations_) {
259 if (exp.matches(query) && exp.can_be_invoked()) {
260 return &exp;
261 }
262 }
263 return nullptr;
264}

References expectations_.

Referenced by execute_query(), and select_query().

Here is the caller graph for this function:

◆ get_connection_string()

std::string database::testing::mock_database::get_connection_string ( ) const

Definition at line 249 of file mock_database.cpp.

249 {
250 return connection_string_;
251}

References connection_string_.

◆ get_executed_queries()

std::vector< std::string > database::testing::mock_database::get_executed_queries ( ) const

Definition at line 208 of file mock_database.cpp.

208 {
209 std::lock_guard<std::mutex> lock(mutex_);
210 return executed_queries_;
211}

References executed_queries_, and mutex_.

◆ get_query_count() [1/2]

size_t database::testing::mock_database::get_query_count ( ) const

Definition at line 213 of file mock_database.cpp.

213 {
214 std::lock_guard<std::mutex> lock(mutex_);
215 return executed_queries_.size();
216}

References executed_queries_, and mutex_.

◆ get_query_count() [2/2]

size_t database::testing::mock_database::get_query_count ( const std::string & pattern) const

Definition at line 218 of file mock_database.cpp.

218 {
219 std::lock_guard<std::mutex> lock(mutex_);
220 std::regex re(pattern);
221 return std::count_if(executed_queries_.begin(), executed_queries_.end(),
222 [&re](const std::string& q) { return std::regex_search(q, re); });
223}

References executed_queries_, and mutex_.

◆ in_transaction()

bool database::testing::mock_database::in_transaction ( ) const
overridevirtual

Check if backend is currently in a transaction.

Returns
true if transaction is active

Implements database::core::database_backend.

Definition at line 138 of file mock_database.cpp.

138 {
139 return in_transaction_;
140}

References in_transaction_.

◆ initialize()

kcenon::common::VoidResult database::testing::mock_database::initialize ( const core::connection_config & config)
overridevirtual

Initialize the database backend.

Parameters
configConnection configuration
Returns
VoidResult::ok() on success, error on failure

This method should:

  • Establish database connection
  • Validate connection parameters
  • Set up connection pooling if applicable
  • Initialize backend-specific resources

Implements database::core::database_backend.

Definition at line 58 of file mock_database.cpp.

58 {
59 std::lock_guard<std::mutex> lock(mutex_);
60 connection_string_ = config.host + ":" + std::to_string(config.port) + "/" + config.database;
61 if (connect_result_) {
62 initialized_ = true;
63 return kcenon::common::VoidResult::ok(std::monostate{});
64 }
65 last_error_ = "Connection failed";
66 return kcenon::common::VoidResult::err(kcenon::common::error_info{"Connection failed"});
67}

References connect_result_, connection_string_, database::core::connection_config::database, database::core::connection_config::host, initialized_, last_error_, mutex_, and database::core::connection_config::port.

Referenced by database::testing::scoped_test_database::scoped_test_database().

Here is the caller graph for this function:

◆ is_connected()

bool database::testing::mock_database::is_connected ( ) const

Definition at line 245 of file mock_database.cpp.

245 {
246 return initialized_;
247}

References initialized_.

◆ is_initialized()

bool database::testing::mock_database::is_initialized ( ) const
overridevirtual

Check if backend is initialized and ready.

Returns
true if initialized and can accept queries

Implements database::core::database_backend.

Definition at line 76 of file mock_database.cpp.

76 {
77 return initialized_;
78}

References initialized_.

◆ last_error()

std::string database::testing::mock_database::last_error ( ) const
overridevirtual

Get last error message from backend.

Returns
Error message, or empty string if no error

Implements database::core::database_backend.

Definition at line 142 of file mock_database.cpp.

142 {
143 return last_error_;
144}

References last_error_.

◆ operator=() [1/2]

mock_database & database::testing::mock_database::operator= ( const mock_database & )
delete

◆ operator=() [2/2]

mock_database & database::testing::mock_database::operator= ( mock_database && other)
noexcept

Definition at line 36 of file mock_database.cpp.

36 {
37 if (this != &other) {
38 db_type_ = other.db_type_;
39 initialized_ = other.initialized_;
40 connect_result_ = other.connect_result_;
41 in_transaction_ = other.in_transaction_;
42 connection_string_ = std::move(other.connection_string_);
43 default_result_ = std::move(other.default_result_);
44 default_rows_affected_ = other.default_rows_affected_;
45 last_error_ = std::move(other.last_error_);
46 expectations_ = std::move(other.expectations_);
47 executed_queries_ = std::move(other.executed_queries_);
48 other.initialized_ = false;
49 other.in_transaction_ = false;
50 }
51 return *this;
52}

◆ record_query()

void database::testing::mock_database::record_query ( const std::string & query)
private

Definition at line 253 of file mock_database.cpp.

253 {
254 executed_queries_.push_back(query);
255}

References executed_queries_.

Referenced by execute_query(), and select_query().

Here is the caller graph for this function:

◆ reset()

void database::testing::mock_database::reset ( )

Definition at line 225 of file mock_database.cpp.

225 {
226 std::lock_guard<std::mutex> lock(mutex_);
227 expectations_.clear();
228 executed_queries_.clear();
229 initialized_ = false;
230 in_transaction_ = false;
231 connection_string_.clear();
232 last_error_.clear();
233}

References connection_string_, executed_queries_, expectations_, in_transaction_, initialized_, last_error_, and mutex_.

Referenced by database::testing::scoped_test_database::~scoped_test_database().

Here is the caller graph for this function:

◆ rollback_transaction()

kcenon::common::VoidResult database::testing::mock_database::rollback_transaction ( )
overridevirtual

Rollback the current transaction.

Returns
VoidResult::ok() on success, error on failure

Implements database::core::database_backend.

Definition at line 129 of file mock_database.cpp.

129 {
130 std::lock_guard<std::mutex> lock(mutex_);
131 if (!in_transaction_) {
132 return kcenon::common::VoidResult::err(kcenon::common::error_info{"No active transaction"});
133 }
134 in_transaction_ = false;
135 return kcenon::common::VoidResult::ok(std::monostate{});
136}

References in_transaction_, and mutex_.

◆ select_query()

kcenon::common::Result< core::database_result > database::testing::mock_database::select_query ( const std::string & query_string)
overridevirtual

Execute a SELECT query.

Parameters
query_stringSQL SELECT statement
Returns
Query results as rows, or error

Implements database::core::database_backend.

Definition at line 80 of file mock_database.cpp.

80 {
81 std::lock_guard<std::mutex> lock(mutex_);
82 record_query(query_string);
83
84 if (auto* exp = find_expectation(query_string)) {
85 if (exp->should_throw()) {
86 last_error_ = exp->get_error_message();
87 return kcenon::common::Result<core::database_result>::err(kcenon::common::error_info{last_error_});
88 }
89 return kcenon::common::Result<core::database_result>::ok(exp->get_result());
90 }
91 return kcenon::common::Result<core::database_result>::ok(default_result_);
92}

References default_result_, find_expectation(), last_error_, mutex_, and record_query().

Here is the call graph for this function:

◆ set_connect_result()

mock_database & database::testing::mock_database::set_connect_result ( bool result)

Definition at line 159 of file mock_database.cpp.

159 {
160 connect_result_ = result;
161 return *this;
162}

References connect_result_.

◆ set_database_type()

mock_database & database::testing::mock_database::set_database_type ( database_types type)

Definition at line 154 of file mock_database.cpp.

154 {
155 db_type_ = type;
156 return *this;
157}
database_types type() const override
Get the database type of this backend.

References db_type_, and type().

Here is the call graph for this function:

◆ set_default_rows_affected()

mock_database & database::testing::mock_database::set_default_rows_affected ( uint64_t rows)

Definition at line 169 of file mock_database.cpp.

169 {
171 return *this;
172}

References default_rows_affected_.

◆ set_default_select_result()

mock_database & database::testing::mock_database::set_default_select_result ( const core::database_result & result)

Definition at line 164 of file mock_database.cpp.

164 {
165 default_result_ = result;
166 return *this;
167}

References default_result_.

◆ shutdown()

kcenon::common::VoidResult database::testing::mock_database::shutdown ( )
overridevirtual

Shutdown the database backend gracefully.

Returns
VoidResult::ok() on success, error on failure

This method should:

  • Close active connections
  • Release connection pool resources
  • Flush pending transactions
  • Clean up backend-specific resources

Implements database::core::database_backend.

Definition at line 69 of file mock_database.cpp.

69 {
70 std::lock_guard<std::mutex> lock(mutex_);
71 initialized_ = false;
72 in_transaction_ = false;
73 return kcenon::common::VoidResult::ok(std::monostate{});
74}

References in_transaction_, initialized_, and mutex_.

Referenced by database::testing::scoped_test_database::~scoped_test_database().

Here is the caller graph for this function:

◆ simulate_connection_failure()

mock_database & database::testing::mock_database::simulate_connection_failure ( )

Definition at line 192 of file mock_database.cpp.

192 {
193 connect_result_ = false;
194 return *this;
195}

References connect_result_.

◆ simulate_disconnect()

mock_database & database::testing::mock_database::simulate_disconnect ( )

Definition at line 197 of file mock_database.cpp.

197 {
198 initialized_ = false;
199 return *this;
200}

References initialized_.

◆ type()

database_types database::testing::mock_database::type ( ) const
overridevirtual

Get the database type of this backend.

Returns
Database type identifier

Implements database::core::database_backend.

Definition at line 54 of file mock_database.cpp.

54 {
55 return db_type_;
56}

References db_type_.

Referenced by set_database_type().

Here is the caller graph for this function:

◆ verify_all_expectations()

bool database::testing::mock_database::verify_all_expectations ( ) const

Definition at line 202 of file mock_database.cpp.

202 {
203 std::lock_guard<std::mutex> lock(mutex_);
204 return std::all_of(expectations_.begin(), expectations_.end(),
205 [](const expectation& exp) { return exp.is_satisfied(); });
206}

References expectations_, and mutex_.

Friends And Related Symbol Documentation

◆ expectation_builder

friend class expectation_builder
friend

Definition at line 97 of file mock_database.h.

Referenced by expect_any(), expect_pattern(), and expect_query().

Member Data Documentation

◆ connect_result_

bool database::testing::mock_database::connect_result_
private

Definition at line 101 of file mock_database.h.

Referenced by initialize(), set_connect_result(), and simulate_connection_failure().

◆ connection_string_

std::string database::testing::mock_database::connection_string_
private

Definition at line 103 of file mock_database.h.

Referenced by connection_info(), get_connection_string(), initialize(), and reset().

◆ db_type_

database_types database::testing::mock_database::db_type_
private

Definition at line 99 of file mock_database.h.

Referenced by set_database_type(), and type().

◆ default_result_

core::database_result database::testing::mock_database::default_result_
private

Definition at line 104 of file mock_database.h.

Referenced by select_query(), and set_default_select_result().

◆ default_rows_affected_

uint64_t database::testing::mock_database::default_rows_affected_
private

Definition at line 105 of file mock_database.h.

Referenced by set_default_rows_affected().

◆ executed_queries_

std::vector<std::string> database::testing::mock_database::executed_queries_
private

◆ expectations_

◆ in_transaction_

bool database::testing::mock_database::in_transaction_
private

◆ initialized_

bool database::testing::mock_database::initialized_
private

◆ last_error_

std::string database::testing::mock_database::last_error_
private

Definition at line 106 of file mock_database.h.

Referenced by execute_query(), initialize(), last_error(), reset(), and select_query().

◆ mutex_


The documentation for this class was generated from the following files: