103 lines
2.5 KiB
C++
103 lines
2.5 KiB
C++
#include <catch2/catch_test_macros.hpp>
|
|
|
|
#include "matador/sql/column.hpp"
|
|
#include "matador/sql/condition.hpp"
|
|
#include "matador/sql/connection_info.hpp"
|
|
#include "matador/sql/connection_pool.hpp"
|
|
#include "matador/sql/session.hpp"
|
|
|
|
#include "connection.hpp"
|
|
|
|
#include "models/airplane.hpp"
|
|
|
|
using namespace matador::sql;
|
|
using namespace matador::test;
|
|
|
|
class StatementTestFixture
|
|
{
|
|
public:
|
|
StatementTestFixture()
|
|
: pool(matador::test::connection::dns, 4), ses(pool)
|
|
{
|
|
ses.create().table<airplane>("airplane").execute();
|
|
}
|
|
|
|
~StatementTestFixture()
|
|
{
|
|
drop_table_if_exists("airplane");
|
|
}
|
|
|
|
protected:
|
|
matador::sql::connection_pool<matador::sql::connection> pool;
|
|
matador::sql::session ses;
|
|
|
|
std::vector<entity<airplane>> planes{
|
|
make_entity<airplane>(1, "Airbus", "A380"),
|
|
make_entity<airplane>(2, "Boeing", "707"),
|
|
make_entity<airplane>(3, "Boeing", "747")
|
|
};
|
|
|
|
private:
|
|
void drop_table_if_exists(const std::string &table_name) {
|
|
if (ses.table_exists(table_name)) {
|
|
ses.drop().table(table_name).execute();
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
TEST_CASE_METHOD(StatementTestFixture, " Create prepared statement", "[statement]")
|
|
{
|
|
SECTION("Insert with prepared statement and placeholder") {
|
|
auto stmt = ses.insert()
|
|
.into<airplane>("airplane")
|
|
.values<airplane>().prepare();
|
|
|
|
for (const auto &plane: planes) {
|
|
auto res = stmt.bind(*plane).execute();
|
|
REQUIRE(res == 1);
|
|
stmt.reset();
|
|
}
|
|
|
|
auto result = ses.select<airplane>().from("airplane").fetch_all<airplane>();
|
|
|
|
size_t index{0};
|
|
for (const auto &i: result) {
|
|
REQUIRE(i.id == planes[index]->id);
|
|
REQUIRE(i.brand == planes[index]->brand);
|
|
REQUIRE(i.model == planes[index++]->model);
|
|
}
|
|
}
|
|
|
|
SECTION("Select with prepared statement") {
|
|
for (const auto &plane: planes) {
|
|
auto res = ses.insert().into<airplane>("airplane").values(*plane).execute();
|
|
REQUIRE(res == 1);
|
|
}
|
|
|
|
auto stmt = ses.select<airplane>().from("airplane").where("brand"_col == _).prepare();
|
|
|
|
stmt.bind(0, "Airbus");
|
|
|
|
auto result = stmt.fetch<airplane>();
|
|
|
|
for (const auto &i: result) {
|
|
REQUIRE(i.id == planes[0]->id);
|
|
REQUIRE(i.brand == planes[0]->brand);
|
|
REQUIRE(i.model == planes[0]->model);
|
|
}
|
|
|
|
stmt.reset();
|
|
|
|
stmt.bind(0, "Boeing");
|
|
|
|
result = stmt.fetch<airplane>();
|
|
|
|
size_t index{1};
|
|
for (const auto &i: result) {
|
|
REQUIRE(i.id == planes[index]->id);
|
|
REQUIRE(i.brand == planes[index]->brand);
|
|
REQUIRE(i.model == planes[index++]->model);
|
|
}
|
|
}
|
|
} |