From f7b7478c3d305f503f735fc622c688b60c3f61c6 Mon Sep 17 00:00:00 2001 From: Kai Moritz Date: Fri, 10 Jan 2020 20:07:51 +0100 Subject: [PATCH] WIP:integrationtest --- pom.xml | 18 +++++ .../de/juplo/demo/IntegrationTestBase.java | 77 +++++++++++++++++++ .../demo/IntegrationtestApplicationIT.java | 48 ++++++++++++ src/test/resources/index.html | 1 + src/test/resources/test.txt | 1 + 5 files changed, 145 insertions(+) create mode 100644 src/test/java/de/juplo/demo/IntegrationTestBase.java create mode 100644 src/test/java/de/juplo/demo/IntegrationtestApplicationIT.java create mode 100644 src/test/resources/index.html create mode 100644 src/test/resources/test.txt diff --git a/pom.xml b/pom.xml index 74fd65f..15775ad 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,8 @@ 1.8 + 5.8.1 + 1.12.4 @@ -43,6 +45,18 @@ + + org.mock-server + mockserver-netty + ${mockserver.version} + test + + + org.testcontainers + nginx + ${testcontainers-nginx.version} + test + io.projectreactor reactor-test @@ -56,6 +70,10 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-failsafe-plugin + diff --git a/src/test/java/de/juplo/demo/IntegrationTestBase.java b/src/test/java/de/juplo/demo/IntegrationTestBase.java new file mode 100644 index 0000000..94a91a1 --- /dev/null +++ b/src/test/java/de/juplo/demo/IntegrationTestBase.java @@ -0,0 +1,77 @@ +package de.juplo.demo; + + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.mockserver.integration.ClientAndServer; +import org.testcontainers.containers.NginxContainer; +import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; + + + +/** + * This class starts a + * {@link https://www.testcontainers.org/modules/nginx/ NginX-Webserver} + * via a {@link https://www.testcontainers.org/ Testcontainer} and a + * standalone {@link http://www.mock-server.com/#what-is-mockserver MockServer}, + * that can be used to intercept requests for assertions / verifications. + *

+ * We use the {@link + * https://www.testcontainers.org/test_framework_integration/manual_lifecycle_control/#singleton-containers + * Singleton Pattern} to start the NginX-Testcontainer and start the MockServer + * programmatically via the {@link + * http://www.mock-server.com/mock_server/running_mock_server.html#client_api + * Client-API}. + * @author Kai Moritz + */ +public abstract class IntegrationTestBase +{ + static final NginxContainer NGINX; + static final ClientAndServer MOCK_SERVER; + + + static + { + NGINX = new NginxContainer().withCustomContent("src/test/resources/"); + MOCK_SERVER = ClientAndServer.startClientAndServer(); + } + + + @BeforeAll + static void startMockServer() + { + NGINX.waitingFor(new HttpWaitStrategy()).start(); + } + + @AfterAll + static void stopMockServer() + { + MOCK_SERVER.stop(); + } + + + String getNginxIP() + { + return NGINX.getContainerIpAddress(); + } + + int getNginxPort() + { + return NGINX.getMappedPort(80); + } + + String getNginxUri() + { + return "http://" + getNginxIP() + ":" + getNginxPort(); + } + + int getMockServerPort() + { + return MOCK_SERVER.getLocalPort(); + } + + String getMockServerUri() + { + return "http://localhost:" + getMockServerPort(); + } +} diff --git a/src/test/java/de/juplo/demo/IntegrationtestApplicationIT.java b/src/test/java/de/juplo/demo/IntegrationtestApplicationIT.java new file mode 100644 index 0000000..6b0b8d9 --- /dev/null +++ b/src/test/java/de/juplo/demo/IntegrationtestApplicationIT.java @@ -0,0 +1,48 @@ +package de.juplo.demo; + +import de.juplo.integrationtest.IntegrationtestApplicationIT.Application; +import java.net.URI; +import org.junit.jupiter.api.Test; +import static org.mockserver.matchers.Times.exactly; +import static org.mockserver.model.HttpForward.forward; +import static org.mockserver.model.HttpRequest.request; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.test.web.servlet.MockMvc; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest(classes = Application.class) +@AutoConfigureWebMvc +class IntegrationtestApplicationIT extends IntegrationTestBase { + + @Autowired + MockMvc mockMvc; + + + @Test + void contextLoads() throws Exception { + MOCK_SERVER + .when(request().withPath("/?path=test.txt"), exactly(1)) + .forward(forward().withHost(getNginxIP()).withPort(getNginxPort())); + mockMvc + .perform(get(URI.create("http://sut/?path=test.txt"))) + .andExpect(status().isOk()); + } + + @SpringBootApplication + static class Application { + + @Bean + public RemoteContentController remoteContentController() + { + return new RemoteContentController( + "http://localhost:" + + IntegrationtestApplicationIT.MOCK_SERVER.getLocalPort() + ); + } + } +} diff --git a/src/test/resources/index.html b/src/test/resources/index.html new file mode 100644 index 0000000..f747925 --- /dev/null +++ b/src/test/resources/index.html @@ -0,0 +1 @@ +DUMMY diff --git a/src/test/resources/test.txt b/src/test/resources/test.txt new file mode 100644 index 0000000..980a0d5 --- /dev/null +++ b/src/test/resources/test.txt @@ -0,0 +1 @@ +Hello World! -- 2.20.1