From 0f1fb0fbd8cc36e99861c1ea8d4a96e0c8bfc8de Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Fri, 18 Nov 2022 13:46:32 +0100
Subject: [PATCH] TST: more tests for select queries

---
 test/test_select.cpp | 170 +++++++++++++++++++++++++++++++++++++------
 1 file changed, 149 insertions(+), 21 deletions(-)

diff --git a/test/test_select.cpp b/test/test_select.cpp
index d5ec8eb..39e26d2 100644
--- a/test/test_select.cpp
+++ b/test/test_select.cpp
@@ -26,7 +26,7 @@
 #include "caosdb/transaction.h"    // for Transaction, ResultTable
 #include "caosdb/value.h"          // for Value
 #include <gtest/gtest-message.h>   // for Message
-#include <gtest/gtest-spi.h>           // for EXPECT_NONFATAL_FA...
+#include <gtest/gtest-spi.h>       // for EXPECT_NONFATAL_FA...
 #include <gtest/gtest-test-part.h> // for SuiteApiResolver, TestFactoryImpl
 #include <gtest/gtest_pred_impl.h> // for Test, TestInfo, EXPECT_EQ, TEST
 #include <iostream>                // for operator<<, basic_ostream::operat...
@@ -34,8 +34,8 @@
 #include <string>                  // for string
 
 namespace caosdb::transaction {
-using caosdb::entity::DataType;
 using caosdb::entity::AtomicDataType;
+using caosdb::entity::DataType;
 using caosdb::entity::Entity;
 using caosdb::entity::Parent;
 using caosdb::entity::Property;
@@ -56,11 +56,8 @@ public:
     const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
     auto query_transaction(connection->CreateTransaction());
     query_transaction->Query("FIND Entity");
-    // query_transaction->Query("FIND Test*");
     query_transaction->Execute();
     if (query_transaction->GetResultSet().size() > 0) {
-      std::cout << "Cleanup: Deleting " << query_transaction->GetResultSet().size() << " entities."
-                << std::endl;
       auto delete_transaction(connection->CreateTransaction());
       for (const Entity &entity : query_transaction->GetResultSet()) {
         delete_transaction->DeleteById(entity.GetId());
@@ -69,7 +66,8 @@ public:
     }
   }
 
-  static auto CreateTestProp(const std::string &name, AtomicDataType data_type, bool isList = false) -> Entity {
+  static auto CreateTestProp(const std::string &name, AtomicDataType data_type, bool isList = false)
+    -> Entity {
     Entity entity;
     entity.SetRole(Role::PROPERTY);
     entity.SetName(name);
@@ -86,7 +84,8 @@ public:
     return entity;
   }
 
-  static auto CreateTestProp(const std::string &name, const std::string &data_type, bool isList = false) -> Entity {
+  static auto CreateTestProp(const std::string &name, const std::string &data_type,
+                             bool isList = false) -> Entity {
     Entity entity;
     entity.SetRole(Role::PROPERTY);
     entity.SetName(name);
@@ -146,9 +145,11 @@ protected:
     p = CreateTestProp("TestPropBool", AtomicDataType::BOOLEAN);
     insert_transaction->InsertEntity(&p);
 
-    // 3. A List Property
+    // 3. List Properties
     p = CreateTestProp("TestListTextProp", AtomicDataType::TEXT, true);
     insert_transaction->InsertEntity(&p);
+    p = CreateTestProp("TestListReferenceProp", "TestRT2", true);
+    insert_transaction->InsertEntity(&p);
 
     // 4. A Record which can be references by others
     auto reference_entity = test_select::CreateRecord("TestProp3", Value("val3"));
@@ -211,6 +212,27 @@ TEST_F(test_select, test_select_name) {
   }
 }
 
+/*
+ * Test select description query on record type.
+ */
+TEST_F(test_select, test_select_property_description) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT TestPropDouble.description FROM Record TestRT2");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "TestPropDouble.description");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_EQ(row.GetValue("TestPropDouble.description").GetAsString(),
+              "Prop Description TestPropDouble");
+  }
+}
+
 /*
  * Test select description query on record type.
  */
@@ -276,18 +298,60 @@ TEST_F(test_select, test_select_double) {
   }
 }
 
+/*
+ * Test select double value query on record.
+ */
+TEST_F(test_select, test_select_value) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+  auto entity = test_select::CreateRecord("TestPropDouble", Value(2.123));
+  test_select::InsertEntity(&entity);
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT TestPropDouble.value FROM Record TestRT");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "TestPropDouble.value");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_TRUE(row.GetValue("TestPropDouble.value").IsDouble());
+    EXPECT_EQ(row.GetValue("TestPropDouble.value").GetAsDouble(), 2.123);
+  }
+}
+
 /*
  * Test select unit value query on record.
  */
 TEST_F(test_select, test_select_unit) {
   const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT unit FROM PROPERTY TestPropDouble");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "unit");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_EQ(row.GetValue("unit").GetAsString(), "m");
+  }
+}
+
+/*
+ * Test select unit value query on record.
+ */
+TEST_F(test_select, test_select_property_unit) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
   auto entity = test_select::CreateRecord("TestPropDouble", Value(2.123));
   test_select::InsertEntity(&entity);
 
   auto check(connection->CreateTransaction());
   check->Query("FIND Record TestRT");
   check->Execute();
-  std::cout << check->GetResultSet().at(0).ToString() << std::endl;
 
   auto query_transaction(connection->CreateTransaction());
   query_transaction->Query("SELECT TestPropDouble.unit FROM Record TestRT");
@@ -301,7 +365,8 @@ TEST_F(test_select, test_select_unit) {
   for (const auto &row : query_transaction->GetResultTable().GetRows()) {
 
     // TODO(tf): create bug report: this is an insertion/update problem
-    EXPECT_NONFATAL_FAILURE({ EXPECT_EQ(row.GetValue("TestPropDouble.unit").GetAsString(), "m"); }, "TestPropDouble.unit");
+    EXPECT_NONFATAL_FAILURE({ EXPECT_EQ(row.GetValue("TestPropDouble.unit").GetAsString(), "m"); },
+                            "TestPropDouble.unit");
   }
 }
 
@@ -328,7 +393,8 @@ TEST_F(test_select, test_select_int) {
   }
 }
 
-/* Test select boolean value query on record.  */ TEST_F(test_select, test_select_boolean) {
+/* Test select boolean value query on record.  */
+TEST_F(test_select, test_select_boolean) {
   const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
   auto entity = test_select::CreateRecord("TestPropBool", Value(true));
   test_select::InsertEntity(&entity);
@@ -356,7 +422,7 @@ TEST_F(test_select, test_select_reference) {
   auto get_id_of_ref_rec(connection->CreateTransaction());
   get_id_of_ref_rec->Query("SELECT id FROM RECORD TestRT2");
   get_id_of_ref_rec->Execute();
-  auto id = (* get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
+  auto id = (*get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
 
   auto entity = test_select::CreateRecord("TestRT2", Value(id));
   test_select::InsertEntity(&entity);
@@ -375,6 +441,35 @@ TEST_F(test_select, test_select_reference) {
   }
 }
 
+/*
+ * Test select the referenced id.
+ */
+TEST_F(test_select, test_select_reference_value) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+  auto get_id_of_ref_rec(connection->CreateTransaction());
+  get_id_of_ref_rec->Query("SELECT id, version FROM RECORD TestRT2");
+  get_id_of_ref_rec->Execute();
+  auto id = (*get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
+  auto version =
+    (*get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("version").GetAsString();
+
+  auto entity = test_select::CreateRecord("TestRT2", Value(id));
+  test_select::InsertEntity(&entity);
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT TestRT2.value FROM Record TestRT");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "TestRT2.value");
+  }
+
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_EQ(row.GetValue("TestRT2.value").GetAsString(), id + "@" + version);
+  }
+}
+
 /*
  * Test select the referenced entity's property.
  */
@@ -383,7 +478,7 @@ TEST_F(test_select, test_select_reference_entitys_property) {
   auto get_id_of_ref_rec(connection->CreateTransaction());
   get_id_of_ref_rec->Query("SELECT id FROM RECORD TestRT2");
   get_id_of_ref_rec->Execute();
-  auto id = (* get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
+  auto id = (*get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
 
   auto entity = test_select::CreateRecord("TestRT2", Value(id));
   test_select::InsertEntity(&entity);
@@ -410,7 +505,7 @@ TEST_F(test_select, test_select_reference_entitys_propertys_unit) {
   auto get_id_of_ref_rec(connection->CreateTransaction());
   get_id_of_ref_rec->Query("SELECT id FROM RECORD TestRT2");
   get_id_of_ref_rec->Execute();
-  auto id = (* get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
+  auto id = (*get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
 
   auto entity = test_select::CreateRecord("TestRT2", Value(id));
   test_select::InsertEntity(&entity);
@@ -437,7 +532,7 @@ TEST_F(test_select, test_select_reference_entitys_propertys_description) {
   auto get_id_of_ref_rec(connection->CreateTransaction());
   get_id_of_ref_rec->Query("SELECT id FROM RECORD TestRT2");
   get_id_of_ref_rec->Execute();
-  auto id = (* get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
+  auto id = (*get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
 
   auto entity = test_select::CreateRecord("TestRT2", Value(id));
   test_select::InsertEntity(&entity);
@@ -452,7 +547,8 @@ TEST_F(test_select, test_select_reference_entitys_propertys_description) {
 
   EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
   for (const auto &row : query_transaction->GetResultTable().GetRows()) {
-    EXPECT_EQ(row.GetValue("TestRT2.TestProp3.description").GetAsString(), "Prop Description TestProp3");
+    EXPECT_EQ(row.GetValue("TestRT2.TestProp3.description").GetAsString(),
+              "Prop Description TestProp3");
   }
 }
 
@@ -464,7 +560,7 @@ TEST_F(test_select, test_select_reference_entitys_propertys_name) {
   auto get_id_of_ref_rec(connection->CreateTransaction());
   get_id_of_ref_rec->Query("SELECT id FROM RECORD TestRT2");
   get_id_of_ref_rec->Execute();
-  auto id = (* get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
+  auto id = (*get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
 
   auto entity = test_select::CreateRecord("TestRT2", Value(id));
   test_select::InsertEntity(&entity);
@@ -491,12 +587,12 @@ TEST_F(test_select, test_select_reference_entitys_propertys_id) {
   auto get_id_of_ref_rec(connection->CreateTransaction());
   get_id_of_ref_rec->Query("SELECT id FROM RECORD TestRT2");
   get_id_of_ref_rec->Execute();
-  auto id = (* get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
+  auto id = (*get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
 
   auto get_id_of_prop(connection->CreateTransaction());
   get_id_of_prop->Query("SELECT id FROM PROPERTY TestProp3");
   get_id_of_prop->Execute();
-  auto pid = (* get_id_of_prop->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
+  auto pid = (*get_id_of_prop->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
 
   auto entity = test_select::CreateRecord("TestRT2", Value(id));
   test_select::InsertEntity(&entity);
@@ -516,9 +612,9 @@ TEST_F(test_select, test_select_reference_entitys_propertys_id) {
 }
 
 /*
- * Test select a list.
+ * Test select a list (TEXT).
  */
-TEST_F(test_select, test_select_list) {
+TEST_F(test_select, test_select_list_of_text) {
   const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
 
   auto entity = test_select::CreateRecord("TestRT2", Value());
@@ -544,6 +640,38 @@ TEST_F(test_select, test_select_list) {
   }
 }
 
+/*
+ * Test select a list (REFERENCE).
+ */
+TEST_F(test_select, test_select_list_of_reference) {
+  const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  auto get_id_of_ref_rec(connection->CreateTransaction());
+  get_id_of_ref_rec->Query("SELECT id FROM RECORD TestRT2");
+  get_id_of_ref_rec->Execute();
+  auto id = (*get_id_of_ref_rec->GetResultTable().GetRows().begin()).GetValue("id").GetAsString();
+
+  auto entity = test_select::CreateRecord("TestRT2", Value());
+  Property listp;
+  listp.SetName("TestListReferenceProp");
+  listp.SetValue(std::vector<std::string>{id, id, id});
+  entity.AppendProperty(listp);
+  test_select::InsertEntity(&entity);
+
+  auto query_transaction(connection->CreateTransaction());
+  query_transaction->Query("SELECT TestListReferenceProp FROM Record TestRT");
+  query_transaction->Execute();
+  EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1);
+  for (const auto &column : query_transaction->GetResultTable().GetHeader()) {
+    EXPECT_EQ(column.GetName(), "TestListReferenceProp");
+  }
 
+  EXPECT_EQ(query_transaction->GetResultTable().size(), 1);
+  for (const auto &row : query_transaction->GetResultTable().GetRows()) {
+    EXPECT_EQ(row.GetValue("TestListReferenceProp").GetAsVector().at(0).GetAsString(), id);
+    EXPECT_EQ(row.GetValue("TestListReferenceProp").GetAsVector().at(1).GetAsString(), id);
+    EXPECT_EQ(row.GetValue("TestListReferenceProp").GetAsVector().at(2).GetAsString(), id);
+  }
+}
 
 } // namespace caosdb::transaction
-- 
GitLab