From 0d72ee86046909b4a001de9fce4b70823b3bb9af Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Wed, 4 Aug 2021 13:55:10 +0200
Subject: [PATCH] WIP: file download

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

diff --git a/test/test_file_transmission.cpp b/test/test_file_transmission.cpp
index a54fbc7..7c6a72d 100644
--- a/test/test_file_transmission.cpp
+++ b/test/test_file_transmission.cpp
@@ -18,17 +18,23 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  *
  */
-#include "caosdb/connection.h"         // for Connection, ConnectionManager
+#include "caosdb/connection.h" // for Connection, ConnectionManager
+#include "caosdb/entity.h"
 #include "caosdb/entity/v1alpha1/main.pb.h"
-#include "caosdb/transaction.h"        // for Entity, Transaction, UniqueRe...
+#include "caosdb/transaction.h"    // for Transaction, UniqueRe...
 #include "gtest/gtest-message.h"   // for Message
 #include "gtest/gtest-test-part.h" // for TestPartResult, SuiteApiResolver
 #include "gtest/gtest_pred_impl.h" // for Test, EXPECT_EQ, AssertionResult
 #include <memory>                  // for unique_ptr, allocator, __shar...
 #include <string>                  // for string
 namespace caosdb::transaction {
+using caosdb::entity::Entity;
+using caosdb::entity::v1alpha1::FileDownloadResponse;
+using caosdb::entity::v1alpha1::FileUploadResponse;
+using caosdb::entity::v1alpha1::RegisterFileDownloadResponse;
 using caosdb::entity::v1alpha1::RegisterFileUploadResponse;
 using caosdb::entity::v1alpha1::RegistrationStatus;
+using caosdb::entity::v1alpha1::TransmissionStatus;
 
 class test_file_transmission : public ::testing::Test {
 protected:
@@ -55,4 +61,98 @@ TEST_F(test_file_transmission, register_file_upload) {
   EXPECT_FALSE(response.registration_id().empty());
 }
 
+TEST_F(test_file_transmission, file_upload) {
+  const auto &connection =
+    caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  auto transaction(connection->CreateTransaction());
+  RegisterFileUploadResponse registration_response;
+
+  transaction->RegisterUploadFile(&registration_response);
+  ASSERT_EQ(registration_response.status(),
+            RegistrationStatus::REGISTRATION_STATUS_ACCEPTED);
+  auto registration_id = registration_response.registration_id();
+
+  FileUploadResponse upload_response;
+  transaction->UploadFile(&upload_response, registration_id);
+
+  EXPECT_EQ(upload_response.status(),
+            TransmissionStatus::TRANSMISSION_STATUS_GO_ON);
+}
+
+TEST_F(test_file_transmission, file_insertion) {
+  const auto &connection =
+    caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  auto transaction(connection->CreateTransaction());
+  RegisterFileUploadResponse registration_response;
+
+  transaction->RegisterUploadFile(&registration_response);
+  ASSERT_EQ(registration_response.status(),
+            RegistrationStatus::REGISTRATION_STATUS_ACCEPTED);
+  auto registration_id = registration_response.registration_id();
+
+  FileUploadResponse upload_response;
+  transaction->UploadFile(&upload_response, registration_id);
+
+  Entity file_entity;
+  file_entity.SetRole("File");
+  file_entity.SetFileTransmissionId(registration_id, "test.txt");
+  file_entity.SetFilePath("test.txt");
+
+  transaction->InsertEntity(&file_entity);
+  transaction->Execute();
+
+  auto cleanup_transaction(connection->CreateTransaction());
+  cleanup_transaction->DeleteById(transaction->GetResultSet().At(0).GetId());
+  cleanup_transaction->Execute();
+}
+
+TEST_F(test_file_transmission, file_download) {
+  const auto &connection =
+    caosdb::connection::ConnectionManager::GetDefaultConnection();
+
+  auto upload_transaction(connection->CreateTransaction());
+  RegisterFileUploadResponse upload_registration_response;
+
+  upload_transaction->RegisterUploadFile(&upload_registration_response);
+  ASSERT_EQ(upload_registration_response.status(),
+            RegistrationStatus::REGISTRATION_STATUS_ACCEPTED);
+  auto registration_id = upload_registration_response.registration_id();
+
+  FileUploadResponse upload_response;
+  upload_transaction->UploadFile(&upload_response, registration_id);
+
+  Entity file_entity;
+  file_entity.SetRole("File");
+  file_entity.SetFileTransmissionId(registration_id, "test.txt");
+  file_entity.SetFilePath("test.txt");
+
+  upload_transaction->InsertEntity(&file_entity);
+  upload_transaction->Execute();
+
+  // Download by entity_id
+  auto download_transaction(connection->CreateTransaction());
+  RegisterFileDownloadResponse download_registration_response;
+  RegisterFileDownloadRequest download_registration_request;
+  download_registration_request.add_files()->set_entity_id(
+    upload_transaction->GetResultSet().At(0).GetId());
+  download_transaction->RegisterDownloadFile(download_registration_request,
+                                             &download_registration_response);
+  ASSERT_EQ(download_registration_response.status(),
+            RegistrationStatus::REGISTRATION_STATUS_ACCEPTED);
+
+  FileDownloadResponse download_response;
+  download_transaction->DownloadFile(&download_response,
+                                     download_registration_response);
+
+  EXPECT_EQ(download_response.chunk().data(), "this is some data");
+
+  // CLEANUP
+  auto cleanup_transaction(connection->CreateTransaction());
+  cleanup_transaction->DeleteById(
+    upload_transaction->GetResultSet().At(0).GetId());
+  cleanup_transaction->Execute();
+}
+
 } // namespace caosdb::transaction
-- 
GitLab