From bd01772592b83a631a0fb3e43a23c237b94c4f37 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <henrik@trineo.org>
Date: Thu, 19 Aug 2021 20:31:24 +0200
Subject: [PATCH] workflow test

---
 test/test_transaction.cpp | 127 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 127 insertions(+)

diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp
index 8ee82fb..857cbb7 100644
--- a/test/test_transaction.cpp
+++ b/test/test_transaction.cpp
@@ -776,4 +776,131 @@ TEST_F(test_transaction, test_file_up_n_download) {
   }
 }
 
+/*
+ * Test a small worklfow
+ */
+TEST_F(test_transaction, test_full_workflow) {
+  const auto &connection =
+      caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  // ######  Create Data Model  ######
+  Entity dataRT;
+  dataRT.SetRole(Role::RECORD_TYPE);
+  dataRT.SetName("DataRT");
+
+  Entity voltage;
+  voltage.SetRole(Role::PROPERTY);
+  voltage.SetName("voltage");
+  voltage.SetUnit("V");
+  voltage.SetDataType(AtomicDataType::DOUBLE);
+
+  Entity notes;
+  notes.SetRole(Role::PROPERTY);
+  notes.SetName("notes");
+  notes.SetDataType(AtomicDataType::TEXT);
+
+  Entity participants;
+  participants.SetRole(Role::PROPERTY);
+  participants.SetName("participants");
+  participants.SetDataType(AtomicDataType::INTEGER);
+  // participants.SetDataType(ListDataType::);
+
+  Entity success;
+  success.SetRole(Role::PROPERTY);
+  success.SetName("success");
+  success.SetDataType(AtomicDataType::BOOLEAN);
+
+  Entity experiment;
+  experiment.SetRole(Role::RECORD_TYPE);
+  experiment.SetName("Experiment");
+  // TODO(henrik): creating this extra Property (additionally to the Entity
+  // above) is VERY clumsy
+  Property volt_for_rt;
+  volt_for_rt.SetName(voltage.GetName());
+  volt_for_rt.SetImportance(Importance::RECOMMENDED);
+  experiment.AppendProperty(volt_for_rt);
+  Property notes_for_rt2;
+  notes_for_rt2.SetName(notes.GetName());
+  notes_for_rt2.SetImportance(Importance::RECOMMENDED);
+  experiment.AppendProperty(notes_for_rt2);
+  Property part_for_rt3;
+  part_for_rt3.SetName(participants.GetName());
+  part_for_rt3.SetImportance(Importance::SUGGESTED);
+  experiment.AppendProperty(part_for_rt3);
+  Property succ_for_rt;
+  succ_for_rt.SetName(success.GetName());
+  succ_for_rt.SetImportance(Importance::SUGGESTED);
+  experiment.AppendProperty(succ_for_rt);
+
+  auto insert_transaction(connection->CreateTransaction());
+  insert_transaction->InsertEntity(&dataRT);
+  auto insert_status = insert_transaction->Execute();
+  const auto &insert_results = insert_transaction->GetResultSet();
+  const auto &inserted_ent = insert_results.at(0);
+  ASSERT_FALSE(inserted_ent.GetId().empty());
+  ASSERT_FALSE(inserted_ent.HasErrors());
+
+  insert_transaction = connection->CreateTransaction();
+  insert_transaction->InsertEntity(&voltage);
+  insert_status = insert_transaction->Execute();
+  insert_transaction = connection->CreateTransaction();
+  insert_transaction->InsertEntity(&notes);
+  insert_status = insert_transaction->Execute();
+  insert_transaction = connection->CreateTransaction();
+  insert_transaction->InsertEntity(&participants);
+  insert_status = insert_transaction->Execute();
+  insert_transaction = connection->CreateTransaction();
+  insert_transaction->InsertEntity(&success);
+  insert_status = insert_transaction->Execute();
+  insert_transaction = connection->CreateTransaction();
+  insert_transaction->InsertEntity(&experiment);
+  insert_status = insert_transaction->Execute();
+
+  auto retr_transaction(connection->CreateTransaction());
+  retr_transaction->Query("FIND Experiment");
+  retr_transaction->Execute();
+  EXPECT_EQ(retr_transaction->GetResultSet().size(), 1);
+
+  Parent experiment_parent;
+  experiment_parent.SetName("Experiment");
+
+  for (int i = 0; i < 8; i++) {
+    Entity experiment_rec;
+    experiment_rec.SetRole(Role::RECORD);
+    experiment_rec.AppendParent(experiment_parent);
+    volt_for_rt.SetValue(1.6);
+    experiment_rec.AppendProperty(volt_for_rt);
+    notes_for_rt2.SetValue("This is important!");
+    experiment_rec.AppendProperty(notes_for_rt2);
+    part_for_rt3.SetValue(static_cast<int64_t>(6));
+    experiment_rec.AppendProperty(part_for_rt3);
+    succ_for_rt.SetValue(true);
+    experiment_rec.AppendProperty(succ_for_rt);
+    auto rec_insert_transaction(connection->CreateTransaction());
+    rec_insert_transaction->InsertEntity(&experiment_rec);
+    std::cout << "before ..." << std::endl;
+    insert_status = rec_insert_transaction->Execute();
+    std::cout << "after ..." << std::endl;
+  }
+
+  retr_transaction=connection->CreateTransaction();
+  retr_transaction->Query("FIND Record Experiment");
+  retr_transaction->Execute();
+  EXPECT_EQ(retr_transaction->GetResultSet().size(), 8);
+
+  auto to_be_updated = retr_transaction->GetResultSet().at(0);
+  // TODO using the index for deletion is very inconvenient
+  to_be_updated.RemoveProperty(0);
+  to_be_updated.SetName("changedone");
+
+  auto update_transaction(connection->CreateTransaction());
+  update_transaction->UpdateEntity(&to_be_updated);
+  update_transaction->Execute();
+
+  retr_transaction=connection->CreateTransaction();
+  retr_transaction->Query("FIND Record Experiment with name=changedone");
+  retr_transaction->Execute();
+  EXPECT_EQ(retr_transaction->GetResultSet().size(), 1);
+}
+
 } // namespace caosdb::transaction
-- 
GitLab