81 lines
2.5 KiB
C++
81 lines
2.5 KiB
C++
#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<typename AuthorType>
|
|
void validate_author_state(const object_ptr<AuthorType>& 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<ValueType, error>& value) {
|
|
if (value) {
|
|
return os;
|
|
}
|
|
return os << "Error: " << value.err();
|
|
}
|
|
|
|
std::ostream& operator<<(std::ostream& os, const result<void, error>& 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<recipe_sequence>("recipes")
|
|
.and_then( [this] { return schema.attach<ingredient_sequence>("ingredients"); } )
|
|
.and_then([this] { return schema.create(db); } );
|
|
|
|
session ses({bus, connection::dns, 4}, schema);
|
|
|
|
std::vector ingredients {
|
|
make_object<ingredient_sequence>("Apple"),
|
|
make_object<ingredient_sequence>("Strawberry"),
|
|
make_object<ingredient_sequence>("Pineapple"),
|
|
make_object<ingredient_sequence>("Sugar"),
|
|
make_object<ingredient_sequence>("Flour"),
|
|
make_object<ingredient_sequence>("Butter"),
|
|
make_object<ingredient_sequence>("Beans")
|
|
};
|
|
|
|
std::vector recipes {
|
|
make_object<recipe_sequence>("Apple Pie", std::vector{ingredients[0], ingredients[3], ingredients[4]}),
|
|
make_object<recipe_sequence>("Strawberry Cake", std::vector{ingredients[5], ingredients[6]}),
|
|
make_object<recipe_sequence>("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<recipe_sequence>(1);
|
|
REQUIRE(recipe_result.is_ok());
|
|
REQUIRE(recipe_result->is_persistent());
|
|
REQUIRE(recipe_result.value()->ingredients.size() == 3);
|
|
|
|
const auto ing_result = ses.find<ingredient_sequence>(ingredients[0]->id);
|
|
REQUIRE(ing_result.is_ok());
|
|
REQUIRE(ing_result.value()->recipes.size() == 2);
|
|
}
|