diff --git a/backends/postgres/test/CMakeLists.txt b/backends/postgres/test/CMakeLists.txt index 1bc0772..2d3805b 100644 --- a/backends/postgres/test/CMakeLists.txt +++ b/backends/postgres/test/CMakeLists.txt @@ -25,6 +25,8 @@ set(TEST_SOURCES ../../../test/backends/SequenceFixture.cpp ../../../test/backends/SequenceFixture.hpp ../../../test/backends/SequenceTest.cpp + ../../../test/backends/SessionDeleteHasMany.cpp + ../../../test/backends/SessionDeleteHasManyToMany.cpp ../../../test/backends/SessionFixture.cpp ../../../test/backends/SessionFixture.hpp ../../../test/backends/SessionInsertBelongsTo.cpp @@ -46,7 +48,6 @@ set(TEST_SOURCES ../../../test/models/user.hpp ../../../test/utils/RecordPrinter.cpp ../../../test/utils/RecordPrinter.hpp - ../../../test/backends/SessionDeleteHasMany.cpp ) set(LIBRARY_TEST_TARGET PostgresTests) diff --git a/test/backends/SessionDeleteHasMany.cpp b/test/backends/SessionDeleteHasMany.cpp index a5264c8..a67bf87 100644 --- a/test/backends/SessionDeleteHasMany.cpp +++ b/test/backends/SessionDeleteHasMany.cpp @@ -66,6 +66,10 @@ TEST_CASE_METHOD(SessionFixture, "Test delete object with has many relation", "[ REQUIRE(author_result->is_persistent()); REQUIRE(author_result.value()->books.size() == 5); + const auto id = s_king->id; auto del_res = ses.remove(s_king); REQUIRE(del_res); + + author_result = ses.find(id); + REQUIRE_FALSE(author_result); } diff --git a/test/backends/SessionDeleteHasManyToMany.cpp b/test/backends/SessionDeleteHasManyToMany.cpp new file mode 100644 index 0000000..0910b45 --- /dev/null +++ b/test/backends/SessionDeleteHasManyToMany.cpp @@ -0,0 +1,80 @@ +#include "catch2/catch_test_macros.hpp" + +#include "SessionFixture.hpp" + +#include "connection.hpp" + +#include "matador/query/session.hpp" + +#include "models/recipe.hpp" + +using namespace matador::test; +using namespace matador::query; +using namespace matador::object; + +namespace matador::test { +template +void validate_author_state(const object_ptr& ptr, object_state expected_state) { + REQUIRE(ptr.is_state(expected_state)); + for (auto &b: ptr->books) { + REQUIRE(b.is_state(expected_state)); + } +} +} + +namespace matador::utils { +template < typename ValueType > +std::ostream& operator<<(std::ostream& os, const result& value) { + if (value) { + return os; + } + return os << "Error: " << value.err(); +} + +std::ostream& operator<<(std::ostream& os, const result& value) { + if (value) { + return os; + } + return os << "Error: " << value.err(); +} +} + +TEST_CASE_METHOD(SessionFixture, "Test delete object with has many to many relation", "[session][delete][has_many_to_many]") { + auto result = schema.attach("recipes") + .and_then( [this] { return schema.attach("ingredients"); } ) + .and_then([this] { return schema.create(db); } ); + + session ses({bus, connection::dns, 4}, schema); + + std::vector ingredients { + make_object("Apple"), + make_object("Strawberry"), + make_object("Pineapple"), + make_object("Sugar"), + make_object("Flour"), + make_object("Butter"), + make_object("Beans") + }; + + std::vector recipes { + make_object("Apple Pie", std::vector{ingredients[0], ingredients[3], ingredients[4]}), + make_object("Strawberry Cake", std::vector{ingredients[5], ingredients[6]}), + make_object("Pineapple Pie", std::vector{ingredients[0], ingredients[1], ingredients[2]}) + }; + + for (auto &r: recipes) { + REQUIRE(r.is_transient()); + auto res = ses.insert(r); + REQUIRE(res.is_ok()); + REQUIRE(res->is_persistent()); + } + + auto recipe_result = ses.find(1); + REQUIRE(recipe_result.is_ok()); + REQUIRE(recipe_result->is_persistent()); + REQUIRE(recipe_result.value()->ingredients.size() == 3); + + const auto ing_result = ses.find(ingredients[0]->id); + REQUIRE(ing_result.is_ok()); + REQUIRE(ing_result.value()->recipes.size() == 2); +}