diff --git a/fda-table-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/fda-table-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java index c35080dd1415ea2734b465fe3b5d74ebcdb1c219..f47834258148d59a204c916aba96681a15a398c3 100644 --- a/fda-table-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java +++ b/fda-table-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java @@ -2,6 +2,7 @@ package at.tuwien; import at.tuwien.api.database.query.QueryBriefDto; import at.tuwien.api.database.query.QueryDto; +import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.user.UserDto; import at.tuwien.entities.container.image.*; import at.tuwien.entities.database.table.columns.concepts.Concept; @@ -735,6 +736,7 @@ public abstract class BaseUnitTest { .id(CONTAINER_1_ID) .name(CONTAINER_1_NAME) .internalName(CONTAINER_1_INTERNALNAME) + .imageId(IMAGE_1_ID) .image(CONTAINER_1_IMAGE) .hash(CONTAINER_1_HASH) .created(CONTAINER_1_CREATED) @@ -745,6 +747,7 @@ public abstract class BaseUnitTest { .id(CONTAINER_2_ID) .name(CONTAINER_2_NAME) .internalName(CONTAINER_2_INTERNALNAME) + .imageId(IMAGE_1_ID) .image(CONTAINER_2_IMAGE) .hash(CONTAINER_2_HASH) .created(CONTAINER_2_CREATED) @@ -755,6 +758,7 @@ public abstract class BaseUnitTest { .id(CONTAINER_3_ID) .name(CONTAINER_3_NAME) .internalName(CONTAINER_3_INTERNALNAME) + .imageId(IMAGE_1_ID) .image(CONTAINER_3_IMAGE) .hash(CONTAINER_3_HASH) .created(CONTAINER_3_CREATED) @@ -1842,7 +1846,7 @@ public abstract class BaseUnitTest { .description(TABLE_2_DESCRIPTION) .name(TABLE_2_NAME) .lastModified(TABLE_2_LAST_MODIFIED) - .tdbid(DATABASE_2_ID) + .tdbid(DATABASE_1_ID) .topic(TABLE_2_TOPIC) .build(); @@ -1857,6 +1861,12 @@ public abstract class BaseUnitTest { .topic(TABLE_3_TOPIC) .build(); + public final static TableCreateDto TABLE_3_CREATE_DTO = TableCreateDto.builder() + .name(TABLE_5_NAME) + .description(TABLE_5_DESCRIPTION) + .columns(List.of()) + .build(); + public final static Table TABLE_4 = Table.builder() .id(TABLE_4_ID) .created(Instant.now()) diff --git a/fda-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/fda-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java index 7157c6f436fdddec5bde0ff22354034ff5c72bfd..572d9155c31fee23d34f4430dea2b6551f8dc217 100644 --- a/fda-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java +++ b/fda-table-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java @@ -4,10 +4,11 @@ import at.tuwien.BaseUnitTest; import at.tuwien.config.DockerConfig; import at.tuwien.config.IndexInitializer; import at.tuwien.config.ReadyConfig; -import at.tuwien.entities.container.Container; -import at.tuwien.entities.database.Database; import at.tuwien.entities.database.table.Table; +import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.exception.*; +import at.tuwien.repository.elastic.TableColumnidxRepository; +import at.tuwien.repository.elastic.TableidxRepository; import at.tuwien.repository.jpa.*; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.exception.NotModifiedException; @@ -24,16 +25,19 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; -import javax.transaction.Transactional; import java.io.File; import java.security.Principal; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import static at.tuwien.config.DockerConfig.dockerClient; import static at.tuwien.config.DockerConfig.hostConfig; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; @Log4j2 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @@ -50,6 +54,12 @@ public class TableServiceIntegrationTest extends BaseUnitTest { @MockBean private IndexInitializer indexInitializer; + @MockBean + private TableidxRepository tableidxRepository; + + @MockBean + private TableColumnidxRepository tableColumnidxRepository; + @Autowired private ImageRepository imageRepository; @@ -134,12 +144,12 @@ public class TableServiceIntegrationTest extends BaseUnitTest { @BeforeEach public void beforeEach() { - CONTAINER_1.setDatabase(DATABASE_1); - CONTAINER_2.setDatabase(DATABASE_2); - TABLE_1.setDatabase(DATABASE_1); - TABLE_2.setDatabase(DATABASE_2); - tableRepository.save(TABLE_1) /* public */; - tableRepository.save(TABLE_2) /* private */; + imageRepository.save(IMAGE_1); + containerRepository.save(CONTAINER_1); + containerRepository.save(CONTAINER_2); + databaseRepository.save(DATABASE_1) /* will have 2 tables */; + tableRepository.save(TABLE_1); + tableRepository.save(TABLE_2); } @Test @@ -148,16 +158,89 @@ public class TableServiceIntegrationTest extends BaseUnitTest { /* test */ final List<Table> response = tableService.findAll(CONTAINER_1_ID, DATABASE_1_ID, principal); - assertEquals(1, response.size()); + assertEquals(2, response.size()); + } + + @Test + public void findAll_fails() { + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + tableService.findAll(CONTAINER_2_ID, DATABASE_2_ID, principal); + }); + } + + @Test + public void findById_succeeds() throws TableNotFoundException, DatabaseNotFoundException, + ContainerNotFoundException { + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* test */ + final Table response = tableService.findById(CONTAINER_1_ID, DATABASE_1_ID, TABLE_1_ID, principal); + assertEquals(TABLE_1_ID, response.getId()); + assertEquals(TABLE_1_NAME, response.getName()); + assertEquals(TABLE_1_INTERNALNAME, response.getInternalName()); + } + + @Test + public void findById_tableNotFound_fails() { + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* test */ + assertThrows(TableNotFoundException.class, () -> { + tableService.findById(CONTAINER_1_ID, DATABASE_1_ID, TABLE_3_ID, principal); + }); } @Test - public void findAll_fails() throws DatabaseNotFoundException { - final Principal principal = new BasicUserPrincipal(USER_2_USERNAME) /* not owner */; + public void findById_databaseNotFound_fails() { + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + tableService.findById(CONTAINER_2_ID, DATABASE_3_ID, TABLE_3_ID, principal); + }); + } + + @Test + public void findById_containerNotFound_fails() { + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* test */ + assertThrows(ContainerNotFoundException.class, () -> { + tableService.findById(CONTAINER_3_ID, DATABASE_3_ID, TABLE_3_ID, principal); + }); + } + + @Test + public void create_succeeds() throws UserNotFoundException, TableMalformedException, QueryMalformedException, + DatabaseNotFoundException, ImageNotSupportedException, TableNameExistsException, + ContainerNotFoundException { + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* mock */ + when(tableidxRepository.save(any(Table.class))) + .thenReturn(TABLE_1); + when(tableColumnidxRepository.saveAll(anyList())) + .thenReturn(List.of()); + + /* test */ + tableService.createTable(CONTAINER_1_ID, DATABASE_1_ID, TABLE_3_CREATE_DTO, principal); + } + + @Test + public void delete_succeeds() throws TableMalformedException, QueryMalformedException, DatabaseNotFoundException, + ImageNotSupportedException, ContainerNotFoundException, TableNotFoundException, DataProcessingException { + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* mock */ + doNothing() + .when(tableidxRepository) + .delete(any(Table.class)); /* test */ - final List<Table> response = tableService.findAll(CONTAINER_2_ID, DATABASE_2_ID, principal); - assertEquals(0, response.size()); + tableService.deleteTable(CONTAINER_1_ID, DATABASE_1_ID, TABLE_1_ID, principal); } } diff --git a/fda-table-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/fda-table-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java index fc90c614e1f1caa9409d2d4ba4319713da0cd8dd..8a2e0f2b0182a1b9cbdbdcc023c24980ed303ce6 100644 --- a/fda-table-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java +++ b/fda-table-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java @@ -33,7 +33,7 @@ public class DatabaseServiceImpl implements DatabaseService { database = databaseRepository.findPublicOrMine(containerId, databaseId, principal.getName()); } if (database.isEmpty()) { - log.error("Failed to find database"); + log.error("Failed to find database with id {}", databaseId); throw new DatabaseNotFoundException("could not find database with this id"); } return database.get(); diff --git a/fda-table-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/fda-table-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java index 95a4af8104e4d0559acaa719ac32ac23ec2a72eb..a5e4cfad20a5c573e2fed9873233c25710cef178 100644 --- a/fda-table-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java +++ b/fda-table-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java @@ -2,6 +2,7 @@ package at.tuwien.service.impl; import at.tuwien.CreateTableRawQuery; import at.tuwien.api.database.table.TableCreateDto; +import at.tuwien.entities.container.Container; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.table.Table; import at.tuwien.entities.user.User; @@ -10,6 +11,7 @@ import at.tuwien.mapper.TableMapper; import at.tuwien.repository.elastic.TableColumnidxRepository; import at.tuwien.repository.elastic.TableidxRepository; import at.tuwien.repository.jpa.TableRepository; +import at.tuwien.service.ContainerService; import at.tuwien.service.DatabaseService; import at.tuwien.service.TableService; import at.tuwien.service.UserService; @@ -34,17 +36,19 @@ public class TableServiceImpl extends HibernateConnector implements TableService private final UserService userService; private final TableRepository tableRepository; private final DatabaseService databaseService; + private final ContainerService containerService; private final TableidxRepository tableidxRepository; private final TableColumnidxRepository tableColumnidxRepository; @Autowired public TableServiceImpl(TableMapper tableMapper, UserService userService, TableRepository tableRepository, - DatabaseService databaseService, TableidxRepository tableidxRepository, - TableColumnidxRepository tableColumnidxRepository) { + DatabaseService databaseService, ContainerService containerService, + TableidxRepository tableidxRepository, TableColumnidxRepository tableColumnidxRepository) { this.tableMapper = tableMapper; this.userService = userService; this.tableRepository = tableRepository; this.databaseService = databaseService; + this.containerService = containerService; this.tableidxRepository = tableidxRepository; this.tableColumnidxRepository = tableColumnidxRepository; } @@ -61,7 +65,7 @@ public class TableServiceImpl extends HibernateConnector implements TableService @Transactional public void deleteTable(Long containerId, Long databaseId, Long tableId, Principal principal) throws TableNotFoundException, DatabaseNotFoundException, ImageNotSupportedException, - TableMalformedException, QueryMalformedException { + TableMalformedException, QueryMalformedException, ContainerNotFoundException { /* find */ final Database database = databaseService.findPublicOrMineById(containerId, databaseId, principal); final Table table = findById(containerId, databaseId, tableId, principal); @@ -90,7 +94,8 @@ public class TableServiceImpl extends HibernateConnector implements TableService @Override @Transactional(readOnly = true) public Table findById(Long containerId, Long databaseId, Long tableId, Principal principal) - throws TableNotFoundException, DatabaseNotFoundException { + throws TableNotFoundException, DatabaseNotFoundException, ContainerNotFoundException { + final Container container = containerService.find(containerId); final Database database = databaseService.findPublicOrMineById(containerId, databaseId, principal); final Optional<Table> optional = tableRepository.findByDatabaseAndId(database, tableId); if (optional.isEmpty()) {