From 138a04c0f3f07fb6b751dd281dc64b3c38b77100 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Sat, 16 Mar 2024 09:59:17 +0100
Subject: [PATCH] Updated tests

---
 .../src/test/java/at/tuwien/BaseUnitTest.java |  51 ++++++++++
 .../IdentifierEndpointIntegrationTest.java    |   9 +-
 .../endpoints/IdentifierEndpointUnitTest.java |   2 +-
 .../MetadataEndpointComponentTest.java        |   8 +-
 .../PersistenceEndpointUnitTest.java          |   4 +-
 .../service/AccessServiceIntegrationTest.java |   8 +-
 .../BannerMessageServiceIntegrationTest.java  |   2 +
 .../ContainerServiceIntegrationTest.java      |   2 +
 ...aCiteIdentifierServiceIntegrationTest.java |   8 +-
 .../DataCiteIdentifierServiceUnitTest.java    |   5 +-
 .../DatabaseServiceIntegrationTest.java       |   9 +-
 .../service/EntityServiceIntegrationTest.java |   6 +-
 .../IdentifierServiceIntegrationTest.java     |  15 +--
 .../service/ImageServiceIntegrationTest.java  |   2 +
 .../LicenseServiceIntegrationTest.java        |   2 +
 .../MessageQueueServiceIntegrationTest.java   |   5 +-
 .../MetadataServiceIntegrationTest.java       |   8 +-
 .../service/PersistenceIntegrationTest.java   |   2 +
 .../service/QueryServiceIntegrationTest.java  |  14 +--
 .../QueryStoreServiceIntegrationTest.java     |   6 +-
 .../SemanticServiceIntegrationTest.java       |   5 +-
 .../service/StoreServiceIntegrationTest.java  |   5 +-
 .../TableColumnServiceIntegrationTest.java    |  14 +--
 .../TableServiceIntegrationReadTest.java      |   6 +-
 .../TableServiceIntegrationWriteTest.java     |  14 +--
 .../tuwien/service/TableServiceUnitTest.java  |   2 +-
 .../service/UserServiceIntegrationTest.java   |   2 +
 .../service/ViewServiceIntegrationTest.java   |  14 +--
 ...ViewServicePersistenceIntegrationTest.java |  18 +---
 .../service/impl/MariaDbServiceImpl.java      |   7 +-
 .../main/java/at/tuwien/test/BaseTest.java    |  92 ++++++++++++------
 dbrepo-ui/bun.lockb                           | Bin 363576 -> 363576 bytes
 dbrepo-ui/components/dialogs/TimeTravel.vue   |  76 ++++++++++++++-
 dbrepo-ui/composables/table-service.ts        |  17 ++++
 dbrepo-ui/dto/index.ts                        |   6 ++
 dbrepo-ui/locales/de-AT.json                  |   9 +-
 dbrepo-ui/locales/en-US.json                  |   5 +-
 37 files changed, 268 insertions(+), 192 deletions(-)

diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java
index 940fee6b01..723f8c04ed 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java
@@ -3,6 +3,57 @@ package at.tuwien;
 import at.tuwien.test.BaseTest;
 import org.springframework.test.context.TestPropertySource;
 
+import java.util.List;
+
 @TestPropertySource(locations = "classpath:application.properties")
 public abstract class BaseUnitTest extends BaseTest {
+
+    public void genesis() {
+        /* DATABASE 1 */
+        DATABASE_1.setAccesses(List.of());
+        TABLE_1.setDatabase(DATABASE_1);
+        TABLE_1.setColumns(TABLE_1_COLUMNS);
+        TABLE_1_FOREIGN_KEY_1.getReferences().add(TABLE_1_FOREIGN_KEY_REFERENCE);
+        TABLE_1.getConstraints().getForeignKeys().add(TABLE_1_FOREIGN_KEY_1);
+        TABLE_1.getConstraints().getChecks().add(TABLE_1_CHECK_1);
+//        TABLE_1.getConstraints().getUniques().add(TABLE_1_UNIQUE_CONSTRAINT_1);
+        TABLE_2.setDatabase(DATABASE_1);
+        TABLE_2.setColumns(TABLE_2_COLUMNS);
+        TABLE_2.setConstraints(TABLE_2_CONSTRAINTS);
+        TABLE_3.setDatabase(DATABASE_1);
+        TABLE_3.setColumns(TABLE_3_COLUMNS);
+        TABLE_3.setConstraints(TABLE_3_CONSTRAINTS);
+        TABLE_4.setDatabase(DATABASE_1);
+        TABLE_4.setColumns(TABLE_4_COLUMNS);
+        TABLE_4.setConstraints(TABLE_4_CONSTRAINTS);
+        VIEW_1.setDatabase(DATABASE_1);
+        VIEW_1.setColumns(VIEW_1_COLUMNS);
+        VIEW_2.setDatabase(DATABASE_1);
+        VIEW_2.setColumns(VIEW_2_COLUMNS);
+        VIEW_3.setDatabase(DATABASE_1);
+        VIEW_3.setColumns(VIEW_3_COLUMNS);
+        IDENTIFIER_1.setDatabase(DATABASE_1);
+        IDENTIFIER_2.setDatabase(DATABASE_1);
+        IDENTIFIER_3.setDatabase(DATABASE_1);
+        IDENTIFIER_4.setDatabase(DATABASE_1);
+        /* DATABASE 2 */
+        DATABASE_2.setAccesses(List.of());
+        TABLE_5.setDatabase(DATABASE_2);
+        TABLE_5.setColumns(TABLE_5_COLUMNS);
+        TABLE_6.setDatabase(DATABASE_2);
+        TABLE_6.setColumns(TABLE_6_COLUMNS);
+        TABLE_7.setDatabase(DATABASE_2);
+        TABLE_7.setColumns(TABLE_7_COLUMNS);
+        VIEW_4.setDatabase(DATABASE_2);
+        VIEW_4.setColumns(VIEW_4_COLUMNS);
+        IDENTIFIER_5.setDatabase(DATABASE_2);
+        /* DATABASE 3 */
+        DATABASE_3.setAccesses(List.of());
+        TABLE_8.setDatabase(DATABASE_3);
+        TABLE_8.setColumns(TABLE_8_COLUMNS);
+        VIEW_5.setDatabase(DATABASE_3);
+        VIEW_5.setColumns(VIEW_5_COLUMNS);
+        IDENTIFIER_6.setDatabase(DATABASE_3);
+    }
+
 }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointIntegrationTest.java
index 5578921899..e448932f9a 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointIntegrationTest.java
@@ -48,14 +48,7 @@ public class IdentifierEndpointIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        TABLE_5.setColumns(TABLE_5_COLUMNS);
-        TABLE_6.setColumns(TABLE_6_COLUMNS);
-        TABLE_7.setColumns(TABLE_7_COLUMNS);
-        TABLE_8.setColumns(TABLE_8_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4));
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java
index 2b2627cc18..024c9d179b 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java
@@ -71,7 +71,7 @@ public class IdentifierEndpointUnitTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        IDENTIFIER_1.setDatabase(DATABASE_1);
+        genesis();
     }
 
     @Test
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointComponentTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointComponentTest.java
index 9db11e5c7c..198f19d903 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointComponentTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointComponentTest.java
@@ -54,13 +54,7 @@ public class MetadataEndpointComponentTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        TABLE_5.setColumns(TABLE_5_COLUMNS);
-        TABLE_6.setColumns(TABLE_6_COLUMNS);
-        TABLE_7.setColumns(TABLE_7_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         userRepository.saveAll(List.of(USER_1, USER_2));
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/PersistenceEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/PersistenceEndpointUnitTest.java
index bc0bc1b066..bbe4c7432e 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/PersistenceEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/PersistenceEndpointUnitTest.java
@@ -51,9 +51,7 @@ public class PersistenceEndpointUnitTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        IDENTIFIER_1.setDatabase(DATABASE_1);
-        IDENTIFIER_5.setDatabase(DATABASE_2);
-        IDENTIFIER_6.setDatabase(DATABASE_3);
+        genesis();
     }
 
     @Test
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java
index ce2a42a9cd..db272d870f 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceIntegrationTest.java
@@ -71,13 +71,7 @@ public class AccessServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() throws SQLException {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        TABLE_5.setColumns(TABLE_5_COLUMNS);
-        TABLE_6.setColumns(TABLE_6_COLUMNS);
-        TABLE_7.setColumns(TABLE_7_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         licenseRepository.save(LICENSE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/BannerMessageServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/BannerMessageServiceIntegrationTest.java
index 8ed3f1f9d7..288090718d 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/BannerMessageServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/BannerMessageServiceIntegrationTest.java
@@ -45,6 +45,8 @@ public class BannerMessageServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
+        genesis();
+        /* metadata database */
         bannerMessageRepository.save(BANNER_MESSAGE_1);
         bannerMessageRepository.save(BANNER_MESSAGE_2);
     }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
index 172c9801d6..7a15bd9032 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ContainerServiceIntegrationTest.java
@@ -43,6 +43,8 @@ public class ContainerServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
+        genesis();
+        /* metadata database */
         imageRepository.save(IMAGE_1);
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceIntegrationTest.java
index 4c903a82eb..06b43ac056 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceIntegrationTest.java
@@ -81,13 +81,7 @@ public class DataCiteIdentifierServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        TABLE_5.setColumns(TABLE_5_COLUMNS);
-        TABLE_6.setColumns(TABLE_6_COLUMNS);
-        TABLE_7.setColumns(TABLE_7_COLUMNS);
+        genesis();
         /* metadata database */
         licenseRepository.save(LICENSE_1);
         imageRepository.save(IMAGE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java
index afa00b5308..c0f4cd031f 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java
@@ -89,10 +89,7 @@ public class DataCiteIdentifierServiceUnitTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
+        genesis();
         /* metadata database */
         licenseRepository.save(LICENSE_1);
         imageRepository.save(IMAGE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
index 45d8bd5c54..80a555b9c3 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
@@ -88,14 +88,7 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() throws SQLException, IOException {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        TABLE_5.setColumns(TABLE_5_COLUMNS);
-        TABLE_6.setColumns(TABLE_6_COLUMNS);
-        TABLE_7.setColumns(TABLE_7_COLUMNS);
-        TABLE_8.setColumns(TABLE_8_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         licenseRepository.save(LICENSE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/EntityServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/EntityServiceIntegrationTest.java
index 0fb358df35..dba50caca8 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/EntityServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/EntityServiceIntegrationTest.java
@@ -53,17 +53,13 @@ public class EntityServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
+        genesis();
         /* metadata database */
         ontologyRepository.saveAll(List.of(ONTOLOGY_1, ONTOLOGY_2, ONTOLOGY_3, ONTOLOGY_4, ONTOLOGY_5));
         imageRepository.save(IMAGE_1);
         licenseRepository.save(LICENSE_1);
         userRepository.save(USER_1);
         containerRepository.save(CONTAINER_1);
-        DATABASE_1.setAccesses(List.of());
         databaseRepository.save(DATABASE_1);
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java
index 2e5a57a870..a82c25a658 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java
@@ -100,20 +100,12 @@ public class IdentifierServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        TABLE_5.setColumns(TABLE_5_COLUMNS);
-        TABLE_6.setColumns(TABLE_6_COLUMNS);
-        TABLE_7.setColumns(TABLE_7_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4));
         licenseRepository.save(LICENSE_1);
         containerRepository.saveAll(List.of(CONTAINER_1, CONTAINER_2));
-        DATABASE_1.setAccesses(List.of());
-        DATABASE_2.setAccesses(List.of());
         databaseRepository.saveAll(List.of(DATABASE_1, DATABASE_2));
         /* search database */
         databaseIdxRepository.deleteAll();
@@ -285,9 +277,8 @@ public class IdentifierServiceIntegrationTest extends BaseUnitTest {
 
     @Test
     public void create_noRelatedTitleDescription_succeeds() throws DatabaseNotFoundException, UserNotFoundException,
-            IdentifierAlreadyExistsException, QueryNotFoundException, IdentifierPublishingNotAllowedException,
-            RemoteUnavailableException, IdentifierRequestException, ViewNotFoundException, QueryStoreException,
-            DatabaseConnectionException, ImageNotSupportedException, IdentifierNotFoundException {
+            QueryNotFoundException, RemoteUnavailableException, IdentifierRequestException, ViewNotFoundException,
+            QueryStoreException, ImageNotSupportedException {
 
         /* mock */
         containerRepository.saveAll(List.of(CONTAINER_3, CONTAINER_4));
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java
index 07c32c5205..be077e8dc2 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java
@@ -44,6 +44,8 @@ public class ImageServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
+        genesis();
+        /* metadata database */
         imageRepository.save(IMAGE_1);
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/LicenseServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/LicenseServiceIntegrationTest.java
index a9e4490d09..5271136428 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/LicenseServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/LicenseServiceIntegrationTest.java
@@ -44,6 +44,8 @@ public class LicenseServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
+        genesis();
+        /* metadata database */
         licenseRepository.save(LICENSE_1);
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java
index 28ccbb19e3..dcf14c7e5b 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MessageQueueServiceIntegrationTest.java
@@ -80,10 +80,7 @@ public class MessageQueueServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
+        genesis();
         /* metadata database */
         userRepository.saveAll(List.of(USER_1, USER_2, USER_3));
         imageRepository.save(IMAGE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MetadataServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MetadataServiceIntegrationTest.java
index 185c7cda61..9649180cf9 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MetadataServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/MetadataServiceIntegrationTest.java
@@ -52,13 +52,7 @@ public class MetadataServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        VIEW_1.setColumns(VIEW_1_COLUMNS);
-        VIEW_2.setColumns(VIEW_2_COLUMNS);
-        VIEW_3.setColumns(VIEW_3_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         userRepository.save(USER_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/PersistenceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/PersistenceIntegrationTest.java
index 5f6e1045f5..68710c4604 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/PersistenceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/PersistenceIntegrationTest.java
@@ -35,6 +35,8 @@ public class PersistenceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
+        genesis();
+        /* metadata database */
         imageRepository.save(IMAGE_1);
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/QueryServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/QueryServiceIntegrationTest.java
index 5ead5ebb94..daf263e9b8 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/QueryServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/QueryServiceIntegrationTest.java
@@ -110,19 +110,7 @@ public class QueryServiceIntegrationTest extends BaseUnitTest {
     @BeforeEach
     public void beforeEach() throws SQLException, DatabaseUnchangedException, QueryMalformedException,
             ColumnParseException, DatabaseNotFoundException, TableMalformedException {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        TABLE_5.setColumns(TABLE_5_COLUMNS);
-        TABLE_6.setColumns(TABLE_6_COLUMNS);
-        TABLE_7.setColumns(TABLE_7_COLUMNS);
-        DATABASE_1.setAccesses(List.of());
-        DATABASE_2.setAccesses(List.of());
-        VIEW_1.setColumns(VIEW_1_COLUMNS);
-        VIEW_2.setColumns(VIEW_2_COLUMNS);
-        VIEW_3.setColumns(VIEW_3_COLUMNS);
-        VIEW_4.setColumns(VIEW_4_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         licenseRepository.save(LICENSE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/QueryStoreServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/QueryStoreServiceIntegrationTest.java
index 5f60fdc995..f947de9390 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/QueryStoreServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/QueryStoreServiceIntegrationTest.java
@@ -60,11 +60,7 @@ public class QueryStoreServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() throws SQLException {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        DATABASE_1.setAccesses(List.of());
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         licenseRepository.save(LICENSE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/SemanticServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/SemanticServiceIntegrationTest.java
index 50466c7775..83396e991f 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/SemanticServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/SemanticServiceIntegrationTest.java
@@ -52,10 +52,7 @@ public class SemanticServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         userRepository.save(USER_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/StoreServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/StoreServiceIntegrationTest.java
index 3bb487e8e7..bbf141ee0c 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/StoreServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/StoreServiceIntegrationTest.java
@@ -72,10 +72,7 @@ public class StoreServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() throws SQLException {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4, USER_5));
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableColumnServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableColumnServiceIntegrationTest.java
index 2391a52290..bb67382b3f 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableColumnServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableColumnServiceIntegrationTest.java
@@ -65,19 +65,7 @@ public class TableColumnServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() throws SQLException {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_1_FOREIGN_KEY_1.setReferences(List.of(TABLE_1_FOREIGN_KEY_REFERENCE));
-        TABLE_1.setConstraints(TABLE_1_CONSTRAINTS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_2.setConstraints(TABLE_2_CONSTRAINTS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_3.setConstraints(TABLE_3_CONSTRAINTS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        DATABASE_1.setAccesses(List.of());
-        TABLE_1.setDatabase(DATABASE_1);
-        TABLE_2.setDatabase(DATABASE_1);
-        TABLE_3.setDatabase(DATABASE_1);
-        TABLE_4.setDatabase(DATABASE_1);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         licenseRepository.save(LICENSE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java
index c5a2400daf..16dd262e73 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationReadTest.java
@@ -64,11 +64,7 @@ public class TableServiceIntegrationReadTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() throws SQLException {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        DATABASE_1.setAccesses(List.of());
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         licenseRepository.save(LICENSE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationWriteTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationWriteTest.java
index 685604fa78..f4b9bddcb8 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationWriteTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationWriteTest.java
@@ -73,19 +73,7 @@ public class TableServiceIntegrationWriteTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() throws SQLException {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_1_FOREIGN_KEY_1.setReferences(List.of(TABLE_1_FOREIGN_KEY_REFERENCE));
-        TABLE_1.setConstraints(TABLE_1_CONSTRAINTS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_2.setConstraints(TABLE_2_CONSTRAINTS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_3.setConstraints(TABLE_3_CONSTRAINTS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        DATABASE_1.setAccesses(List.of());
-        TABLE_1.setDatabase(DATABASE_1);
-        TABLE_2.setDatabase(DATABASE_1);
-        TABLE_3.setDatabase(DATABASE_1);
-        TABLE_4.setDatabase(DATABASE_1);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         licenseRepository.save(LICENSE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
index 864153b939..eb36aba4e9 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
@@ -44,7 +44,7 @@ public class TableServiceUnitTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_8.setColumns(TABLE_8_COLUMNS);
+        genesis();
     }
 
     @Test
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java
index b95514d5dd..63adc23a88 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java
@@ -45,6 +45,8 @@ public class UserServiceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
+        genesis();
+        /* metadata database */
         userRepository.save(USER_1);
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
index 8ce238c0a0..3e67e06f90 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
@@ -95,19 +95,7 @@ public class ViewServiceIntegrationTest extends BaseUnitTest {
     @BeforeEach
     public void beforeEach() throws DatabaseUnchangedException, QueryMalformedException, ColumnParseException,
             DatabaseNotFoundException, TableMalformedException {
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        TABLE_5.setColumns(TABLE_5_COLUMNS);
-        TABLE_6.setColumns(TABLE_6_COLUMNS);
-        TABLE_7.setColumns(TABLE_7_COLUMNS);
-        DATABASE_1.setAccesses(List.of());
-        DATABASE_2.setAccesses(List.of());
-        VIEW_1.setColumns(VIEW_1_COLUMNS);
-        VIEW_2.setColumns(VIEW_2_COLUMNS);
-        VIEW_3.setColumns(VIEW_3_COLUMNS);
-        VIEW_4.setColumns(VIEW_4_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         licenseRepository.save(LICENSE_1);
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceIntegrationTest.java
index d57aad6985..a1e87897d0 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceIntegrationTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceIntegrationTest.java
@@ -7,6 +7,7 @@ import at.tuwien.annotations.MockOpensearch;
 import at.tuwien.api.database.ViewCreateDto;
 import at.tuwien.config.MariaDbConfig;
 import at.tuwien.config.MariaDbContainerConfig;
+import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.View;
 import at.tuwien.exception.*;
 import at.tuwien.repository.mdb.*;
@@ -71,25 +72,14 @@ public class ViewServicePersistenceIntegrationTest extends BaseUnitTest {
 
     @BeforeEach
     public void beforeEach() {
-        TABLE_1.setDatabase(DATABASE_1);
-        TABLE_2.setDatabase(DATABASE_1);
-        TABLE_3.setDatabase(DATABASE_1);
-        TABLE_4.setDatabase(DATABASE_1);
-        VIEW_1.setDatabase(DATABASE_1);
-        VIEW_2.setDatabase(DATABASE_1);
-        VIEW_3.setDatabase(DATABASE_1);
-        TABLE_1.setColumns(TABLE_1_COLUMNS);
-        TABLE_2.setColumns(TABLE_2_COLUMNS);
-        TABLE_3.setColumns(TABLE_3_COLUMNS);
-        TABLE_4.setColumns(TABLE_4_COLUMNS);
-        TABLE_5.setColumns(TABLE_5_COLUMNS);
-        TABLE_6.setColumns(TABLE_6_COLUMNS);
-        TABLE_7.setColumns(TABLE_7_COLUMNS);
+        genesis();
         /* metadata database */
         imageRepository.save(IMAGE_1);
         licenseRepository.save(LICENSE_1);
         userRepository.saveAll(List.of(USER_1, USER_2, USER_3));
         containerRepository.saveAll(List.of(CONTAINER_1, CONTAINER_2));
+        final Database db1 = DATABASE_1;
+        final Database db2 = DATABASE_2;
         databaseRepository.saveAll(List.of(DATABASE_1, DATABASE_2));
     }
 
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java
index fa56829a4b..f269ab631b 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java
@@ -340,6 +340,11 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe
                     preparedStatement2.execute();
                     log.info("Enabled system-versioning for table with name {}", table.getInternalName());
                 }
+                table.setConstraints(Constraints.builder()
+                                .checks(new LinkedHashSet<>())
+                                .foreignKeys(new LinkedList<>())
+                                .uniques(new LinkedList<>())
+                        .build());
                 table.setProcessedConstraints(false);
                 final PreparedStatement preparedStatement3 = tableMapper.tableToCreateHistoryViewRawQuery(connection, table);
                 preparedStatement3.executeUpdate();
@@ -354,7 +359,7 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe
         /* update in metadata database */
         final Database entity = databaseRepository.save(database);
         /* save in open search database */
-        databaseIdxRepository.save(databaseMapper.databaseToDatabaseDto(entity));
+        databaseIdxRepository.save(databaseMapper.databaseToDatabaseDto(database));
         log.info("Updated database with id {} in metadata database & search database", entity.getId());
         return entity;
     }
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
index 9ff8a4ec32..027e8c8b1f 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
@@ -1342,6 +1342,12 @@ public abstract class BaseTest {
     public final static Instant TABLE_1_CREATED = Instant.ofEpochSecond(1677399975L) /* 2023-02-26 08:26:15 (UTC) */;
     public final static Instant TABLE_1_LAST_MODIFIED = Instant.ofEpochSecond(1677399975L) /* 2023-02-26 08:26:15 (UTC) */;
 
+    public final static Constraints TABLE_1_CONSTRAINTS = Constraints.builder()
+            .foreignKeys(new LinkedList<>())
+            .uniques(new LinkedList<>())
+            .checks(new LinkedHashSet<>())
+            .build();
+
     public final static Table TABLE_1 = Table.builder()
             .id(TABLE_1_ID)
             .tdbid(DATABASE_1_ID)
@@ -1356,7 +1362,7 @@ public abstract class BaseTest {
             .routingKey(TABLE_1_ROUTING_KEY)
             .identifiers(List.of())
             .columns(List.of() /* TABLE_1_COLUMNS */)
-            .constraints(null /* TABLE_1_CONSTRAINTS */)
+            .constraints(TABLE_1_CONSTRAINTS)
             .createdBy(USER_1_ID)
             .creator(USER_1)
             .ownedBy(USER_1_ID)
@@ -1402,6 +1408,12 @@ public abstract class BaseTest {
     public final static Instant TABLE_2_CREATED = Instant.ofEpochSecond(1677400007L) /* 2023-02-26 08:26:47 (UTC) */;
     public final static Instant TABLE_2_LAST_MODIFIED = Instant.ofEpochSecond(1677400007L) /* 2023-02-26 08:26:47 (UTC) */;
 
+    public final static Constraints TABLE_2_CONSTRAINTS = Constraints.builder()
+            .uniques(new LinkedList<>())
+            .foreignKeys(new LinkedList<>())
+            .checks(new LinkedHashSet<>())
+            .build();
+
     public final static Table TABLE_2 = Table.builder()
             .id(TABLE_2_ID)
             .tdbid(DATABASE_1_ID)
@@ -1416,7 +1428,7 @@ public abstract class BaseTest {
             .queueName(TABLE_2_QUEUE_NAME)
             .routingKey(TABLE_2_ROUTING_KEY)
             .columns(List.of() /* TABLE_2_COLUMNS */)
-            .constraints(null /* TABLE_2_CONSTRAINTS */)
+            .constraints(TABLE_2_CONSTRAINTS)
             .createdBy(USER_2_ID)
             .ownedBy(USER_2_ID)
             .owner(USER_2)
@@ -1459,6 +1471,12 @@ public abstract class BaseTest {
     public final static Instant TABLE_3_CREATED = Instant.ofEpochSecond(1677400031L) /* 2023-02-26 08:27:11 (UTC) */;
     public final static Instant TABLE_3_LAST_MODIFIED = Instant.ofEpochSecond(1677400031L) /* 2023-02-26 08:27:11 (UTC) */;
 
+    public final static Constraints TABLE_3_CONSTRAINTS = Constraints.builder()
+            .uniques(new LinkedList<>())
+            .foreignKeys(new LinkedList<>())
+            .checks(new LinkedHashSet<>())
+            .build();
+
     public final static Table TABLE_3 = Table.builder()
             .id(TABLE_3_ID)
             .tdbid(DATABASE_1_ID)
@@ -1473,7 +1491,7 @@ public abstract class BaseTest {
             .queueName(TABLE_3_QUEUE_NAME)
             .routingKey(TABLE_3_ROUTING_KEY)
             .columns(List.of() /* TABLE_3_COLUMNS */)
-            .constraints(null /* TABLE_3_CONSTRAINTS */)
+            .constraints(TABLE_3_CONSTRAINTS)
             .createdBy(USER_3_ID)
             .ownedBy(USER_3_ID)
             .owner(USER_3)
@@ -1690,6 +1708,12 @@ public abstract class BaseTest {
     public final static Instant TABLE_4_CREATED = Instant.ofEpochSecond(1677400175L) /* 2023-02-26 08:29:35 (UTC) */;
     public final static Instant TABLE_4_LAST_MODIFIED = Instant.ofEpochSecond(1677400175L) /* 2023-02-26 08:29:35 (UTC) */;
 
+    public final static Constraints TABLE_4_CONSTRAINTS = Constraints.builder()
+            .uniques(List.of())
+            .foreignKeys(List.of())
+            .checks(Set.of())
+            .build();
+
     public final static Table TABLE_4 = Table.builder()
             .id(TABLE_4_ID)
             .tdbid(DATABASE_1_ID)
@@ -1706,6 +1730,7 @@ public abstract class BaseTest {
             .ownedBy(USER_1_ID)
             .owner(USER_1)
             .created(TABLE_4_CREATED)
+            .constraints(TABLE_4_CONSTRAINTS)
             .lastModified(TABLE_4_LAST_MODIFIED)
             .build();
 
@@ -3099,7 +3124,7 @@ public abstract class BaseTest {
             .name(TABLE_1_FOREIGN_KEY_1_NAME)
             .referencedTable(TABLE_2)
             .table(TABLE_1)
-            .references(List.of()) /* TABLE_1_FOREIGN_KEY_REFERENCE */
+            .references(new LinkedList<>()) /* TABLE_1_FOREIGN_KEY_REFERENCE */
             .build();
 
     public final static Long TABLE_1_FOREIGN_KEY_REFERENCE_ID = 1L;
@@ -3111,25 +3136,18 @@ public abstract class BaseTest {
             .referencedColumn(TABLE_1_COLUMNS.get(0))
             .build();
 
-    public final static Constraints TABLE_1_CONSTRAINTS = Constraints.builder()
-            .foreignKeys(List.of(TABLE_1_FOREIGN_KEY_1))
-            .uniques(List.of(Unique.builder()
-                    .name("UK_1")
-                    .columns(List.of(
-                            TABLE_1_COLUMNS.get(0),
-                            TABLE_1_COLUMNS.get(1)
-                    ))
-                    .table(TABLE_1)
-                    .build()))
-            .checks(Set.of("`mintemp` > 0"))
+    public final static Unique TABLE_1_UNIQUE_CONSTRAINT_1 = Unique.builder()
+            .name("UK_1")
+            .columns(new LinkedList<>())
+            .table(TABLE_1)
             .build();
 
-    public final static Constraints TABLE_2_CONSTRAINTS = Constraints.builder()
-            .uniques(List.of(Unique.builder()
-                    .name("UK_1")
-                    .columns(List.of(TABLE_2_COLUMNS.get(0)))
-                    .table(TABLE_2)
-                    .build()))
+    public final static String TABLE_1_CHECK_1 = "`mintemp` > 0";
+
+    public final static Unique TABLE_2_UNIQUE_CONSTRAINT_1 = Unique.builder()
+            .name("UK_1")
+            .columns(List.of(TABLE_2_COLUMNS.get(0)))
+            .table(TABLE_2)
             .build();
 
     public final static List<TableColumn> TABLE_3_COLUMNS = List.of(TableColumn.builder()
@@ -4111,12 +4129,10 @@ public abstract class BaseTest {
                     .sets(List.of())
                     .build());
 
-    public final static Constraints TABLE_3_CONSTRAINTS = Constraints.builder()
-            .uniques(List.of(Unique.builder()
-                    .name("UK_1")
-                    .columns(List.of(TABLE_3_COLUMNS.get(0)))
-                    .table(TABLE_3)
-                    .build()))
+    public final static Unique TABLE_3_UNIQUE_CONSTRAINT_1 = Unique.builder()
+            .name("UK_1")
+            .columns(List.of(TABLE_3_COLUMNS.get(0)))
+            .table(TABLE_3)
             .build();
 
     public final static ConstraintsDto TABLE_3_CONSTRAINTS_DTO = ConstraintsDto.builder()
@@ -5308,7 +5324,7 @@ public abstract class BaseTest {
     public final static String VIEW_5_NAME = "Mock View";
     public final static String VIEW_5_INTERNAL_NAME = "mock_view";
     public final static Long VIEW_5_CONTAINER_ID = CONTAINER_2_ID;
-    public final static Long VIEW_5_DATABASE_ID = DATABASE_2_ID;
+    public final static Long VIEW_5_DATABASE_ID = DATABASE_3_ID;
     public final static Boolean VIEW_5_PUBLIC = true;
     public final static String VIEW_5_QUERY = "SELECT `location`, `lat`, `lng` FROM `weather_location` WHERE `location` = 'Albury'";
     public final static String VIEW_5_QUERY_HASH = "120f32478aaff874c25ab32eceb9f00b64cc9d422831046f2f5d43953aca01e7";
@@ -5326,6 +5342,26 @@ public abstract class BaseTest {
             .columns(null)
             .build();
 
+    public final static List<ViewColumn> VIEW_5_COLUMNS = List.of(
+            ViewColumn.builder()
+                    .id(29L)
+                    .ordinalPosition(0)
+                    .column(TABLE_2_COLUMNS.get(0))
+                    .view(VIEW_5)
+                    .build(),
+            ViewColumn.builder()
+                    .id(30L)
+                    .ordinalPosition(1)
+                    .column(TABLE_2_COLUMNS.get(1))
+                    .view(VIEW_5)
+                    .build(),
+            ViewColumn.builder()
+                    .id(31L)
+                    .ordinalPosition(2)
+                    .column(TABLE_2_COLUMNS.get(2))
+                    .view(VIEW_5)
+                    .build());
+
     public final static Long QUERY_1_RESULT_ID = 1L;
     public final static List<Map<String, Object>> QUERY_1_RESULT_RESULT = List.of(
             new HashMap<>() {{
diff --git a/dbrepo-ui/bun.lockb b/dbrepo-ui/bun.lockb
index 90e197bf8ac360877c05d20dec7b22b6a8c537ec..8493ca2eeeac087f85096ca4acb9a406944112bf 100755
GIT binary patch
delta 33
lcmdlnLu|(kv4$4L7N#xC`kUFA7{H+2Y%}wAv&}3_HvzSD3G4s>

delta 33
pcmdlnLu|(kv4$4L7N#xC`kUDq<4pC8^$gn0HZyNG+swjr69C7t3q1e;

diff --git a/dbrepo-ui/components/dialogs/TimeTravel.vue b/dbrepo-ui/components/dialogs/TimeTravel.vue
index 31be1db9e6..8637cd456e 100644
--- a/dbrepo-ui/components/dialogs/TimeTravel.vue
+++ b/dbrepo-ui/components/dialogs/TimeTravel.vue
@@ -20,6 +20,12 @@
           :suffix="$t('pages.table.subpages.versioning.timestamp.suffix')"
           class="mb-4"
           type="text" />
+        <Bar
+          id="time-travel"
+          :data="chartData"
+          :options="chartOptions"
+          :height="200"
+          :width="400" />
       </v-card-text>
       <v-card-actions>
         <v-spacer />
@@ -44,16 +50,47 @@
 </template>
 
 <script>
+import { Bar } from 'vue-chartjs'
+import { format } from 'date-fns'
+import { useCacheStore } from '@/stores/cache'
+import { Chart as ChartJS, Title, Tooltip, BarElement, CategoryScale, LinearScale, LogarithmicScale } from 'chart.js'
+
+ChartJS.register(Title, Tooltip, BarElement, CategoryScale, LinearScale, LogarithmicScale)
+
 export default {
+  components: {
+    Bar
+  },
   data () {
     return {
       formValid: false,
       loading: false,
       datetime: null,
-      totalChanges: 0
+      history: null,
+      chartOptions: {
+        responsive: true,
+        onClick: this.handle,
+        animations: null,
+        plugins: {
+          title: {
+            display: true,
+            text: this.$t('pages.table.subpages.versioning.chart.title')
+          }
+        },
+        scales: {
+          y: {
+            display: true,
+            type: 'logarithmic'
+          }
+        }
+      },
+      cacheStore: useCacheStore()
     }
   },
   computed: {
+    table () {
+      return this.cacheStore.getTable
+    },
     inputVariant () {
       const runtimeConfig = useRuntimeConfig()
       return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.input.contrast : runtimeConfig.public.variant.input.normal
@@ -61,8 +98,19 @@ export default {
     buttonVariant () {
       const runtimeConfig = useRuntimeConfig()
       return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal
+    },
+    chartData () {
+      return {
+        labels: this.history ? this.history.map(d => format(new Date(d.timestamp), 'yyyy-MM-dd HH:mm:ss')) : [],
+        datasets: [
+          this.history ? { backgroundColor: this.$vuetify.theme.current.colors.primary, data: this.history.map(d => d.total) } : { data: [] }
+        ]
+      }
     }
   },
+  mounted() {
+    this.loadHistory()
+  },
   methods: {
     cancel () {
       this.$emit('close', { success: false })
@@ -75,6 +123,32 @@ export default {
         success: true,
         timestamp: this.datetime
       })
+    },
+    handle (point, event) {
+      if (event.length !== 1 || event[0].index === undefined) {
+        return
+      }
+      const idx = event[0].index
+      this.datetime = this.chartData.labels[idx]
+      console.debug('date time', this.datetime, 'idx', idx)
+    },
+    async loadHistory () {
+      try {
+        this.loading = true
+        const tableService = useTableService()
+        this.history = await tableService.history(this.table.tdbid, this.table.id)
+        // this.chartData.labels = history.map(d => format(new Date(d.timestamp), 'dd.MM.yyyy HH:mm:ss'))
+        // this.chartData.datasets = [{
+        //   // backgroundColor: 'red',
+        //   data: history.map(d => d.total)
+        // }]
+        this.totalChanges = history.length
+        console.debug('history', this.chartData)
+      } catch (err) {
+        this.error = true
+        console.error('failed to load table history', err)
+      }
+      this.loading = false
     }
   }
 }
diff --git a/dbrepo-ui/composables/table-service.ts b/dbrepo-ui/composables/table-service.ts
index ead0169f17..b351802401 100644
--- a/dbrepo-ui/composables/table-service.ts
+++ b/dbrepo-ui/composables/table-service.ts
@@ -169,6 +169,22 @@ export const useTableService = (): any => {
     });
   }
 
+  async function history(databaseId: number, tableId: number): Promise<TableHistoryDto[]> {
+    const axios = useAxiosInstance()
+    console.debug('Load history of table with id', tableId, 'in database with id', databaseId)
+    return new Promise<TableHistoryDto[]>((resolve, reject) => {
+      axios.get<TableHistoryDto[]>(`/api/database/${databaseId}/table/${tableId}/history`)
+        .then((response) => {
+          console.info('Loaded history of table with id', tableId, 'in database with id', databaseId)
+          resolve(response.data)
+        })
+        .catch((error) => {
+          console.error('Failed to load history', error)
+          reject(error)
+        })
+    });
+  }
+
   async function suggest(databaseId: number, tableId: number, columnId: number): Promise<TableColumnEntityDto[]> {
     const axios = useAxiosInstance()
     console.debug('suggest semantic entities for table column with id', columnId, 'of table with id', tableId, 'of database with id', databaseId)
@@ -224,6 +240,7 @@ export const useTableService = (): any => {
     create,
     remove,
     removeTuple,
+    history,
     suggest,
     isOwner,
     tableNameToInternalName
diff --git a/dbrepo-ui/dto/index.ts b/dbrepo-ui/dto/index.ts
index 008de9b2c2..366ef87a47 100644
--- a/dbrepo-ui/dto/index.ts
+++ b/dbrepo-ui/dto/index.ts
@@ -550,6 +550,12 @@ interface QueryResultDto {
   result_number: number | null;
 }
 
+interface TableHistoryDto {
+  timestamp: Date;
+  event: string;
+  total: number;
+}
+
 interface TableCreateDto {
   name: string;
   description: string;
diff --git a/dbrepo-ui/locales/de-AT.json b/dbrepo-ui/locales/de-AT.json
index 481043d49d..afe671d020 100644
--- a/dbrepo-ui/locales/de-AT.json
+++ b/dbrepo-ui/locales/de-AT.json
@@ -490,8 +490,11 @@
           }
         },
         "versioning": {
-          "title": "Versionierung",
+          "title": "Verlauf",
           "subtitle": "Wählen Sie einen Zeitstempel aus, um die Daten für diese bestimmte Tageszeit anzuzeigen.",
+          "chart": {
+            "title": "Datenereignisse"
+          },
           "timestamp": {
             "label": "Zeitstempel",
             "hint": "Erforderlich. ",
@@ -1195,13 +1198,13 @@
     },
     "table": {
       "data": {
-        "refresh": "Aktualisierung",
+        "refresh": "Aktualisieren",
         "add": "Hinzufügen",
         "edit": "Aktualisieren",
         "delete": "Löschen",
         "tuple": "Eintrag",
         "download": "Herunterladen",
-        "version": "Geschichte",
+        "version": "Verlauf",
         "subtitle": "Stellen Sie Daten bereit, die direkt in den Datensatz eingefügt werden sollen."
       }
     }
diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json
index 077c5d079e..08577403b1 100644
--- a/dbrepo-ui/locales/en-US.json
+++ b/dbrepo-ui/locales/en-US.json
@@ -490,8 +490,11 @@
           }
         },
         "versioning": {
-          "title": "Versioning",
+          "title": "History",
           "subtitle": "Select a timestamp to view the data for this specific time of day.",
+          "chart": {
+            "title": "Data Events"
+          },
           "timestamp": {
             "label": "Timestamp",
             "hint": "Required. Format yyyy-MM-dd HH:mm:ss",
-- 
GitLab