10#include <gtest/gtest.h>
38 auto query = builder.
select({
"*"})
42 EXPECT_TRUE(query.find(
"SELECT") != std::string::npos);
43 EXPECT_TRUE(query.find(
"\"users\"") != std::string::npos);
50 auto query = builder.
select({
"*"})
54 EXPECT_TRUE(query.find(
"SELECT") != std::string::npos);
55 EXPECT_TRUE(query.find(
"[users]") != std::string::npos);
61TEST_F(UniversalQueryBuilderTest, MongoDBBuilder)
67 EXPECT_NO_THROW(builder.collection(
"users"));
72TEST_F(UniversalQueryBuilderTest, RedisBuilder)
76 auto query = builder.key(
"user:1")
79 EXPECT_TRUE(query.find(
"GET") != std::string::npos);
93 auto query = builder.
select({
"*"})
97 EXPECT_TRUE(query.find(
"[users]") != std::string::npos);
108 auto query = builder.
select({
"id",
"name",
"email"})
115 EXPECT_TRUE(query.find(
"SELECT") != std::string::npos);
116 EXPECT_TRUE(query.find(
"FROM") != std::string::npos);
117 EXPECT_TRUE(query.find(
"WHERE") != std::string::npos);
118 EXPECT_TRUE(query.find(
"ORDER BY") != std::string::npos);
119 EXPECT_TRUE(query.find(
"LIMIT") != std::string::npos);
126 auto query = builder.
select({
"u.id",
"u.name",
"o.total"})
128 .
join(
"orders o",
"u.id = o.user_id")
131 EXPECT_TRUE(query.find(
"JOIN") != std::string::npos);
142 std::map<std::string, core::database_value> data;
148 EXPECT_TRUE(query.find(
"INSERT INTO") != std::string::npos);
149 EXPECT_TRUE(query.find(
"VALUES") != std::string::npos);
156 auto query = builder.
update(
"users")
161 EXPECT_TRUE(query.find(
"UPDATE") != std::string::npos);
162 EXPECT_TRUE(query.find(
"SET") != std::string::npos);
163 EXPECT_TRUE(query.find(
"WHERE") != std::string::npos);
178 auto query = builder.
select({
"*"}).from(
"products").
build();
179 EXPECT_TRUE(query.find(
"products") != std::string::npos);
188TEST_F(UniversalQueryBuilderTest, MongoDBCollection)
194 EXPECT_NO_THROW(builder.collection(
"users").limit(10));
199TEST_F(UniversalQueryBuilderTest, RedisKey)
203 auto query = builder.key(
"user:1")
206 EXPECT_TRUE(query.find(
"GET") != std::string::npos);
207 EXPECT_TRUE(query.find(
"user:1") != std::string::npos);
220 auto query = builder.
build();
221 EXPECT_TRUE(query.empty());
230 auto query = builder.
select({
"*"})
234 EXPECT_TRUE(query.find(
"SELECT") != std::string::npos);
244 std::vector<database_types> sql_types = {
249 for (
auto db_type : sql_types) {
252 auto query = builder.
select({
"id",
"name"})
258 EXPECT_TRUE(query.find(
"SELECT") != std::string::npos);
259 EXPECT_TRUE(query.find(
"FROM") != std::string::npos);
260 EXPECT_TRUE(query.find(
"WHERE") != std::string::npos);
261 EXPECT_TRUE(query.find(
"LIMIT") != std::string::npos);
273 auto query = builder.
select({
"*"}).from(
"users").
build();
275 EXPECT_TRUE(query.empty());
288 auto& ref2 = ref1.
select({
"*"});
289 auto& ref3 = ref2.
from(
"users");
292 auto& ref6 = ref5.
limit(10);
294 auto query = ref6.
build();
295 EXPECT_TRUE(query.find(
"SELECT") != std::string::npos);
303TEST_F(UniversalQueryBuilderTest, MongoDBInsert)
307 std::map<std::string, core::database_value> data;
311 auto query = builder.collection(
"users")
312 .insert_into(
"users")
318 EXPECT_FALSE(query.empty());
330 auto query = builder.
select({
"*"})
335 EXPECT_TRUE(query.find(
"LIMIT 10") != std::string::npos);
340TEST_F(UniversalQueryBuilderTest, LimitForMongoDB)
346 EXPECT_NO_THROW(builder.collection(
"users").limit(10));
Universal query builder that adapts to different database types.
query_builder & select(const std::vector< std::string > &columns)
query_builder & for_database(database_types db_type)
std::string build() const
query_builder & where(const std::string &field, const std::string &op, const core::database_value &value)
query_builder & limit(size_t count)
query_builder & update(const std::string &table)
query_builder & from(const std::string &table)
query_builder & order_by(const std::string &column, sort_order order=sort_order::asc)
query_builder & set(const std::string &field, const core::database_value &value)
query_builder & join(const std::string &table, const std::string &condition, join_type type=join_type::inner)
query_builder & insert_into(const std::string &table)
query_builder & values(const std::map< std::string, core::database_value > &data)
std::variant< std::string, int64_t, double, bool, std::nullptr_t > database_value
TEST_F(SQLQueryBuilderTest, SimpleSelect)
@ none
No specific database type is set.
@ mongodb
Indicates a MongoDB database (future implementation).
@ sqlite
Indicates a SQLite database.
@ redis
Indicates a Redis database (future implementation).
@ postgres
Indicates a PostgreSQL database.