From 6f015bc11d67e6e0c699643f9a9c5cde2cfd1b3f Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Thu, 30 Sep 2021 13:20:12 +0200
Subject: [PATCH] made real integration test

---
 .../src/test/java/at/tuwien/BaseUnitTest.java | 85 ++++++++++++++++-
 .../service/FileServiceIntegrationTest.java   | 91 ++++---------------
 2 files changed, 101 insertions(+), 75 deletions(-)

diff --git a/fda-citation-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/fda-citation-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java
index 7f91cf3301..d66e5ba37e 100644
--- a/fda-citation-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java
+++ b/fda-citation-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java
@@ -3,6 +3,10 @@ package at.tuwien;
 import at.tuwien.api.zenodo.deposit.*;
 import at.tuwien.api.zenodo.files.FileResponseDto;
 import at.tuwien.api.zenodo.files.FileLinksDto;
+import at.tuwien.entities.container.Container;
+import at.tuwien.entities.container.image.ContainerImage;
+import at.tuwien.entities.container.image.ContainerImageEnvironmentItem;
+import at.tuwien.entities.container.image.ContainerImageEnvironmentItemType;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.table.Table;
 import org.apache.commons.lang.RandomStringUtils;
@@ -12,12 +16,21 @@ import java.time.Instant;
 import java.time.temporal.ChronoUnit;
 import java.util.List;
 
+import static java.time.temporal.ChronoUnit.HOURS;
+
 @TestPropertySource(locations = "classpath:application.properties")
 public abstract class BaseUnitTest {
 
     public final static Long DATABASE_1_ID = 1L;
+    public final static String DATABASE_1_NAME = "Test Database";
+    public final static String DATABASE_1_INTERNAL_NAME = "test_dataase";
+    public final static String DATABASE_1_EXCHANGE = "fda." + DATABASE_1_INTERNAL_NAME;
+    public final static Boolean DATABASE_1_PUBLIC = true;
 
     public final static Long TABLE_1_ID = 1L;
+    public final static String TABLE_1_NAME = "Rainfall";
+    public final static String TABLE_1_INTERNAL_NAME = "rainfall";
+    public final static String TABLE_1_TOPIC = DATABASE_1_EXCHANGE + "." + TABLE_1_INTERNAL_NAME;
 
     public final static Long DEPOSIT_1_ID = 1L;
     public final static String DEPOSIT_1_TITLE = "Super cool document";
@@ -68,14 +81,78 @@ public abstract class BaseUnitTest {
     public final static String DEPOSIT_1_DOI = "10.5072/zenodo.542201";
     public final static Long DEPOSIT_1_REC_ID = 542201L;
 
-    public final static Table TABLE_1 = Table.builder()
-            .id(TABLE_1_ID)
-            .depositId(DEPOSIT_1_ID)
+    public final static Long IMAGE_1_ID = 1L;
+    public final static String IMAGE_1_REPOSITORY = "postgres";
+    public final static String IMAGE_1_TAG = "13-alpine";
+    public final static String IMAGE_1_HASH = "83b40f2726e5";
+    public final static Integer IMAGE_1_PORT = 5432;
+    public final static String IMAGE_1_DIALECT = "org.hibernate.dialect.PostgreSQLDialect";
+    public final static String IMAGE_1_DRIVER = "org.postgresql.Driver";
+    public final static String IMAGE_1_JDBC = "postgresql";
+    public final static Long IMAGE_1_SIZE = 12000L;
+    public final static String IMAGE_1_LOGO = "AAAA";
+    public final static Instant IMAGE_1_BUILT = Instant.now().minus(40, HOURS);
+    public final static List<ContainerImageEnvironmentItem> IMAGE_1_ENV = List.of(ContainerImageEnvironmentItem.builder()
+                    .key("POSTGRES_USER")
+                    .value("postgres")
+                    .type(ContainerImageEnvironmentItemType.USERNAME)
+                    .build(),
+            ContainerImageEnvironmentItem.builder()
+                    .key("POSTGRES_PASSWORD")
+                    .value("postgres")
+                    .type(ContainerImageEnvironmentItemType.PASSWORD)
+                    .build());
+
+    public final static ContainerImage IMAGE_1 = ContainerImage.builder()
+            .id(IMAGE_1_ID)
+            .repository(IMAGE_1_REPOSITORY)
+            .tag(IMAGE_1_TAG)
+            .hash(IMAGE_1_HASH)
+            .jdbcMethod(IMAGE_1_JDBC)
+            .dialect(IMAGE_1_DIALECT)
+            .driverClass(IMAGE_1_DRIVER)
+            .containers(List.of())
+            .compiled(IMAGE_1_BUILT)
+            .size(IMAGE_1_SIZE)
+            .environment(IMAGE_1_ENV)
+            .defaultPort(IMAGE_1_PORT)
+            .logo(IMAGE_1_LOGO)
+            .build();
+
+    public final static Long CONTAINER_1_ID = 1L;
+    public final static String CONTAINER_1_HASH = "deadbeef";
+    public final static ContainerImage CONTAINER_1_IMAGE = IMAGE_1;
+    public final static String CONTAINER_1_NAME = "fda-userdb-u01";
+    public final static String CONTAINER_1_INTERNALNAME = "fda-userdb-u01";
+    public final static String CONTAINER_1_DATABASE = "univie";
+    public final static String CONTAINER_1_IP = "172.28.0.5";
+    public final static Instant CONTAINER_1_CREATED = Instant.now().minus(1, HOURS);
+
+    public final static Container CONTAINER_1 = Container.builder()
+            .id(CONTAINER_1_ID)
+            .name(CONTAINER_1_NAME)
+            .internalName(CONTAINER_1_INTERNALNAME)
+            .image(CONTAINER_1_IMAGE)
+            .hash(CONTAINER_1_HASH)
+            .containerCreated(CONTAINER_1_CREATED)
             .build();
 
     public final static Database DATABASE_1 = Database.builder()
             .id(DATABASE_1_ID)
-            .tables(List.of(TABLE_1))
+            .name(DATABASE_1_NAME)
+            .isPublic(DATABASE_1_PUBLIC)
+            .internalName(DATABASE_1_INTERNAL_NAME)
+            .exchange(DATABASE_1_EXCHANGE)
+            .tables(List.of())
+            .build();
+
+    public final static Table TABLE_1 = Table.builder()
+            .id(TABLE_1_ID)
+            .name(TABLE_1_NAME)
+            .internalName(TABLE_1_INTERNAL_NAME)
+            .topic(TABLE_1_TOPIC)
+            .tdbid(DATABASE_1_ID)
+            .depositId(DEPOSIT_1_ID)
             .build();
 
     public final static CreatorDto CREATOR_1 = CreatorDto.builder()
diff --git a/fda-citation-service/rest-service/src/test/java/at/tuwien/service/FileServiceIntegrationTest.java b/fda-citation-service/rest-service/src/test/java/at/tuwien/service/FileServiceIntegrationTest.java
index cc2c31f35f..59ff998a97 100644
--- a/fda-citation-service/rest-service/src/test/java/at/tuwien/service/FileServiceIntegrationTest.java
+++ b/fda-citation-service/rest-service/src/test/java/at/tuwien/service/FileServiceIntegrationTest.java
@@ -5,11 +5,13 @@ import at.tuwien.api.zenodo.deposit.DepositChangeResponseDto;
 import at.tuwien.api.zenodo.files.FileResponseDto;
 import at.tuwien.api.zenodo.files.FileUploadDto;
 import at.tuwien.config.ReadyConfig;
-import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.table.Table;
 import at.tuwien.exception.*;
+import at.tuwien.repository.jpa.ContainerRepository;
+import at.tuwien.repository.jpa.DatabaseRepository;
 import at.tuwien.repository.jpa.TableRepository;
 import org.apache.commons.io.FileUtils;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -17,36 +19,46 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.springframework.util.ResourceUtils;
 
-import java.io.FileNotFoundException;
+import javax.transaction.Transactional;
 import java.io.IOException;
 import java.util.List;
-import java.util.Optional;
 
 import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.when;
 
 @SpringBootTest
 @ExtendWith(SpringExtension.class)
+@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
 public class FileServiceIntegrationTest extends BaseUnitTest {
 
     @MockBean
     private ReadyConfig readyConfig;
 
-    @MockBean
+    @Autowired
     private TableRepository tableRepository;
 
+    @Autowired
+    private ContainerRepository containerRepository;
+
+    @Autowired
+    private DatabaseRepository databaseRepository;
+
     @Autowired
     private ZenodoFileService fileService;
 
     @Autowired
     private ZenodoMetadataService metadataService;
 
-    final Database DATABASE_1 = Database.builder()
-            .id(DATABASE_1_ID)
-            .build();
+    @BeforeEach
+    @Transactional
+    public void beforeEach() {
+        containerRepository.save(CONTAINER_1);
+        databaseRepository.save(DATABASE_1);
+        tableRepository.save(TABLE_1);
+    }
 
     @Test
     public void createResource_succeeds() throws IOException, ZenodoApiException, ZenodoNotFoundException,
@@ -55,22 +67,12 @@ public class FileServiceIntegrationTest extends BaseUnitTest {
         final MockMultipartFile file = new MockMultipartFile("testdata.csv", FileUtils.readFileToByteArray(
                 ResourceUtils.getFile("classpath:csv/testdata.csv")));
 
-        /* mock */
-        when(tableRepository.findByDatabaseAndId(DATABASE_1, TABLE_1_ID))
-                .thenReturn(Optional.of(TABLE_1));
-
         /* request */
         final DepositChangeResponseDto deposit = metadataService.storeCitation(DATABASE_1_ID, TABLE_1_ID);
         final FileUploadDto request = FileUploadDto.builder()
                 .name(FILE_1_NAME)
                 .build();
 
-        /* mock */
-        final Table TABLE_1 = Table.builder()
-                .id(TABLE_1_ID)
-                .depositId(deposit.getId())
-                .build();
-
         /* test */
         final FileResponseDto response = fileService.createResource(DATABASE_1_ID, TABLE_1_ID, request, file);
         assertEquals(FILE_1_NAME, response.getFilename());
@@ -86,22 +88,12 @@ public class FileServiceIntegrationTest extends BaseUnitTest {
         final MockMultipartFile file = new MockMultipartFile("weatherAUS.csv", FileUtils.readFileToByteArray(
                 ResourceUtils.getFile("classpath:csv/weatherAUS.csv")));
 
-        /* mock */
-        when(tableRepository.findByDatabaseAndId(DATABASE_1, TABLE_1_ID))
-                .thenReturn(Optional.of(TABLE_1));
-
         /* request */
         final DepositChangeResponseDto deposit = metadataService.storeCitation(DATABASE_1_ID, TABLE_1_ID);
         final FileUploadDto request = FileUploadDto.builder()
                 .name(FILE_2_NAME)
                 .build();
 
-        /* mock */
-        final Table TABLE_1 = Table.builder()
-                .id(TABLE_1_ID)
-                .depositId(deposit.getId())
-                .build();
-
         /* test */
         final FileResponseDto response = fileService.createResource(DATABASE_1_ID, TABLE_1_ID, request, file);
         assertEquals(FILE_2_NAME, response.getFilename());
@@ -111,13 +103,6 @@ public class FileServiceIntegrationTest extends BaseUnitTest {
 
     @Test
     public void listAll_notFound_fails() {
-        final Table TABLE_1 = Table.builder()
-                .id(-1L)
-                .build();
-
-        /* mock */
-        when(tableRepository.findByDatabaseAndId(DATABASE_1, TABLE_1_ID))
-                .thenReturn(Optional.of(TABLE_1));
 
         /* test */
         assertThrows(ZenodoNotFoundException.class, () -> {
@@ -132,25 +117,13 @@ public class FileServiceIntegrationTest extends BaseUnitTest {
         final MockMultipartFile file = new MockMultipartFile("testdata.csv", FileUtils.readFileToByteArray(
                 ResourceUtils.getFile("classpath:csv/testdata.csv")));
 
-        /* mock */
-        when(tableRepository.findByDatabaseAndId(DATABASE_1, TABLE_1_ID))
-                .thenReturn(Optional.of(TABLE_1));
-
         /* request */
         final DepositChangeResponseDto deposit = metadataService.storeCitation(DATABASE_1_ID, TABLE_1_ID);
         final FileUploadDto upload = FileUploadDto.builder()
                 .name(FILE_1_NAME)
                 .build();
-        final Table TABLE_1 = Table.builder()
-                .id(TABLE_1_ID)
-                .depositId(deposit.getId())
-                .build();
         final FileResponseDto fileResponse = fileService.createResource(DATABASE_1_ID, TABLE_1_ID, upload, file);
 
-        /* mock */
-        when(tableRepository.findById(TABLE_1_ID))
-                .thenReturn(Optional.of(TABLE_1));
-
         /* test */
         final List<FileResponseDto> listResponse = fileService.listResources(DATABASE_1_ID, TABLE_1_ID);
         assertEquals(1, listResponse.size());
@@ -165,25 +138,13 @@ public class FileServiceIntegrationTest extends BaseUnitTest {
         final MockMultipartFile file = new MockMultipartFile("testdata.csv", FileUtils.readFileToByteArray(
                 ResourceUtils.getFile("classpath:csv/testdata.csv")));
 
-        /* mock */
-        when(tableRepository.findByDatabaseAndId(DATABASE_1, TABLE_1_ID))
-                .thenReturn(Optional.of(TABLE_1));
-
         /* request */
         final DepositChangeResponseDto deposit = metadataService.storeCitation(DATABASE_1_ID, TABLE_1_ID);
         final FileUploadDto upload = FileUploadDto.builder()
                 .name(FILE_1_NAME)
                 .build();
-        final Table TABLE_1 = Table.builder()
-                .id(TABLE_1_ID)
-                .depositId(deposit.getId())
-                .build();
         final FileResponseDto fileResponse = fileService.createResource(DATABASE_1_ID, TABLE_1_ID, upload, file);
 
-        /* mock */
-        when(tableRepository.findById(TABLE_1_ID))
-                .thenReturn(Optional.of(TABLE_1));
-
         /* test */
         final FileResponseDto findResponse = fileService.findResource(DATABASE_1_ID, TABLE_1_ID, fileResponse.getId());
         assertEquals(FILE_1_CHECKSUM, findResponse.getChecksum());
@@ -197,25 +158,13 @@ public class FileServiceIntegrationTest extends BaseUnitTest {
         final MockMultipartFile file = new MockMultipartFile("testdata.csv", FileUtils.readFileToByteArray(
                 ResourceUtils.getFile("classpath:csv/testdata.csv")));
 
-        /* mock */
-        when(tableRepository.findByDatabaseAndId(DATABASE_1, TABLE_1_ID))
-                .thenReturn(Optional.of(TABLE_1));
-
         /* request */
         final DepositChangeResponseDto deposit = metadataService.storeCitation(DATABASE_1_ID, TABLE_1_ID);
         final FileUploadDto upload = FileUploadDto.builder()
                 .name(FILE_1_NAME)
                 .build();
-        final Table TABLE_1 = Table.builder()
-                .id(TABLE_1_ID)
-                .depositId(deposit.getId())
-                .build();
         final FileResponseDto fileResponse = fileService.createResource(DATABASE_1_ID, TABLE_1_ID, upload, file);
 
-        /* mock */
-        when(tableRepository.findById(TABLE_1_ID))
-                .thenReturn(Optional.of(TABLE_1));
-
         /* test */
         fileService.deleteResource(DATABASE_1_ID, TABLE_1_ID, fileResponse.getId());
     }
-- 
GitLab