#include #include #include #include #include #include "Databases.hpp" #include "models/product.hpp" #include "models/airplane.hpp" #include "models/flight.hpp" #include "models/person.hpp" using namespace matador::sql; using namespace matador::test; template class SessionTestFixture { public: SessionTestFixture() : pool_(Type::dns, 4), session_(pool_) {} ~SessionTestFixture() = default; matador::sql::session &session() { return session_; } private: matador::sql::connection_pool pool_; matador::sql::session session_; }; TEMPLATE_TEST_CASE_METHOD(SessionTestFixture, "Create table with foreign key relation", "[session]", Sqlite, Postgres) { auto &s = SessionTestFixture::session(); s.create() .template table("airplane") .execute(); REQUIRE(s.table_exists("airplane")); s.create() .template table("flight") .execute(); REQUIRE(s.table_exists("flight")); s.drop().table("flight").execute(); s.drop().table("airplane").execute(); REQUIRE(!s.table_exists("flight")); REQUIRE(!s.table_exists("airplane")); } TEMPLATE_TEST_CASE_METHOD(SessionTestFixture, "Execute select statement with where clause", "[session]", Postgres, Sqlite) { auto &s = SessionTestFixture::session(); s.create() .template table("person") .execute(); person george{7, "george", 45}; auto res = s.insert() .into("person", george) .execute(); REQUIRE(res == 1); // fetch person as record auto result_record = s.template 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).template as() == george.id); REQUIRE(i.at(1).name() == "name"); REQUIRE(i.at(1).type() == data_type_t::type_varchar); REQUIRE(i.at(1).template 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).template as() == george.age); } // fetch person as person auto result_person = s.template select() .from("person") .where("id"_col == 7) .template 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(); } TEMPLATE_TEST_CASE_METHOD(SessionTestFixture, "Execute insert statement", "[session]", Sqlite, Postgres) { auto &s = SessionTestFixture::session(); s.create() .table("person", { make_pk_column("id"), make_column("name", 255), make_column("color", 63) }) .execute(); auto res = s.insert() .into("person", {"id", "name", "color"}) .values({7, "george", "green"}) .execute(); REQUIRE(res == 1); s.drop().table("person").execute(); } TEMPLATE_TEST_CASE_METHOD(SessionTestFixture, "Select statement with foreign key", "[session]", Sqlite, Postgres) { auto &s = SessionTestFixture::session(); s.create() .template table("airplane") .execute(); s.create() .template table("flight") .execute(); std::vector> planes { make_entity(1, "Airbus", "A380"), make_entity(2, "Boeing", "707"), make_entity(3, "Boeing", "747") }; for (const auto &plane : planes) { auto res = s.insert().template into("airplane").values(*plane).execute(); REQUIRE(res == 1); } auto count = s.select({count_all()}).from("airplane").template fetch_value(); REQUIRE(count == 3); flight f4711{4, planes.at(1), "hans"}; auto res = s.insert().template into("flight").values(f4711).execute(); REQUIRE(res == 1); auto f = *s.template select().from("flight").template fetch_all().begin(); REQUIRE(f.id == 4); REQUIRE(f.pilot_name == "hans"); REQUIRE(f.airplane.get() != nullptr); REQUIRE(f.airplane->id == 2); s.drop().table("flight").execute(); s.drop().table("airplane").execute(); }