#include #include #include #include #include "models/product.hpp" #include "models/airplane.hpp" #include "models/flight.hpp" #include "models/person.hpp" using namespace matador::sql; using namespace matador::test; TEST_CASE("Create table with foreign key relation", "[session]") { connection_pool pool("sqlite://sqlite.db", 4); session s(pool); auto res = s.create() .table("airplane") .execute(); REQUIRE(res.first == 0); REQUIRE(res.second == R"(CREATE TABLE "airplane" ("id" BIGINT, "brand" VARCHAR(255), "model" VARCHAR(255), CONSTRAINT PK_airplane PRIMARY KEY (id)))"); res = s.create() .table("flight") .execute(); REQUIRE(res.first == 0); REQUIRE(res.second == R"(CREATE TABLE "flight" ("id" BIGINT, "airplane_id" BIGINT, "pilot_name" VARCHAR(255), CONSTRAINT PK_flight PRIMARY KEY (id), CONSTRAINT FK_flight_airplane_id FOREIGN KEY (airplane_id) REFERENCES airplane(id)))"); s.drop().table("flight").execute(); s.drop().table("airplane").execute(); } TEST_CASE("Execute select statement with where clause", "[session]") { connection_pool pool("sqlite://sqlite.db", 4); session s(pool); auto res = s.create() .table("person") .execute(); REQUIRE(res.first == 0); person george{7, "george", 45}; res = s.insert() .into("person", george) .execute(); REQUIRE(res.first == 1); // fetch person as record auto result_record = s.select() .from("person") .where("id"_col == 7) .fetch_all(); for (const auto& i : result_record) { REQUIRE(i.size() == 3); REQUIRE(i.at(0).name() == "id"); REQUIRE(i.at(0).type() == data_type_t::type_unsigned_long); REQUIRE(i.at(0).as() == george.id); REQUIRE(i.at(1).name() == "name"); REQUIRE(i.at(1).type() == data_type_t::type_varchar); REQUIRE(i.at(1).as() == george.name); REQUIRE(i.at(2).name() == "age"); REQUIRE(i.at(2).type() == matador::sql::data_type_t::type_unsigned_int); REQUIRE(i.at(2).as() == george.age); } // fetch person as person auto result_person = s.select() .from("person") .where("id"_col == 7) .fetch_all(); for (const auto& i : result_person) { REQUIRE(i.id == 7); REQUIRE(i.name == "george"); REQUIRE(i.age == 45); } s.drop().table("person").execute(); } TEST_CASE("Execute insert statement", "[session]") { 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("color", 63) }) .execute(); res = s.insert() .into("person", {"id", "name", "color"}) .values({7, "george", "green"}) .execute(); REQUIRE(res.first == 1); REQUIRE(res.second == R"(INSERT INTO "person" ("id", "name", "color") VALUES (7, 'george', 'green'))"); s.drop().table("person").execute(); } TEST_CASE("Select statement with foreign key", "[session]") { connection_pool pool("sqlite://sqlite.db", 4); session s(pool); auto res = s.create() .table("airplane") .execute(); REQUIRE(res.first == 0); REQUIRE(res.second == R"(CREATE TABLE "airplane" ("id" BIGINT, "brand" VARCHAR(255), "model" VARCHAR(255), CONSTRAINT PK_airplane PRIMARY KEY (id)))"); res = s.create() .table("flight") .execute(); REQUIRE(res.first == 0); REQUIRE(res.second == R"(CREATE TABLE "flight" ("id" BIGINT, "airplane_id" BIGINT, "pilot_name" VARCHAR(255), CONSTRAINT PK_flight PRIMARY KEY (id), CONSTRAINT FK_flight_airplane_id FOREIGN KEY (airplane_id) REFERENCES airplane(id)))"); std::vector> planes { make_foreign(1, "Airbus", "A380"), make_foreign(2, "Boeing", "707"), make_foreign(3, "Boeing", "747") }; for (const auto &plane : planes) { res = s.insert().into("airplane").values(*plane).execute(); REQUIRE(res.first == 1); } auto count = s.select({count_all()}).from("airplane").fetch_value(); REQUIRE(count == 3); flight f4711{4, *planes.begin(), "hans"}; res = s.insert().into("flight").values(f4711).execute(); REQUIRE(res.first == 1); auto f = *s.select().from("flight").fetch_all().begin(); s.drop().table("flight").execute(); s.drop().table("airplane").execute(); }