From a77f58e41f5df3039ca22b3d497ee07ba5149a9e Mon Sep 17 00:00:00 2001
From: florian <f.spreckelsen@inidscale.com>
Date: Wed, 4 Aug 2021 12:11:13 +0200
Subject: [PATCH] DRAFT: Test inertion of a record with a property

---
 test/test_transaction.cpp | 114 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 109 insertions(+), 5 deletions(-)

diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp
index 3aa75e7..5428943 100644
--- a/test/test_transaction.cpp
+++ b/test/test_transaction.cpp
@@ -35,6 +35,7 @@ namespace caosdb::transaction {
 using caosdb::entity::Entity;
 using caosdb::entity::MessageCode;
 using caosdb::entity::Parent;
+using caosdb::entity::Property;
 
 class test_transaction : public ::testing::Test {
 protected:
@@ -95,8 +96,7 @@ TEST(test_transaction, retrieve_non_existing) {
             MessageCode::ENTITY_DOES_NOT_EXIST);
 }
 
-// TODO(fspreck) cognitive complexity > 25 (threshold)
-TEST(test_transaction, insert_delete) { // NOLINT
+TEST(test_transaction, insert_delete) {
   const auto &connection =
     caosdb::connection::ConnectionManager::GetDefaultConnection();
 
@@ -143,9 +143,7 @@ TEST(test_transaction, insert_delete) { // NOLINT
   EXPECT_FALSE(deleted_entity.HasErrors());
 }
 
-// TODO(fspreck) Simplify inserts and deletes once we have
-// multi-entity operations, also cognitive complexity > threshold
-TEST(test_transaction, insert_delete_with_parent) { // NOLINT
+TEST(test_transaction, insert_delete_with_parent) {
   const auto &connection =
     caosdb::connection::ConnectionManager::GetDefaultConnection();
 
@@ -235,5 +233,111 @@ TEST(test_transaction, insert_delete_with_parent) { // NOLINT
 
 // TODO(fspreck) Insert a Record with a parent and a Property. Check
 // for success and delete everything.
+TEST(test_transaction, insert_delete_with_property) {
+  const auto &connection =
+    caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  // Create and insert property
+  Entity prop_ent;
+  prop_ent.SetRole("Property");
+  prop_ent.SetName("TestProperty");
+  prop_ent.SetDatatype("TEXT");
+
+  auto prop_insertion(connection->CreateTransaction());
+  prop_insertion->InsertEntity(&prop_ent);
+  prop_insertion->ExecuteAsynchronously();
+
+  auto prop_insert_status = prop_insertion->WaitForIt();
+
+  ASSERT_TRUE(prop_insert_status.IsTerminated());
+  ASSERT_FALSE(prop_insert_status.IsError());
+
+  const auto &prop_result_set =
+    dynamic_cast<const UniqueResult &>(prop_insertion->GetResultSet());
+
+  const auto &inserted_prop = prop_result_set.GetEntity();
+  EXPECT_FALSE(inserted_prop.GetId().empty());
+
+  // create and insert record type with the above property
+  Property prop_rt;
+  prop_rt.SetName(prop_ent.GetName());
+  prop_rt.SetId(inserted_prop.GetId());
+  prop_rt.SetImportance("SUGGESTED");
+
+  Entity rt;
+  rt.SetRole("RecordType");
+  rt.SetName("TestRT");
+  rt.AppendProperty(prop_rt);
+
+  auto rt_insertion(connection->CreateTransaction());
+  rt_insertion->InsertEntity(&rt);
+  rt_insertion->ExecuteAsynchronously();
+
+  auto rt_insert_status = rt_insertion->WaitForIt();
+
+  ASSERT_TRUE(rt_insert_status.IsTerminated());
+  ASSERT_FALSE(rt_insert_status.IsError());
+
+  const auto &rt_result_set =
+    dynamic_cast<const UniqueResult &>(rt_insertion->GetResultSet());
+
+  const auto &inserted_rt = rt_result_set.GetEntity();
+  EXPECT_FALSE(inserted_rt.GetId().empty());
+
+  // retrieve inserted rt for testing
+  auto rt_retrieval(connection->CreateTransaction());
+  rt_retrieval->RetrieveById(inserted_rt.GetId());
+  rt_retrieval->ExecuteAsynchronously();
+
+  auto rt_retrieve_status = rt_retrieval->WaitForIt();
+  ASSERT_TRUE(rt_retrieve_status.IsTerminated());
+  ASSERT_FALSE(rt_retrieve_status.IsError());
+
+  const auto &rt_retrieve_results =
+    dynamic_cast<const UniqueResult &>(rt_retrieval->GetResultSet());
+
+  const auto &retrieved_rt = rt_retrieve_results.GetEntity();
+  EXPECT_EQ(inserted_rt.GetId(), retrieved_rt.GetId());
+  EXPECT_EQ(rt.GetName(), retrieved_rt.GetName());
+  EXPECT_EQ(retrieved_rt.GetProperties().Size(), 1);
+
+  const auto &retrieved_prop_rt = retrieved_rt.GetProperties().At(0);
+  EXPECT_EQ(retrieved_prop_rt.GetName(), prop_ent.GetName());
+  EXPECT_EQ(retrieved_prop_rt.GetId(), inserted_prop.GetId());
+  EXPECT_EQ(retrieved_prop_rt.GetDatatype(), prop_ent.GetDatatype());
+  EXPECT_EQ(retrieved_prop_rt.GetImportance(), prop_rt.GetImportance());
+
+  // create and insert record of the above record type with a property
+  // with a value.
+  Parent parent;
+  parent.SetName(rt.GetName());
+  parent.SetId(inserted_rt.GetId());
+
+  Property prop_rec;
+  prop_rec.SetName(prop_ent.GetName());
+  prop_rec.SetId(inserted_prop.GetId());
+  prop_rec.SetValue("Test");
+
+  Entity rec;
+  rec.SetName("TestRec");
+  rec.SetRole("Record");
+  rec.AppendParent(parent);
+  rec.AppendProperty(prop_rec);
+
+  auto rec_insertion(connection->CreateTransaction());
+  rec_insertion->InsertEntity(&rec);
+  rec_insertion->ExecuteAsynchronously();
+
+  auto rec_insert_status = rec_insertion->WaitForIt();
+
+  ASSERT_TRUE(rec_insert_status.IsTerminated());
+  ASSERT_FALSE(rec_insert_status.IsError());
+
+  const auto &rec_result_set =
+    dynamic_cast<const UniqueResult &>(rec_insertion->GetResultSet());
+
+  const auto &inserted_rec = rec_result_set.GetEntity();
+  EXPECT_FALSE(inserted_rec.GetId().empty());
+}
 
 } // namespace caosdb::transaction
-- 
GitLab