Skip to content
Snippets Groups Projects
Commit 922b4a77 authored by Martin Weise's avatar Martin Weise
Browse files

added some endpoint tests

parent b2cede9b
No related branches found
No related tags found
No related merge requests found
Showing
with 150 additions and 130 deletions
package at.tuwien.api.dto.database;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class DatabaseContainerCreateDto {
@Builder
public class DatabaseContainerCreateRequestDto {
private String containerName;
......
......@@ -7,7 +7,7 @@ import lombok.Setter;
@Getter
@Setter
@Builder
public class CreateDatabaseResponseDto {
public class DatabaseContainerCreateResponseDto {
private String containerId;
......
......@@ -26,6 +26,7 @@
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<mapstruct.version>1.4.2.Final</mapstruct.version>
<docker.version>3.2.7</docker.version>
<testcontainers.version>1.15.2</testcontainers.version>
</properties>
<dependencies>
......@@ -65,24 +66,6 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<version>1.15.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mysql</artifactId>
<version>1.15.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mongodb</artifactId>
<version>1.15.2</version>
<scope>test</scope>
</dependency>
<!-- DTO -->
<dependency>
<groupId>io.springfox</groupId>
......@@ -158,4 +141,20 @@
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
......@@ -3,8 +3,8 @@ package at.tuwien.endpoints;
import at.tuwien.api.dto.container.ContainerActionTypeDto;
import at.tuwien.api.dto.container.DatabaseContainerBriefDto;
import at.tuwien.api.dto.container.DatabaseContainerDto;
import at.tuwien.api.dto.database.DatabaseContainerCreateDto;
import at.tuwien.api.dto.database.CreateDatabaseResponseDto;
import at.tuwien.api.dto.database.DatabaseContainerCreateResponseDto;
import at.tuwien.api.dto.database.DatabaseContainerCreateRequestDto;
import at.tuwien.entity.DatabaseContainer;
import at.tuwien.exception.ContainerNotFoundException;
import at.tuwien.exception.ImageNotFoundException;
......@@ -26,10 +26,13 @@ import java.util.stream.Collectors;
public class DatabaseContainerController {
private final ContainerService containerService;
private final DatabaseContainerMapper containerMapper;
private final DatabaseContainerMapper databaseContaineMapper;
@Autowired
public DatabaseContainerController(ContainerService containerService, DatabaseContainerMapper databaseContaineMapper) {
public DatabaseContainerController(ContainerService containerService, DatabaseContainerMapper containerMapper,
DatabaseContainerMapper databaseContaineMapper) {
this.containerMapper = containerMapper;
this.containerService = containerService;
this.databaseContaineMapper = databaseContaineMapper;
}
......@@ -46,21 +49,20 @@ public class DatabaseContainerController {
@PostMapping("/database")
@ApiOperation("Create a new database container")
public ResponseEntity<CreateDatabaseResponseDto> create(@RequestBody DatabaseContainerCreateDto data)
public ResponseEntity<DatabaseContainerCreateResponseDto> create(@RequestBody DatabaseContainerCreateRequestDto data)
throws ImageNotFoundException {
final DatabaseContainer container = containerService.create(data);
log.debug("Create new database {} in container {} with id {}", data.getDatabaseName(), data.getContainerName(), container.getContainerId());
return ResponseEntity.status(HttpStatus.CREATED)
.body(CreateDatabaseResponseDto.builder()
.containerId(container.getContainerId())
.build());
.body(containerMapper.databaseContainerToCreateDatabaseResponseDto(container));
}
@GetMapping("/database/{id}")
@ApiOperation("Get info of database container")
public DatabaseContainerDto findById(@RequestParam String id) throws ContainerNotFoundException {
return databaseContaineMapper.databaseContainerToDataBaseContainerDto(containerService.getById(id));
public ResponseEntity<DatabaseContainerDto> findById(@RequestParam String id) throws ContainerNotFoundException {
final DatabaseContainer container = containerService.getById(id);
return ResponseEntity.ok()
.body(databaseContaineMapper.databaseContainerToDataBaseContainerDto(container));
}
@PutMapping("/database/{id}")
......
......@@ -11,7 +11,6 @@ import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
import java.time.Instant;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import static java.time.temporal.ChronoUnit.DAYS;
......@@ -75,6 +74,7 @@ public abstract class BaseIntegrationTest {
public final DatabaseContainer CONTAINER_1 = DatabaseContainer.builder()
.containerId(CONTAINER_1_ID)
.databaseName(CONTAINER_1_DATABASE)
.name(CONTAINER_1_NAME)
.ipAddress(CONTAINER_1_IP)
.image(CONTAINER_1_IMAGE)
.containerId(CONTAINER_1_ID)
......@@ -84,26 +84,11 @@ public abstract class BaseIntegrationTest {
public final DatabaseContainer CONTAINER_2 = DatabaseContainer.builder()
.containerId(CONTAINER_2_ID)
.databaseName(CONTAINER_2_DATABASE)
.name(CONTAINER_2_NAME)
.ipAddress(CONTAINER_2_IP)
.image(CONTAINER_2_IMAGE)
.containerId(CONTAINER_2_ID)
.containerCreated(CONTAINER_2_CREATED)
.build();
public final InspectContainerResponse inspectContainerResponse(DatabaseContainer container, Boolean running) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
final InspectContainerResponse.ContainerState stateC = new InspectContainerResponse().new ContainerState();
final Object state = stateC.getClass().getConstructor().newInstance();
final Field runningField = stateC.getClass().getDeclaredField("running");
runningField.setAccessible(true);
runningField.setBoolean(state, running);
final InspectContainerResponse inspectC = new InspectContainerResponse();
final Object response = inspectC.getClass().getConstructor().newInstance();
final Field stateField = inspectC.getClass().getDeclaredField("state");
stateField.setAccessible(true);
stateField.set(response, state);
return (InspectContainerResponse) response;
}
}
package at.tuwien.endpoint;
import at.tuwien.BaseIntegrationTest;
import at.tuwien.api.dto.database.DatabaseContainerCreateRequestDto;
import at.tuwien.entity.DatabaseContainer;
import at.tuwien.exception.ImageNotFoundException;
import at.tuwien.repository.ContainerRepository;
import at.tuwien.repository.ImageRepository;
import at.tuwien.service.ContainerService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.Mockito.when;
@ExtendWith(SpringExtension.class)
@SpringBootTest
@ExtendWith(SpringExtension.class)
public class EndpointTest extends BaseIntegrationTest {
@MockBean
private ImageRepository imageRepository;
@MockBean
private ContainerRepository containerRepository;
@MockBean
private ContainerService containerService;
@Test
public void listAllDatabases_success() {
//
public void listAllDatabases_succeeds() {
when(containerService.getAll())
.thenReturn(List.of(CONTAINER_1, CONTAINER_2));
final List<DatabaseContainer> response = containerService.getAll();
assertEquals(2, response.size());
assertEquals(CONTAINER_1_ID, response.get(0).getContainerId());
assertEquals(CONTAINER_1_DATABASE, response.get(0).getDatabaseName());
assertEquals(CONTAINER_1_NAME, response.get(0).getName());
assertEquals(CONTAINER_1_IP, response.get(0).getIpAddress());
assertEquals(CONTAINER_2_ID, response.get(1).getContainerId());
assertEquals(CONTAINER_2_DATABASE, response.get(1).getDatabaseName());
assertEquals(CONTAINER_2_NAME, response.get(1).getName());
assertEquals(CONTAINER_2_IP, response.get(1).getIpAddress());
}
@Test
public void create_succeeds() throws ImageNotFoundException {
final DatabaseContainerCreateRequestDto request = DatabaseContainerCreateRequestDto.builder()
.containerName(CONTAINER_1_NAME)
.image(CONTAINER_1_IMAGE.dockerImageName())
.databaseName(CONTAINER_1_DATABASE)
.build();
when(containerService.create(request))
.thenReturn(CONTAINER_1);
final DatabaseContainer response = containerService.create(request);
assertNotNull(response);
assertEquals(response, CONTAINER_1);
assertEquals(response.getImage(), CONTAINER_1_IMAGE);
}
// @Test
// public void create_fails() throws ImageNotFoundException {
// final DatabaseContainerCreateRequestDto request = DatabaseContainerCreateRequestDto.builder()
// .containerName(CONTAINER_1_NAME)
// .image(CONTAINER_1_IMAGE.dockerImageName())
// .databaseName(CONTAINER_1_DATABASE)
// .build();
// when(containerService.create(request))
// .thenReturn(CONTAINER_1);
// when(imageRepository.findByImage(IMAGE_1_REPOSITORY, IMAGE_1_TAG))
// .thenReturn(null);
// }
//
// @Test
// public void findById_succeeds() {
// //
// }
//
// @Test
// public void findById_fails() {
// //
// }
//
// @Test
// public void change_succeeds() {
// //
// }
//
// @Test
// public void change_fails() {
// //
// }
//
// @Test
// public void delete_succeeds() {
// //
// }
//
// @Test
// public void delete_fails() {
// //
// }
}
package at.tuwien.service;
import at.tuwien.BaseIntegrationTest;
import at.tuwien.api.dto.database.DatabaseContainerCreateDto;
import at.tuwien.entity.DatabaseContainer;
import at.tuwien.api.dto.database.DatabaseContainerCreateRequestDto;
import at.tuwien.exception.ContainerNotFoundException;
import at.tuwien.exception.ImageNotFoundException;
import at.tuwien.repository.ContainerRepository;
import at.tuwien.repository.ImageRepository;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.model.Container;
import lombok.extern.log4j.Log4j2;
import org.junit.jupiter.api.Assertions;
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;
......@@ -19,12 +14,8 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.util.List;
import java.util.stream.Collectors;
import static org.mockito.Mockito.when;
@Log4j2
@SpringBootTest
@ExtendWith(SpringExtension.class)
public class DockerIntegrationTest extends BaseIntegrationTest {
......@@ -35,55 +26,19 @@ public class DockerIntegrationTest extends BaseIntegrationTest {
@MockBean
private ImageRepository imageRepository;
@Autowired
@MockBean
private ContainerService containerService;
@Autowired
private DockerClient dockerClient;
@BeforeEach
public void beforeEach() {
final List<Container> containers = dockerClient.listContainersCmd()
.withShowAll(true)
.exec()
.stream()
.filter(c -> !c.getImage().startsWith("fda"))
.collect(Collectors.toList());
containers.stream()
.filter(c -> c.getState().equals("running"))
.forEach(container -> {
log.debug("Stopping container {}", container.getId());
dockerClient.stopContainerCmd(container.getId()).exec();
});
containers.forEach(container -> {
dockerClient.removeContainerCmd(container.getId()).exec();
});
}
@Test
public void create_succeeds() throws ImageNotFoundException {
when(imageRepository.findByImage(IMAGE_1_REPOSITORY, IMAGE_1_TAG))
.thenReturn(IMAGE_1);
DatabaseContainerCreateDto dto = new DatabaseContainerCreateDto();
dto.setImage(IMAGE_1_REPOSITORY + ":" + IMAGE_1_TAG);
dto.setContainerName(CONTAINER_1_NAME);
dto.setDatabaseName(CONTAINER_1_DATABASE);
final DatabaseContainer response = containerService.create(dto);
Assertions.assertEquals(CONTAINER_1_ID, response.getContainerId());
Assertions.assertEquals(CONTAINER_1_DATABASE, response.getDatabaseName());
}
@Test
public void create_noImage_fails() {
final DatabaseContainerCreateDto containerDto = new DatabaseContainerCreateDto();
final DatabaseContainerCreateRequestDto containerDto = DatabaseContainerCreateRequestDto.builder().build();
Assertions.assertThrows(ImageNotFoundException.class, () -> containerService.create(containerDto));
}
@Test
public void create_imageNotFound_fails() {
final DatabaseContainerCreateDto containerDto = new DatabaseContainerCreateDto();
final DatabaseContainerCreateRequestDto containerDto = DatabaseContainerCreateRequestDto.builder().build();
containerDto.setImage("postgres:latest");
Assertions.assertThrows(ImageNotFoundException.class, () -> containerService.create(containerDto));
......
package at.tuwien.service;
import at.tuwien.BaseIntegrationTest;
import at.tuwien.api.dto.database.DatabaseContainerCreateDto;
import at.tuwien.api.dto.database.DatabaseContainerCreateRequestDto;
import at.tuwien.entity.DatabaseContainer;
import at.tuwien.exception.ContainerNotFoundException;
import at.tuwien.exception.DockerClientException;
......@@ -21,7 +21,8 @@ import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.util.List;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@ExtendWith(SpringExtension.class)
@SpringBootTest
......@@ -64,29 +65,16 @@ public class ServiceTest extends BaseIntegrationTest {
Assertions.assertThrows(ContainerNotFoundException.class, () -> containerService.getById(CONTAINER_1_ID));
}
@Test
public void create_succeeds() throws ImageNotFoundException {
when(imageRepository.findByImage(IMAGE_1_REPOSITORY, IMAGE_1_TAG))
.thenReturn(IMAGE_1);
DatabaseContainerCreateDto dto = new DatabaseContainerCreateDto();
dto.setImage(IMAGE_1_REPOSITORY + ":" + IMAGE_1_TAG);
dto.setContainerName(CONTAINER_1_NAME);
dto.setDatabaseName(CONTAINER_1_DATABASE);
final DatabaseContainer response = containerService.create(dto);
Assertions.assertEquals(CONTAINER_1_DATABASE, response.getDatabaseName());
}
@Test
public void create_noImage_fails() {
final DatabaseContainerCreateDto containerDto = new DatabaseContainerCreateDto();
final DatabaseContainerCreateRequestDto containerDto = DatabaseContainerCreateRequestDto.builder().build();
Assertions.assertThrows(ImageNotFoundException.class, () -> containerService.create(containerDto));
}
@Test
public void create_imageNotFound_fails() {
final DatabaseContainerCreateDto containerDto = new DatabaseContainerCreateDto();
final DatabaseContainerCreateRequestDto containerDto = DatabaseContainerCreateRequestDto.builder().build();
containerDto.setImage("postgres:latest");
Assertions.assertThrows(ImageNotFoundException.class, () -> containerService.create(containerDto));
......@@ -168,7 +156,7 @@ public class ServiceTest extends BaseIntegrationTest {
when(dockerClient.removeContainerCmd(CONTAINER_1_ID))
.thenThrow(NotFoundException.class);
Assertions.assertThrows(ContainerNotFoundException.class, () -> containerService.start(CONTAINER_1_ID));
Assertions.assertThrows(DockerClientException.class, () -> containerService.start(CONTAINER_1_ID));
}
@Test
......@@ -179,6 +167,6 @@ public class ServiceTest extends BaseIntegrationTest {
when(dockerClient.removeContainerCmd(CONTAINER_1_ID))
.thenThrow(NotModifiedException.class);
Assertions.assertThrows(ContainerNotFoundException.class, () -> containerService.start(CONTAINER_1_ID));
Assertions.assertThrows(DockerClientException.class, () -> containerService.start(CONTAINER_1_ID));
}
}
......@@ -46,4 +46,8 @@ public class ContainerImage extends Auditable {
@Column(nullable = false)
private Architecture architecture;
public final String dockerImageName() {
return repository + ":" + tag;
}
}
......@@ -2,6 +2,7 @@ package at.tuwien.mapper;
import at.tuwien.api.dto.container.DatabaseContainerBriefDto;
import at.tuwien.api.dto.container.DatabaseContainerDto;
import at.tuwien.api.dto.database.DatabaseContainerCreateResponseDto;
import at.tuwien.entity.ContainerImage;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.model.Container;
......@@ -44,4 +45,6 @@ public interface DatabaseContainerMapper {
DatabaseContainerBriefDto databaseContainerToDataBaseContainerBriefDto(DatabaseContainer data);
DatabaseContainerDto databaseContainerToDataBaseContainerDto(DatabaseContainer data);
DatabaseContainerCreateResponseDto databaseContainerToCreateDatabaseResponseDto(DatabaseContainer data);
}
package at.tuwien.service;
import at.tuwien.api.dto.database.DatabaseContainerCreateDto;
import at.tuwien.api.dto.database.DatabaseContainerCreateRequestDto;
import at.tuwien.entity.ContainerImage;
import at.tuwien.entity.DatabaseContainer;
import at.tuwien.exception.ContainerNotFoundException;
......@@ -15,13 +15,11 @@ import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.exception.NotModifiedException;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.api.model.Version;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.SocketUtils;
import javax.annotation.PostConstruct;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
......@@ -46,13 +44,7 @@ public class ContainerService {
this.databaseContainerMapper = databaseContainerMapper;
}
@PostConstruct
public void version() {
final Version version = dockerClient.versionCmd().exec();
log.info("Docker {} API {} compiled for {}", version.getVersion(), version.getApiVersion(), version.getArch());
}
public DatabaseContainer create(DatabaseContainerCreateDto containerDto) throws ImageNotFoundException {
public DatabaseContainer create(DatabaseContainerCreateRequestDto containerDto) throws ImageNotFoundException {
if (containerDto == null || containerDto.getContainerName() == null || containerDto.getDatabaseName() == null
|| containerDto.getImage() == null) {
throw new ImageNotFoundException("container data is null");
......@@ -92,7 +84,7 @@ public class ContainerService {
throw new ContainerNotFoundException("no container with this id in metadata database");
}
try {
dockerClient.stopContainerCmd(containerId).exec();
dockerClient.stopContainerCmd(container.getContainerId()).exec();
} catch (NotFoundException | NotModifiedException e) {
throw new DockerClientException("docker client failed", e);
}
......@@ -135,7 +127,7 @@ public class ContainerService {
public boolean start(String containerId) throws ContainerNotFoundException, DockerClientException {
final DatabaseContainer container = getById(containerId);
try {
dockerClient.startContainerCmd(containerId).exec();
dockerClient.startContainerCmd(container.getContainerId()).exec();
} catch (NotFoundException | NotModifiedException e) {
throw new DockerClientException("docker client failed", e);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment