#include #include #include #include using namespace matador::sql; TEST_CASE("Create and drop table statement", "[session record]") { connection_pool pool("sqlite://sqlite.db", 4); session s(pool); auto res = s.create() .table("person", { make_pk_column("id"), make_column("name", 255), make_column("age") }) .execute(); REQUIRE(res.second == R"(CREATE TABLE "person" ("id" BIGINT NOT NULL, "name" VARCHAR(255), "age" INTEGER, CONSTRAINT PK_person PRIMARY KEY (id)))"); res = s.drop() .table("person") .execute(); REQUIRE(res.second == R"(DROP TABLE "person")"); } TEST_CASE("Execute insert record statement", "[session record]") { connection_pool pool("sqlite://sqlite.db", 4); session s(pool); auto res = s.create() .table("person", { make_pk_column("id"), make_column("name", 255), make_column("age") }) .execute(); REQUIRE(res.first == 0); res = s.insert() .into("person", {"id", "name", "age"}) .values({7, "george", 45}) .execute(); REQUIRE(res.first == 1); REQUIRE(res.second == R"(INSERT INTO "person" ("id", "name", "age") VALUES (7, 'george', 45))"); auto result = s.select({"id", "name", "age"}) .from("person") .fetch_all(); for (const auto& i : result) { REQUIRE(i.size() == 3); REQUIRE(i.at(0).name() == "id"); REQUIRE(i.at(0).type() == data_type_t::type_long_long); REQUIRE(i.at(0).as() == 7); REQUIRE(i.at(1).name() == "name"); REQUIRE(i.at(1).type() == data_type_t::type_varchar); REQUIRE(i.at(1).as() == "george"); REQUIRE(i.at(2).name() == "age"); REQUIRE(i.at(2).type() == matador::sql::data_type_t::type_int); REQUIRE(i.at(2).as() == 45); } s.drop() .table("person") .execute(); } TEST_CASE("Execute update record statement", "[session record]") { connection_pool pool("sqlite://sqlite.db", 4); session s(pool); auto res = s.create() .table("person", { make_pk_column("id"), make_column("name", 255), make_column("age") }) .execute(); REQUIRE(res.first == 0); res = s.insert() .into("person", {"id", "name", "age"}) .values({7, "george", 45}) .execute(); REQUIRE(res.first == 1); REQUIRE(res.second == R"(INSERT INTO "person" ("id", "name", "age") VALUES (7, 'george', 45))"); res = s.update("person") .set({{"id", 7}, {"name", "jane"}, {"age", 35}}) .where("id"_col == 7) .execute(); REQUIRE(res.first == 1); REQUIRE(res.second == R"(UPDATE "person" SET "id"=7, "name"='jane', "age"=35 WHERE "id" = 7)"); auto result = s.select({"id", "name", "age"}) .from("person") .fetch_all(); for (const auto& i : result) { REQUIRE(i.size() == 3); REQUIRE(i.at(0).name() == "id"); REQUIRE(i.at(0).type() == data_type_t::type_long_long); REQUIRE(i.at(0).as() == 7); REQUIRE(i.at(1).name() == "name"); REQUIRE(i.at(1).type() == data_type_t::type_varchar); REQUIRE(i.at(1).as() == "jane"); REQUIRE(i.at(2).name() == "age"); REQUIRE(i.at(2).type() == matador::sql::data_type_t::type_int); REQUIRE(i.at(2).as() == 35); } s.drop().table("person").execute(); } TEST_CASE("Execute select statement with order by", "[session record]") { connection_pool pool("sqlite://sqlite.db", 4); session s(pool); auto res = s.create() .table("person", { make_pk_column("id"), make_column("name", 255), make_column("age") }) .execute(); REQUIRE(res.first == 0); res = s.insert().into("person", {"id", "name", "age"}).values({1, "george", 45}).execute(); REQUIRE(res.first == 1); res = s.insert().into("person", {"id", "name", "age"}).values({2, "jane", 32}).execute(); REQUIRE(res.first == 1); res = s.insert().into("person", {"id", "name", "age"}).values({3, "michael", 67}).execute(); REQUIRE(res.first == 1); res = s.insert().into("person", {"id", "name", "age"}).values({4, "bob", 13}).execute(); REQUIRE(res.first == 1); auto result = s.select({"id", "name", "age"}) .from("person") .where("id"_col == 8) .order_by("name").desc() .fetch_all(); std::list expected_names {"bob", "george", "jane", "michael"}; for (const auto &p : result) { REQUIRE(p.at(1).str() == expected_names.front()); expected_names.pop_front(); } s.drop().table("person").execute(); } TEST_CASE("Execute select statement with group by and order by", "[session record]") { connection_pool pool("sqlite://sqlite.db", 4); session s(pool); auto res = s.create() .table("person", { make_pk_column("id"), make_column("name", 255), make_column("age") }) .execute(); res = s.insert().into("person", {"id", "name", "age"}).values({1, "george", 45}).execute(); REQUIRE(res.first == 1); res = s.insert().into("person", {"id", "name", "age"}).values({2, "jane", 45}).execute(); REQUIRE(res.first == 1); res = s.insert().into("person", {"id", "name", "age"}).values({3, "michael", 13}).execute(); REQUIRE(res.first == 1); res = s.insert().into("person", {"id", "name", "age"}).values({4, "bob", 13}).execute(); REQUIRE(res.first == 1); res = s.insert().into("person", {"id", "name", "age"}).values({5, "charlie", 67}).execute(); REQUIRE(res.first == 1); auto result = s.select({alias(count("age"), "age_count"), "age"}) .from("person") .group_by("age") .order_by("age_count").asc() .fetch_all(); std::list> expected_values {{2, 13}, {2, 45}, {1, 67}}; for (const auto &r : result) { REQUIRE(r.at(0).as() == expected_values.front().first); REQUIRE(r.at(1).as() == expected_values.front().second); expected_values.pop_front(); } s.drop().table("person").execute(); }