Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
database::query::tests Namespace Reference

Classes

class  CrossDialectTest
 
class  PostgreSQLDialectTest
 
class  SQLiteDialectTest
 

Functions

 TEST_F (PostgreSQLDialectTest, PlaceholderStyle)
 
 TEST_F (PostgreSQLDialectTest, QuoteIdentifier)
 
 TEST_F (PostgreSQLDialectTest, QuoteIdentifierWithSpecialChars)
 
 TEST_F (PostgreSQLDialectTest, EscapeString)
 
 TEST_F (PostgreSQLDialectTest, ReturningClause)
 
 TEST_F (PostgreSQLDialectTest, UpsertClause)
 
 TEST_F (PostgreSQLDialectTest, UpsertClauseDoNothing)
 
 TEST_F (PostgreSQLDialectTest, UpsertClauseMultipleConflictColumns)
 
 TEST_F (PostgreSQLDialectTest, SupportsFeatureReturning)
 
 TEST_F (SQLiteDialectTest, PlaceholderStyle)
 
 TEST_F (SQLiteDialectTest, QuoteIdentifier)
 
 TEST_F (SQLiteDialectTest, QuoteIdentifierWithQuotes)
 
 TEST_F (SQLiteDialectTest, EscapeString)
 
 TEST_F (SQLiteDialectTest, ReturningClause)
 
 TEST_F (SQLiteDialectTest, UpsertClause)
 
 TEST_F (SQLiteDialectTest, UpsertClauseDoNothing)
 
 TEST_F (SQLiteDialectTest, SupportsFeatureReturning)
 
 TEST_F (SQLiteDialectTest, LimitClauseSyntax)
 
 TEST (SqlDialectFactoryTest, CreatePostgreSQLDialect)
 
 TEST (SqlDialectFactoryTest, CreateSQLiteDialect)
 
 TEST (SqlDialectFactoryTest, CreateUnsupportedDialectThrows)
 
 TEST_F (CrossDialectTest, PlaceholderStylesDiffer)
 
 TEST_F (CrossDialectTest, QuoteIdentifierStyles)
 
 TEST_F (CrossDialectTest, ConcatOperatorDiffers)
 
 TEST_F (CrossDialectTest, AutoIncrementSyntax)
 
 TEST_F (CrossDialectTest, CurrentTimestampFunction)
 

Function Documentation

◆ TEST() [1/3]

database::query::tests::TEST ( SqlDialectFactoryTest ,
CreatePostgreSQLDialect  )

Definition at line 205 of file sql_dialect_test.cpp.

206{
207 auto dialect = sql_dialect::create(database_types::postgres);
208 ASSERT_NE(dialect, nullptr);
209 EXPECT_EQ(dialect->placeholder(1), "$1");
210}

References database::query::sql_dialect::create(), and database::postgres.

Here is the call graph for this function:

◆ TEST() [2/3]

database::query::tests::TEST ( SqlDialectFactoryTest ,
CreateSQLiteDialect  )

Definition at line 212 of file sql_dialect_test.cpp.

213{
214 auto dialect = sql_dialect::create(database_types::sqlite);
215 ASSERT_NE(dialect, nullptr);
216 EXPECT_EQ(dialect->placeholder(1), "?1");
217}

References database::query::sql_dialect::create(), and database::sqlite.

Here is the call graph for this function:

◆ TEST() [3/3]

database::query::tests::TEST ( SqlDialectFactoryTest ,
CreateUnsupportedDialectThrows  )

Definition at line 219 of file sql_dialect_test.cpp.

220{
221 EXPECT_THROW(
222 sql_dialect::create(database_types::mongodb),
223 std::invalid_argument
224 );
225 EXPECT_THROW(
226 sql_dialect::create(database_types::redis),
227 std::invalid_argument
228 );
229}

References database::query::sql_dialect::create(), database::mongodb, and database::redis.

Here is the call graph for this function:

◆ TEST_F() [1/23]

database::query::tests::TEST_F ( CrossDialectTest ,
AutoIncrementSyntax  )

Definition at line 270 of file sql_dialect_test.cpp.

271{
272 EXPECT_EQ(postgres_->auto_increment(), "SERIAL");
273 EXPECT_EQ(sqlite_->auto_increment(), "AUTOINCREMENT");
274}

◆ TEST_F() [2/23]

database::query::tests::TEST_F ( CrossDialectTest ,
ConcatOperatorDiffers  )

Definition at line 263 of file sql_dialect_test.cpp.

264{
265 // PostgreSQL and SQLite use ||
266 EXPECT_EQ(postgres_->concat_operator(), "||");
267 EXPECT_EQ(sqlite_->concat_operator(), "||");
268}

◆ TEST_F() [3/23]

database::query::tests::TEST_F ( CrossDialectTest ,
CurrentTimestampFunction  )

Definition at line 276 of file sql_dialect_test.cpp.

277{
278 EXPECT_EQ(postgres_->current_timestamp(), "CURRENT_TIMESTAMP");
279 EXPECT_EQ(sqlite_->current_timestamp(), "CURRENT_TIMESTAMP");
280}

◆ TEST_F() [4/23]

database::query::tests::TEST_F ( CrossDialectTest ,
PlaceholderStylesDiffer  )

Definition at line 248 of file sql_dialect_test.cpp.

249{
250 // Both dialects should produce different placeholders
251 EXPECT_NE(postgres_->placeholder(1), sqlite_->placeholder(1));
252}

◆ TEST_F() [5/23]

database::query::tests::TEST_F ( CrossDialectTest ,
QuoteIdentifierStyles  )

Definition at line 254 of file sql_dialect_test.cpp.

255{
256 std::string col = "user_id";
257
258 // PostgreSQL and SQLite use double quotes
259 EXPECT_EQ(postgres_->quote_identifier(col), "\"user_id\"");
260 EXPECT_EQ(sqlite_->quote_identifier(col), "\"user_id\"");
261}

◆ TEST_F() [6/23]

database::query::tests::TEST_F ( PostgreSQLDialectTest ,
EscapeString  )

Definition at line 60 of file sql_dialect_test.cpp.

61{
62 EXPECT_EQ(dialect_->escape_string("hello"), "hello");
63 EXPECT_EQ(dialect_->escape_string("it's"), "it''s"); // Single quote doubled
64 EXPECT_EQ(dialect_->escape_string("back\\slash"), "back\\\\slash"); // Backslash escaped
65 EXPECT_EQ(dialect_->escape_string("O'Brien's"), "O''Brien''s");
66}

◆ TEST_F() [7/23]

database::query::tests::TEST_F ( PostgreSQLDialectTest ,
PlaceholderStyle  )

Definition at line 39 of file sql_dialect_test.cpp.

40{
41 EXPECT_EQ(dialect_->placeholder(1), "$1");
42 EXPECT_EQ(dialect_->placeholder(2), "$2");
43 EXPECT_EQ(dialect_->placeholder(10), "$10");
44 EXPECT_EQ(dialect_->placeholder(100), "$100");
45}

◆ TEST_F() [8/23]

database::query::tests::TEST_F ( PostgreSQLDialectTest ,
QuoteIdentifier  )

Definition at line 47 of file sql_dialect_test.cpp.

48{
49 EXPECT_EQ(dialect_->quote_identifier("users"), "\"users\"");
50 EXPECT_EQ(dialect_->quote_identifier("user_name"), "\"user_name\"");
51 EXPECT_EQ(dialect_->quote_identifier("SELECT"), "\"SELECT\""); // Reserved word
52}

◆ TEST_F() [9/23]

database::query::tests::TEST_F ( PostgreSQLDialectTest ,
QuoteIdentifierWithSpecialChars  )

Definition at line 54 of file sql_dialect_test.cpp.

55{
56 // Double quotes should be escaped by doubling
57 EXPECT_EQ(dialect_->quote_identifier("user\"name"), "\"user\"\"name\"");
58}

◆ TEST_F() [10/23]

database::query::tests::TEST_F ( PostgreSQLDialectTest ,
ReturningClause  )

Definition at line 68 of file sql_dialect_test.cpp.

69{
70 EXPECT_EQ(dialect_->returning_clause("id"), " RETURNING \"id\"");
71 EXPECT_EQ(dialect_->returning_clause(""), " RETURNING *");
72}

◆ TEST_F() [11/23]

database::query::tests::TEST_F ( PostgreSQLDialectTest ,
SupportsFeatureReturning  )

Definition at line 108 of file sql_dialect_test.cpp.

109{
110 EXPECT_TRUE(dialect_->supports_feature("returning"));
111 EXPECT_TRUE(dialect_->supports_feature("upsert"));
112 EXPECT_TRUE(dialect_->supports_feature("full_outer_join"));
113}

◆ TEST_F() [12/23]

database::query::tests::TEST_F ( PostgreSQLDialectTest ,
UpsertClause  )

Definition at line 74 of file sql_dialect_test.cpp.

75{
76 std::vector<std::string> conflict_cols = {"id"};
77 std::vector<std::string> update_cols = {"name", "email"};
78
79 std::string result = dialect_->upsert_clause(conflict_cols, update_cols);
80
81 EXPECT_TRUE(result.find("ON CONFLICT") != std::string::npos);
82 EXPECT_TRUE(result.find("\"id\"") != std::string::npos);
83 EXPECT_TRUE(result.find("DO UPDATE SET") != std::string::npos);
84 EXPECT_TRUE(result.find("EXCLUDED") != std::string::npos);
85}

◆ TEST_F() [13/23]

database::query::tests::TEST_F ( PostgreSQLDialectTest ,
UpsertClauseDoNothing  )

Definition at line 87 of file sql_dialect_test.cpp.

88{
89 std::vector<std::string> conflict_cols = {"id"};
90 std::vector<std::string> update_cols; // Empty = DO NOTHING
91
92 std::string result = dialect_->upsert_clause(conflict_cols, update_cols);
93
94 EXPECT_TRUE(result.find("DO NOTHING") != std::string::npos);
95}

◆ TEST_F() [14/23]

database::query::tests::TEST_F ( PostgreSQLDialectTest ,
UpsertClauseMultipleConflictColumns  )

Definition at line 97 of file sql_dialect_test.cpp.

98{
99 std::vector<std::string> conflict_cols = {"tenant_id", "user_id"};
100 std::vector<std::string> update_cols = {"updated_at"};
101
102 std::string result = dialect_->upsert_clause(conflict_cols, update_cols);
103
104 EXPECT_TRUE(result.find("\"tenant_id\"") != std::string::npos);
105 EXPECT_TRUE(result.find("\"user_id\"") != std::string::npos);
106}

◆ TEST_F() [15/23]

database::query::tests::TEST_F ( SQLiteDialectTest ,
EscapeString  )

Definition at line 151 of file sql_dialect_test.cpp.

152{
153 EXPECT_EQ(dialect_->escape_string("hello"), "hello");
154 EXPECT_EQ(dialect_->escape_string("it's"), "it''s"); // Single quote doubled
155 EXPECT_EQ(dialect_->escape_string("O'Brien's"), "O''Brien''s");
156}

◆ TEST_F() [16/23]

database::query::tests::TEST_F ( SQLiteDialectTest ,
LimitClauseSyntax  )

Definition at line 195 of file sql_dialect_test.cpp.

196{
197 EXPECT_EQ(dialect_->limit_clause(10, 0), "LIMIT 10");
198 EXPECT_EQ(dialect_->limit_clause(10, 20), "LIMIT 10 OFFSET 20");
199}

◆ TEST_F() [17/23]

database::query::tests::TEST_F ( SQLiteDialectTest ,
PlaceholderStyle  )

Definition at line 130 of file sql_dialect_test.cpp.

131{
132 // SQLite uses ?N numbered placeholders
133 EXPECT_EQ(dialect_->placeholder(1), "?1");
134 EXPECT_EQ(dialect_->placeholder(2), "?2");
135 EXPECT_EQ(dialect_->placeholder(10), "?10");
136}

◆ TEST_F() [18/23]

database::query::tests::TEST_F ( SQLiteDialectTest ,
QuoteIdentifier  )

Definition at line 138 of file sql_dialect_test.cpp.

139{
140 EXPECT_EQ(dialect_->quote_identifier("users"), "\"users\"");
141 EXPECT_EQ(dialect_->quote_identifier("user_name"), "\"user_name\"");
142 EXPECT_EQ(dialect_->quote_identifier("SELECT"), "\"SELECT\"");
143}

◆ TEST_F() [19/23]

database::query::tests::TEST_F ( SQLiteDialectTest ,
QuoteIdentifierWithQuotes  )

Definition at line 145 of file sql_dialect_test.cpp.

146{
147 // Double quotes should be escaped by doubling
148 EXPECT_EQ(dialect_->quote_identifier("user\"name"), "\"user\"\"name\"");
149}

◆ TEST_F() [20/23]

database::query::tests::TEST_F ( SQLiteDialectTest ,
ReturningClause  )

Definition at line 158 of file sql_dialect_test.cpp.

159{
160 // SQLite 3.35+ supports RETURNING
161 EXPECT_EQ(dialect_->returning_clause("id"), " RETURNING \"id\"");
162 EXPECT_EQ(dialect_->returning_clause(""), " RETURNING *");
163}

◆ TEST_F() [21/23]

database::query::tests::TEST_F ( SQLiteDialectTest ,
SupportsFeatureReturning  )

Definition at line 188 of file sql_dialect_test.cpp.

189{
190 EXPECT_TRUE(dialect_->supports_feature("returning"));
191 EXPECT_TRUE(dialect_->supports_feature("upsert"));
192 EXPECT_FALSE(dialect_->supports_feature("full_outer_join"));
193}

◆ TEST_F() [22/23]

database::query::tests::TEST_F ( SQLiteDialectTest ,
UpsertClause  )

Definition at line 165 of file sql_dialect_test.cpp.

166{
167 std::vector<std::string> conflict_cols = {"id"};
168 std::vector<std::string> update_cols = {"name", "email"};
169
170 std::string result = dialect_->upsert_clause(conflict_cols, update_cols);
171
172 EXPECT_TRUE(result.find("ON CONFLICT") != std::string::npos);
173 EXPECT_TRUE(result.find("\"id\"") != std::string::npos);
174 EXPECT_TRUE(result.find("DO UPDATE SET") != std::string::npos);
175 EXPECT_TRUE(result.find("excluded") != std::string::npos); // SQLite uses lowercase
176}

◆ TEST_F() [23/23]

database::query::tests::TEST_F ( SQLiteDialectTest ,
UpsertClauseDoNothing  )

Definition at line 178 of file sql_dialect_test.cpp.

179{
180 std::vector<std::string> conflict_cols = {"id"};
181 std::vector<std::string> update_cols;
182
183 std::string result = dialect_->upsert_clause(conflict_cols, update_cols);
184
185 EXPECT_TRUE(result.find("DO NOTHING") != std::string::npos);
186}