diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6d11f4dbdc131d3d9b971fc2ed83f12325c8eeaa --- /dev/null +++ b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java @@ -0,0 +1,134 @@ +package at.tuwien.service; + +import at.tuwien.BaseUnitTest; +import at.tuwien.api.container.image.ImageCreateDto; +import at.tuwien.config.ReadyConfig; +import at.tuwien.exception.*; +import at.tuwien.repository.jpa.ContainerRepository; +import at.tuwien.repository.jpa.ImageRepository; +import at.tuwien.service.impl.ImageServiceImpl; +import lombok.extern.log4j.Log4j2; +import org.apache.http.auth.BasicUserPrincipal; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +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.test.annotation.DirtiesContext; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.transaction.annotation.Transactional; + +import java.security.Principal; + +import static org.junit.jupiter.api.Assertions.*; + +@Log4j2 +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class ImageServiceIntegrationTest extends BaseUnitTest { + + @MockBean + private ReadyConfig readyConfig; + + @Autowired + private ImageServiceImpl imageService; + + @Autowired + private ImageRepository imageRepository; + + @Autowired + private ContainerRepository containerRepository; + + @Transactional + @BeforeEach + public void beforeEach() { + log.debug("save container {}", CONTAINER_1); + containerRepository.save(CONTAINER_1); + } + + @Test + public void create_succeeds() + throws ImageAlreadyExistsException, DockerClientException, ImageNotFoundException, UserNotFoundException { + final ImageCreateDto request = ImageCreateDto.builder() + .repository(IMAGE_2_REPOSITORY) + .tag(IMAGE_2_TAG) + .dialect(IMAGE_2_DIALECT) + .driverClass(IMAGE_2_DRIVER) + .jdbcMethod(IMAGE_2_JDBC) + .defaultPort(IMAGE_2_PORT) + .environment(IMAGE_1_ENV_DTO) + .build(); + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* test */ + imageService.create(request, principal); + } + + @Test + public void inspect_notFound_fails() { + + /* test */ + assertThrows(ImageNotFoundException.class, () -> { + imageService.inspect("abcdefu", "999.999"); + }); + } + + @Test + public void create_notFound_fails() { + final ImageCreateDto request = ImageCreateDto.builder() + .repository("s0m3th1ng_n0t3x1st1ng") + .tag("d3v_h3ll") + .dialect(IMAGE_1_DIALECT) + .driverClass(IMAGE_1_DRIVER) + .jdbcMethod(IMAGE_1_JDBC) + .defaultPort(IMAGE_1_PORT) + .environment(IMAGE_1_ENV_DTO) + .build(); + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* test */ + assertThrows(ImageNotFoundException.class, () -> { + imageService.create(request, principal); + }); + } + + @Test + public void create_duplicate_fails() { + final ImageCreateDto request = ImageCreateDto.builder() + .repository(IMAGE_1_REPOSITORY) + .tag(IMAGE_1_TAG) + .defaultPort(IMAGE_1_PORT) + .driverClass(IMAGE_1_DRIVER) + .jdbcMethod(IMAGE_1_JDBC) + .dialect(IMAGE_1_DIALECT) + .environment(IMAGE_1_ENV_DTO) + .build(); + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* test */ + assertThrows(ImageAlreadyExistsException.class, () -> { + imageService.create(request, principal); + }); + } + + @Test + public void delete_hasContainer_succeeds() throws ImageNotFoundException, PersistenceException { + + /* test */ + imageService.delete(IMAGE_1_ID); + assertTrue(imageRepository.findById(IMAGE_1_ID).isEmpty()); + assertTrue(containerRepository.findById(CONTAINER_1_ID).isPresent()); /* container should NEVER be deletable in the metadata db */ + } + + @Test + public void delete_noContainer_succeeds() throws ImageNotFoundException, PersistenceException { + imageRepository.save(IMAGE_1); + + /* test */ + imageService.delete(IMAGE_1_ID); + assertTrue(imageRepository.findById(IMAGE_1_ID).isEmpty()); + } + +} diff --git a/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c1646f96efd2a463771e98eb1dfbfac4240fe3a9 --- /dev/null +++ b/fda-container-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java @@ -0,0 +1,183 @@ +package at.tuwien.service; + +import at.tuwien.BaseUnitTest; +import at.tuwien.api.container.image.ImageChangeDto; +import at.tuwien.api.container.image.ImageCreateDto; +import at.tuwien.config.ReadyConfig; +import at.tuwien.entities.container.image.ContainerImage; +import at.tuwien.exception.*; +import at.tuwien.repository.jpa.ImageRepository; +import at.tuwien.service.impl.ImageServiceImpl; +import org.apache.http.auth.BasicUserPrincipal; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +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.test.context.junit.jupiter.SpringExtension; + +import javax.persistence.EntityNotFoundException; +import javax.validation.ConstraintViolationException; +import java.security.Principal; +import java.util.List; +import java.util.Optional; + +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.Mockito.*; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class ImageServiceUnitTest extends BaseUnitTest { + + @MockBean + private ReadyConfig readyConfig; + + @Autowired + private ImageServiceImpl imageService; + + @MockBean + private ImageRepository imageRepository; + + @Test + public void getAll_succeeds() { + + /* mock */ + when(imageRepository.findAll()) + .thenReturn(List.of(IMAGE_1)); + + /* test */ + final List<ContainerImage> response = imageService.getAll(); + assertEquals(1, response.size()); + assertEquals(IMAGE_1_REPOSITORY, response.get(0).getRepository()); + assertEquals(IMAGE_1_TAG, response.get(0).getTag()); + } + + @Test + public void getById_succeeds() throws ImageNotFoundException { + + /* mock */ + when(imageRepository.findById(IMAGE_1_ID)) + .thenReturn(Optional.of(IMAGE_1)); + + /* test */ + final ContainerImage response = imageService.find(IMAGE_1_ID); + assertEquals(IMAGE_1_REPOSITORY, response.getRepository()); + assertEquals(IMAGE_1_TAG, response.getTag()); + } + + @Test + public void getById_notFound_fails() { + + /* mock */ + when(imageRepository.findById(IMAGE_1_ID)) + .thenReturn(Optional.empty()); + + /* test */ + assertThrows(ImageNotFoundException.class, () -> { + imageService.find(IMAGE_1_ID); + }); + } + + @Test + public void create_duplicate_fails() { + final ImageCreateDto request = ImageCreateDto.builder() + .repository(IMAGE_1_REPOSITORY) + .tag(IMAGE_1_TAG) + .defaultPort(IMAGE_1_PORT) + .environment(IMAGE_1_ENV_DTO) + .build(); + final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); + + /* mock */ + when(imageRepository.save(any(ContainerImage.class))) + .thenThrow(ConstraintViolationException.class); + + /* test */ + assertThrows(ImageAlreadyExistsException.class, () -> { + imageService.create(request, principal); + }); + } + + @Test + public void update_succeeds() throws ImageNotFoundException, DockerClientException { + final ImageChangeDto request = ImageChangeDto.builder() + .environment(IMAGE_1_ENV_DTO) + .defaultPort(IMAGE_1_PORT) + .build(); + + /* mock */ + when(imageRepository.findById(IMAGE_1_ID)) + .thenReturn(Optional.of(IMAGE_1)); + when(imageRepository.save(any())) + .thenReturn(IMAGE_1); + + /* test */ + final ContainerImage response = imageService.update(IMAGE_1_ID, request); + assertEquals(IMAGE_1_REPOSITORY, response.getRepository()); + assertEquals(IMAGE_1_TAG, response.getTag()); + } + + @Test + public void update_port_succeeds() throws ImageNotFoundException, DockerClientException { + final ImageChangeDto request = ImageChangeDto.builder() + .environment(IMAGE_1_ENV_DTO) + .defaultPort(9999) + .build(); + + /* mock */ + when(imageRepository.findById(IMAGE_1_ID)) + .thenReturn(Optional.of(IMAGE_1)); + when(imageRepository.save(any())) + .thenReturn(IMAGE_1); + + /* test */ + final ContainerImage response = imageService.update(IMAGE_1_ID, request); + assertEquals(IMAGE_1_REPOSITORY, response.getRepository()); + assertEquals(IMAGE_1_TAG, response.getTag()); + } + + @Test + public void update_notFound_fails() { + final ImageChangeDto request = ImageChangeDto.builder() + .environment(IMAGE_1_ENV_DTO) + .defaultPort(IMAGE_1_PORT) + .build(); + + /* mock */ + when(imageRepository.findById(IMAGE_1_ID)) + .thenReturn(Optional.empty()); + + /* test */ + assertThrows(ImageNotFoundException.class, () -> { + imageService.update(IMAGE_1_ID, request); + }); + } + + @Test + public void delete_succeeds() throws ImageNotFoundException, PersistenceException { + + /* mock */ + doNothing() + .when(imageRepository) + .deleteById(IMAGE_1_ID); + + /* test */ + imageService.delete(IMAGE_1_ID); + } + + @Test + public void delete_notFound_fails() { + + /* mock */ + doThrow(EntityNotFoundException.class) + .when(imageRepository) + .deleteById(IMAGE_1_ID); + + /* test */ + assertThrows(ImageNotFoundException.class, () -> { + imageService.delete(IMAGE_1_ID); + }); + } +}