From 9592c098d39d76af41ffea012fb40dc95e999b2d Mon Sep 17 00:00:00 2001
From: florian <f.spreckelsen@inidscale.com>
Date: Tue, 3 Aug 2021 14:28:33 +0200
Subject: [PATCH] ENH: Test insertion with parent

---
 test/test_transaction.cpp | 66 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 59 insertions(+), 7 deletions(-)

diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp
index 2df69a4..0577666 100644
--- a/test/test_transaction.cpp
+++ b/test/test_transaction.cpp
@@ -139,25 +139,77 @@ TEST(test_transaction, insert_delete) {
   EXPECT_FALSE(deleted_entity.HasErrors());
 }
 
-// TODO(fspreck) Insert an RT and a Record of this type, check
-// whether this is reflected correctly in the inserted Record, then
-// delete everything.
+// TODO(fspreck) Simplify inserts and deletes once we have
+// multi-entity operations
 TEST(test_transaction, insert_delete_with_parent) {
   const auto &connection =
     caosdb::connection::ConnectionManager::GetDefaultConnection();
 
   auto insert_transaction(connection->CreateTransaction());
 
-  Entity entity;
-  entity.SetRole("RecordType");
-  entity.SetName("RT1");
-  insert_transaction->InsertEntity(&entity);
+  Entity rt;
+  rt.SetRole("RecordType");
+  rt.SetName("TestRT");
+  insert_transaction->InsertEntity(&rt);
   insert_transaction->ExecuteAsynchronously();
 
   auto insert_status = insert_transaction->WaitForIt();
 
   ASSERT_TRUE(insert_status.IsTerminated());
   ASSERT_FALSE(insert_status.IsError());
+
+  const auto &insert_result_set =
+    dynamic_cast<const UniqueResult &>(insert_transaction->GetResultSet());
+
+  const auto &inserted_rt = insert_result_set.GetEntity();
+    
+  Entity rec;
+  rec.SetRole("Record");
+  rec.SetName("TestRec");
+
+  Parent parent;
+  parent.SetName(rt.GetName());
+  rec.AppendParent(parent);
+
+  auto rec_transaction(connection->CreateTransaction());
+  rec_transaction->InsertEntity(&rec);
+  rec_transaction->ExecuteAsynchronously();
+
+  auto rec_insert_status = rec_transaction->WaitForIt();
+
+  ASSERT_TRUE(rec_insert_status.IsTerminated());
+  ASSERT_FALSE(rec_insert_status.IsError());
+
+  const auto &rec_result_set =
+    dynamic_cast<const UniqueResult &>(rec_transaction->GetResultSet());
+
+  const auto &inserted_rec = rec_result_set.GetEntity();
+
+  EXPECT_EQ(inserted_rec.GetName(), rec.GetName());
+  EXPECT_EQ(inserted_rec.GetParents().Size(), 1);
+  EXPECT_EQ(inserted_rec.GetParents().At(0).GetId(), inserted_rt.GetId());
+  EXPECT_EQ(inserted_rec.GetParents().At(0).GetName(), inserted_rt.GetName());
+
+  auto rec_deletion(connection->CreateTransaction());
+
+  rec_deletion->DeleteById(inserted_rec.GetId());
+  rec_deletion->ExecuteAsynchronously();
+
+  auto rec_delete_status = rec_deletion->WaitForIt();
+
+  ASSERT_TRUE(rec_delete_status.IsTerminated());
+  ASSERT_FALSE(rec_delete_status.IsError());
+
+  auto rt_deletion(connection->CreateTransaction());
+
+  rt_deletion->DeleteById(inserted_rt.GetId());
+  rt_deletion->ExecuteAsynchronously();
+
+  auto rt_delete_status = rt_deletion->WaitForIt();
+
+  ASSERT_TRUE(rt_delete_status.IsTerminated());
+  ASSERT_FALSE(rt_delete_status.IsError());
+
 }
 
 // TODO(fspreck) Insert a Record with a parent and a Property. Check
-- 
GitLab