diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp index 1c65d8dec68e7f29ee22ef9cab7f207d38a82661..e816b8942946e8865278a7d49fbba40c5c265c8e 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(¬es); + 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(henrik) 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