14 , connect_result_(true)
15 , in_transaction_(false)
16 , default_rows_affected_(1)
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_))
32 other.initialized_ =
false;
33 other.in_transaction_ =
false;
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;
59 std::lock_guard<std::mutex> lock(
mutex_);
63 return kcenon::common::VoidResult::ok(std::monostate{});
66 return kcenon::common::VoidResult::err(kcenon::common::error_info{
"Connection failed"});
70 std::lock_guard<std::mutex> lock(
mutex_);
73 return kcenon::common::VoidResult::ok(std::monostate{});
81 std::lock_guard<std::mutex> lock(
mutex_);
85 if (exp->should_throw()) {
87 return kcenon::common::Result<core::database_result>::err(kcenon::common::error_info{
last_error_});
89 return kcenon::common::Result<core::database_result>::ok(exp->get_result());
91 return kcenon::common::Result<core::database_result>::ok(
default_result_);
95 std::lock_guard<std::mutex> lock(
mutex_);
99 if (exp->should_throw()) {
101 return kcenon::common::VoidResult::err(kcenon::common::error_info{
last_error_});
103 if (!exp->get_execute_result()) {
105 return kcenon::common::VoidResult::err(kcenon::common::error_info{
last_error_});
108 return kcenon::common::VoidResult::ok(std::monostate{});
112 std::lock_guard<std::mutex> lock(
mutex_);
114 return kcenon::common::VoidResult::err(kcenon::common::error_info{
"Transaction already active"});
117 return kcenon::common::VoidResult::ok(std::monostate{});
121 std::lock_guard<std::mutex> lock(
mutex_);
123 return kcenon::common::VoidResult::err(kcenon::common::error_info{
"No active transaction"});
126 return kcenon::common::VoidResult::ok(std::monostate{});
130 std::lock_guard<std::mutex> lock(
mutex_);
132 return kcenon::common::VoidResult::err(kcenon::common::error_info{
"No active transaction"});
135 return kcenon::common::VoidResult::ok(std::monostate{});
147 std::map<std::string, std::string> info;
203 std::lock_guard<std::mutex> lock(
mutex_);
205 [](
const expectation& exp) { return exp.is_satisfied(); });
209 std::lock_guard<std::mutex> lock(
mutex_);
214 std::lock_guard<std::mutex> lock(
mutex_);
219 std::lock_guard<std::mutex> lock(
mutex_);
220 std::regex re(pattern);
222 [&re](
const std::string& q) { return std::regex_search(q, re); });
226 std::lock_guard<std::mutex> lock(
mutex_);
236 std::lock_guard<std::mutex> lock(
mutex_);
241 std::lock_guard<std::mutex> lock(
mutex_);
259 if (exp.matches(query) && exp.can_be_invoked()) {
289 mock_->set_database_type(type);
294 mock_->set_default_select_result(result);
299 mock_->simulate_connection_failure();
304 return std::move(*
mock_);
Fluent builder for expectations.
expectation_builder & will_return(const core::database_result &result)
expectation_builder & will_fail(const std::string &error_message)
Single query expectation with configurable behavior.
expectation & for_pattern(const std::string &pattern)
expectation & for_query(const std::string &query, match_type type=match_type::EXACT)
Builder for common mock configurations.
std::unique_ptr< mock_database > mock_
static mock_database with_data(const std::string &table_name, const core::database_result &data)
mock_database_builder & with_type(database_types type)
mock_database_builder & with_default_result(const core::database_result &result)
static mock_database failing_database(const std::string &error="Mock database error")
mock_database_builder & that_fails_on_connect()
static mock_database empty_database()
Configurable mock for database_backend interface.
kcenon::common::VoidResult initialize(const core::connection_config &config) override
Initialize the database backend.
mock_database & set_default_select_result(const core::database_result &result)
std::vector< std::string > executed_queries_
std::string connection_string_
void record_query(const std::string &query)
friend class expectation_builder
mock_database & simulate_disconnect()
std::map< std::string, std::string > connection_info() const override
Get backend-specific connection information.
bool is_connected() const
std::vector< expectation > expectations_
mock_database & set_database_type(database_types type)
expectation_builder expect_pattern(const std::string ®ex_pattern)
std::string last_error() const override
Get last error message from backend.
kcenon::common::Result< core::database_result > select_query(const std::string &query_string) override
Execute a SELECT query.
kcenon::common::VoidResult rollback_transaction() override
Rollback the current transaction.
mock_database & operator=(const mock_database &)=delete
expectation_builder expect_query(const std::string &query)
mock_database & set_connect_result(bool result)
mock_database & simulate_connection_failure()
std::vector< std::string > get_executed_queries() const
void clear_expectations()
bool is_initialized() const override
Check if backend is initialized and ready.
kcenon::common::VoidResult execute_query(const std::string &query_string) override
Execute a general SQL query (DDL, DML)
kcenon::common::VoidResult commit_transaction() override
Commit the current transaction.
size_t get_query_count() const
expectation_builder expect_any()
kcenon::common::VoidResult shutdown() override
Shutdown the database backend gracefully.
core::database_result default_result_
std::string get_connection_string() const
bool in_transaction() const override
Check if backend is currently in a transaction.
database_types type() const override
Get the database type of this backend.
expectation * find_expectation(const std::string &query)
mock_database & set_default_rows_affected(uint64_t rows)
bool verify_all_expectations() const
kcenon::common::VoidResult begin_transaction() override
Begin a transaction.
uint64_t default_rows_affected_
std::vector< database_row > database_result
@ EXACT
Exact string match.
database_types
Represents various database backends or modes.
@ none
No specific database type is set.
Configuration for database connection.