From 30f00d80118f7787dc413352aadda80a4e09bc2c Mon Sep 17 00:00:00 2001
From: florian <f.spreckelsen@inidscale.com>
Date: Fri, 6 Aug 2021 14:54:49 +0200
Subject: [PATCH] ENH: Add Test for queries with retrieve

---
 test/test_transaction.cpp | 104 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 102 insertions(+), 2 deletions(-)

diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp
index b87f1eb..4257d3e 100644
--- a/test/test_transaction.cpp
+++ b/test/test_transaction.cpp
@@ -540,7 +540,107 @@ TEST(test_transaction, test_query) {
   EXPECT_EQ(count_query_trans->GetCountResult(), 1);
 }
 
-// TODO(fspreck) Add tests for unique queries, count queries, and mixed
-// transactions (FIND + RetrieveById, COUNT + RetrieveById).
+// TODO(fspreck) Add tests for unique queries
+
+TEST(test_transaction, test_query_with_retrieve) {
+  const auto &connection =
+    caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  // rt1
+  Entity rt1;
+  rt1.SetRole("RecordType");
+  rt1.SetName("TestRT1");
+
+  auto insert_rt1_transaction(connection->CreateTransaction());
+  insert_rt1_transaction->InsertEntity(&rt1);
+  insert_rt1_transaction->ExecuteAsynchronously();
+
+  auto insert_rt1_status = insert_rt1_transaction->WaitForIt();
+
+  ASSERT_TRUE(insert_rt1_status.IsTerminated());
+  ASSERT_FALSE(insert_rt1_status.IsError());
+
+  const auto &insert_rt1_results =
+    dynamic_cast<const UniqueResult &>(insert_rt1_transaction->GetResultSet());
+
+  const auto &inserted_rt1 = insert_rt1_results.GetEntity();
+  EXPECT_FALSE(inserted_rt1.GetId().empty());
+  EXPECT_FALSE(inserted_rt1.HasErrors());
+
+  // rt2
+  Entity rt2;
+  rt2.SetRole("RecordType");
+  rt2.SetName("TestRT2");
+
+  auto insert_rt2_transaction(connection->CreateTransaction());
+  insert_rt2_transaction->InsertEntity(&rt2);
+  insert_rt2_transaction->ExecuteAsynchronously();
+
+  auto insert_rt2_status = insert_rt2_transaction->WaitForIt();
+
+  ASSERT_TRUE(insert_rt2_status.IsTerminated());
+  ASSERT_FALSE(insert_rt2_status.IsError());
+
+  const auto &insert_rt2_results =
+    dynamic_cast<const UniqueResult &>(insert_rt2_transaction->GetResultSet());
+
+  const auto &inserted_rt2 = insert_rt2_results.GetEntity();
+  EXPECT_FALSE(inserted_rt2.GetId().empty());
+  EXPECT_FALSE(inserted_rt2.HasErrors());
+
+  // rt3
+  Entity rt3;
+  rt3.SetRole("RecordType");
+  rt3.SetName("TestRT3");
+
+  auto insert_rt3_transaction(connection->CreateTransaction());
+  insert_rt3_transaction->InsertEntity(&rt3);
+  insert_rt3_transaction->ExecuteAsynchronously();
+
+  auto insert_rt3_status = insert_rt3_transaction->WaitForIt();
+
+  ASSERT_TRUE(insert_rt3_status.IsTerminated());
+  ASSERT_FALSE(insert_rt3_status.IsError());
+
+  const auto &insert_rt3_results =
+    dynamic_cast<const UniqueResult &>(insert_rt3_transaction->GetResultSet());
+
+  const auto &inserted_rt3 = insert_rt3_results.GetEntity();
+  EXPECT_FALSE(inserted_rt3.GetId().empty());
+  EXPECT_FALSE(inserted_rt3.HasErrors());
+
+  // only retrieve rt1 and rt2 by id
+  const std::vector<std::string> ids = {inserted_rt1.GetId(),
+                                        inserted_rt2.GetId()};
+
+  // retrieve rt3 with a FIND query
+  auto find_and_retrieve(connection->CreateTransaction());
+  find_and_retrieve->Query("FIND ENTITY WITH id = " + inserted_rt3.GetId());
+  find_and_retrieve->RetrieveById(ids.begin(), ids.end());
+  find_and_retrieve->ExecuteAsynchronously();
+
+  auto find_and_retrieve_status = find_and_retrieve->WaitForIt();
+
+  ASSERT_TRUE(find_and_retrieve_status.IsTerminated());
+  ASSERT_FALSE(find_and_retrieve_status.IsError());
+
+  const auto &result_set_a = find_and_retrieve->GetResultSet();
+  EXPECT_EQ(result_set_a.Size(), 3);
+
+  // retrieve rt1 and rt2 by ID and count all TestRTs
+  auto count_and_retrieve(connection->CreateTransaction());
+  count_and_retrieve->Query("COUNT ENTITY WITH name LIKE 'TestRT*'");
+  count_and_retrieve->RetrieveById(ids.begin(), ids.end());
+  count_and_retrieve->ExecuteAsynchronously();
+
+  auto count_and_retrieve_status = count_and_retrieve->WaitForIt();
+
+  ASSERT_TRUE(count_and_retrieve_status.IsTerminated());
+  ASSERT_FALSE(count_and_retrieve_status.IsError());
+
+  const auto &result_set_b = count_and_retrieve->GetResultSet();
+  EXPECT_EQ(result_set_b.Size(), 2);
+  EXPECT_EQ(count_and_retrieve->GetCountResult(), 3);
+}
 
 } // namespace caosdb::transaction
-- 
GitLab