From 7be3cb3117e9c074f52d1fbbf314e1ebc037c5e1 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Thu, 30 Jun 2022 17:23:27 +0200
Subject: [PATCH] Add tests for user creation/deletion/retrieval

---
 test/CMakeLists.txt        |  1 +
 test/caosdb_test_utility.h |  8 +++++
 test/test_user.cpp         | 66 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 75 insertions(+)
 create mode 100644 test/test_user.cpp

diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 347d017..1fc192c 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -29,6 +29,7 @@ set(test_cases
     test_transaction
     test_ccaosdb
     test_issues
+    test_user
     )
 
 
diff --git a/test/caosdb_test_utility.h b/test/caosdb_test_utility.h
index 581e603..7c29f90 100644
--- a/test/caosdb_test_utility.h
+++ b/test/caosdb_test_utility.h
@@ -45,4 +45,12 @@
       throw;                                                                                       \
     },                                                                                             \
     exeption_type)
+#define EXPECT_THROW_STARTS_WITH(statement, exception_type, pattern)                               \
+  EXPECT_THROW(                                                                                    \
+    try { statement; } catch (const exception_type &e) {                                           \
+      auto pat_s = std::string(pattern);                                                           \
+      EXPECT_EQ(std::string(e.what()).substr(0, pat_s.size()), pat_s);                             \
+      throw;                                                                                       \
+    },                                                                                             \
+    exception_type)
 #endif
diff --git a/test/test_user.cpp b/test/test_user.cpp
new file mode 100644
index 0000000..3400822
--- /dev/null
+++ b/test/test_user.cpp
@@ -0,0 +1,66 @@
+/*
+ * This file is a part of the CaosDB Project.
+ *
+ * Copyright (C) 2022 Timm Fitschen <t.fitschen@indiscale.com>
+ * Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+#include "caosdb/acm/user.h"             // for User
+#include "caosdb/connection.h"           // for Connection, VersionInfo, path
+#include "caosdb/exceptions.h"           // for TransactionError
+#include "caosdb_test_utility.h"         // for EXPECT_THROW_MESSAGE
+#include <gtest/gtest-message.h>   // for Message
+#include <gtest/gtest-test-part.h> // for SuiteApiResolver, TestPartR...
+#include <gtest/gtest_pred_impl.h> // for Test, TestInfo, TEST, EXPEC...
+#include <memory>                  // for allocator, unique_ptr, __sh...
+#include <string>                  // for stoi, string
+
+namespace caosdb::connection {
+using caosdb::acm::User;
+
+TEST(test_user, test_create_single_user_failure_invalid_name) {
+  auto connection = ConnectionManager::GetDefaultConnection();
+  User user("CaosDB", "-user1");
+  EXPECT_THROW_STARTS_WITH(
+    connection->CreateSingleUser(user), caosdb::exceptions::Exception,
+    "The attempt to execute this transaction was not successful because an error occured in the "
+    "transport or RPC protocol layer. Original error: 2 - The user name does not comply with the "
+    "current policies for user names:");
+}
+
+TEST(test_user, test_create_single_user_failure_invalid_password) {
+  auto connection = ConnectionManager::GetDefaultConnection();
+  User user("CaosDB", "user1");
+  user.SetPassword("1234");
+  EXPECT_THROW_STARTS_WITH(
+    connection->CreateSingleUser(user), caosdb::exceptions::Exception,
+    "The attempt to execute this transaction was not successful because an error occured in the "
+    "transport or RPC protocol layer. Original error: 2 - The password does not comply with the "
+    "current policies for passwords: ");
+}
+
+TEST(test_user, test_create_single_user_success) {
+  auto connection = ConnectionManager::GetDefaultConnection();
+  User user("CaosDB", "user1");
+  user.SetPassword("Password1!");
+  connection->CreateSingleUser(user);
+  auto re = connection->RetrieveSingleUser("CaosDB", "user1");
+  EXPECT_EQ(re.GetName(), user.GetName());
+  connection->DeleteSingleUser("CaosDB", "user1");
+  EXPECT_THROW_MESSAGE(connection->RetrieveSingleUser("CaosDB", "user1"), caosdb::exceptions::Exception, "The attempt to execute this transaction was not successful because an error occured in the transport or RPC protocol layer. Original error: 5 - This account does not exist.");
+}
+
+} // namespace caosdb::connection
-- 
GitLab