Skip to content

Commit

Permalink
Merge pull request #72 from wiremock/wiremock-3-by-default
Browse files Browse the repository at this point in the history
Update the tests to use WireMock 3.0.0 release
  • Loading branch information
oleg-nenashev authored Aug 9, 2024
2 parents 0186947 + d648624 commit 95fe426
Show file tree
Hide file tree
Showing 16 changed files with 256 additions and 19 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ A common example is using Wiremock 3.x with Java 1.8.
The module is compatible with the following WireMock versions:

- WireMock (aka WireMock Java) `2.0.0` and above
- WireMock (aka WireMock Java) `3.0.0` beta versions.
- WireMock (aka WireMock Java) `3.x` versions.
Note that the official image for WireMock 3 is yet to be released and verified ([issue #59](https://github.com/wiremock/wiremock-testcontainers-java/issues/59))

Other WireMock implementations may work but have not been tested yet.
Expand Down
7 changes: 6 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
<java.version>1.8</java.version>
<maven.compiler.target>${java.version}</maven.compiler.target>
<maven.compiler.source>${java.version}</maven.compiler.source>
<wiremock.version>2.35.0</wiremock.version>
<wiremock.version>3.5.4</wiremock.version>
<testcontainers.version>1.19.8</testcontainers.version>
<junit.version>5.10.2</junit.version>
<assertj.version>3.26.3</assertj.version>
Expand Down Expand Up @@ -178,6 +178,11 @@
<version>0.4.1</version>
<classifier>jar-with-dependencies</classifier>
</artifactItem>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock</artifactId>
<version>${wiremock.version}</version>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-webhooks-extension</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,15 @@
public class WireMockContainer extends GenericContainer<WireMockContainer> {

public static final String OFFICIAL_IMAGE_NAME = "wiremock/wiremock";
private static final String WIREMOCK_2_LATEST_TAG = "2.35.0";
private static final String WIREMOCK_2_LATEST_TAG = "2.35.0-1";
private static final String WIREMOCK_3_LATEST_TAG = "3.5.4";
/*package*/ static final String WIREMOCK_2_MINIMUM_SUPPORTED_VERSION = "2.0.0";

static final String WIREMOCK_HEALTH_CHECK_SUPPORT_MINIMUM_VERSION = "3.0.0-1";

/**
* @deprecated Not really guaranteed to be latest. Will be reworked
*/
@Deprecated
public static final DockerImageName WIREMOCK_2_LATEST =
DockerImageName.parse(OFFICIAL_IMAGE_NAME).withTag(WIREMOCK_2_LATEST_TAG);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.wiremock.integrations.testcontainers;

import org.testcontainers.utility.DockerImageName;

public class TestConfig {

private static final String DEFAULT_TEST_TAG =
System.getProperty("wiremock.testcontainer.defaultTag", "3.5.4");
private static final String WIREMOCK_2_TEST_TAG =
System.getProperty("wiremock.testcontainer.wiremock2Tag", "2.35.1-1");

public static final DockerImageName WIREMOCK_DEFAULT_IMAGE =
DockerImageName.parse(WireMockContainer.OFFICIAL_IMAGE_NAME).withTag(DEFAULT_TEST_TAG);

public static final DockerImageName WIREMOCK_2_IMAGE =
DockerImageName.parse(WireMockContainer.OFFICIAL_IMAGE_NAME).withTag(WIREMOCK_2_TEST_TAG);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

class WireMockContainerBannerTest {

WireMockContainer wireMockContainer = new WireMockContainer(WireMockContainer.WIREMOCK_2_LATEST);
WireMockContainer wireMockContainer = new WireMockContainer(TestConfig.WIREMOCK_DEFAULT_IMAGE);

@Test
void bannerIsByDefaultDisabled() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class WireMockContainerExtensionTest {
private static final Logger LOGGER = LoggerFactory.getLogger(WireMockContainerExtensionTest.class);

@Container
WireMockContainer wiremockServer = new WireMockContainer(WireMockContainer.WIREMOCK_2_LATEST)
WireMockContainer wiremockServer = new WireMockContainer(TestConfig.WIREMOCK_DEFAULT_IMAGE)
.withLogConsumer(new Slf4jLogConsumer(LOGGER))
.withStartupTimeout(Duration.ofSeconds(60))
.withMapping("json-body-transformer", WireMockContainerExtensionTest.class, "json-body-transformer.json")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@ class WireMockContainerExtensionsCombinationTest {
private static final Logger LOGGER = LoggerFactory.getLogger(WireMockContainerExtensionsCombinationTest.class);

@Container
WireMockContainer wiremockServer = new WireMockContainer(WireMockContainer.WIREMOCK_2_LATEST)
WireMockContainer wiremockServer = new WireMockContainer(TestConfig.WIREMOCK_DEFAULT_IMAGE)
.withLogConsumer(new Slf4jLogConsumer(LOGGER))
.withMapping("json-body-transformer", WireMockContainerExtensionsCombinationTest.class, "json-body-transformer.json")
.withExtensions("Webhook",
Collections.singleton("org.wiremock.webhooks.Webhooks"),
Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-webhooks-extension-2.35.0.jar").toFile()))
Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-webhooks-extension-3.5.4.jar").toFile()))
.withExtensions("JSON Body Transformer",
Collections.singleton("com.ninecookies.wiremock.extensions.JsonBodyTransformer"),
Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-extensions-0.4.1-jar-with-dependencies.jar").toFile()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
public class WireMockContainerJunit4Test {

@Rule
public WireMockContainer wiremockServer = new WireMockContainer(WireMockContainer.WIREMOCK_2_LATEST)
public WireMockContainer wiremockServer = new WireMockContainer(TestConfig.WIREMOCK_DEFAULT_IMAGE)
.withMapping("hello", WireMockContainerTest.class, "hello-world.json")
.withMapping("hello-resource", WireMockContainerTest.class, "hello-world-resource.json")
.withFileFromResource("hello-world-resource-response.xml", WireMockContainerTest.class, "hello-world-resource-response.xml");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
class WireMockContainerTest {

@Container
WireMockContainer wiremockServer = new WireMockContainer(WireMockContainer.WIREMOCK_2_LATEST)
WireMockContainer wiremockServer = new WireMockContainer(TestConfig.WIREMOCK_DEFAULT_IMAGE)
.withMapping("hello", WireMockContainerTest.class, "hello-world.json")
.withMapping("hello-resource", WireMockContainerTest.class, "hello-world-resource.json")
.withFileFromResource("hello-world-resource-response.xml", WireMockContainerTest.class,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class WireMockContainerUnitTest {

@Test
public void shouldInitWithDefault() {
WireMockContainer container = new WireMockContainer(WireMockContainer.WIREMOCK_2_LATEST);
WireMockContainer container = new WireMockContainer(TestConfig.WIREMOCK_DEFAULT_IMAGE);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,25 +47,21 @@
* @see <a href="https://www.testcontainers.org/features/networking/">Testcontainers Networking</a>
*/
@Testcontainers
class WireMockContainerExtensionsWebhookTest {
class WireMockContainerWebhooksTest {

private static final Logger LOGGER = LoggerFactory.getLogger(WireMockContainerExtensionsWebhookTest.class);
private static final Logger LOGGER = LoggerFactory.getLogger(WireMockContainerWebhooksTest.class);
private static final String WIREMOCK_PATH = "/wiremock/callback-trigger";
private static final String APPLICATION_PATH = "/application/callback-receiver";


TestHttpServer applicationServer = TestHttpServer.newInstance();
@Container
WireMockContainer wiremockServer = new WireMockContainer(WireMockContainer.WIREMOCK_2_LATEST)
WireMockContainer wiremockServer = new WireMockContainer(TestConfig.WIREMOCK_DEFAULT_IMAGE)
.withLogConsumer(new Slf4jLogConsumer(LOGGER))
.withCliArg("--global-response-templating")
.withMapping("webhook-callback-template", WireMockContainerExtensionsWebhookTest.class, "webhook-callback-template.json")
.withExtensions("Webhook",
Collections.singleton("org.wiremock.webhooks.Webhooks"),
Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-webhooks-extension-2.35.0.jar").toFile()))
.withMapping("webhook-callback-template", WireMockContainerWebhooksTest.class, "webhook-callback-template.json")
.withAccessToHost(true); // Force the host access mechanism


@Test
void callbackUsingJsonStub() throws Exception {
// given
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* Copyright (C) 2023 WireMock Inc, Oleg Nenashev and all project contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wiremock.integrations.testcontainers.wiremock2;

import static org.assertj.core.api.Assertions.assertThat;
import static org.testcontainers.Testcontainers.exposeHostPorts;
import static org.testcontainers.shaded.org.awaitility.Awaitility.await;

import java.nio.file.Paths;
import java.time.Duration;
import java.util.Collections;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.wiremock.integrations.testcontainers.TestConfig;
import org.wiremock.integrations.testcontainers.WireMockContainer;
import org.wiremock.integrations.testcontainers.testsupport.http.HttpResponse;
import org.wiremock.integrations.testcontainers.testsupport.http.TestHttpClient;
import org.wiremock.integrations.testcontainers.testsupport.http.TestHttpServer;

/**
* Tests the WireMock Webhook extension and TestContainers Networking
* For this type of tests we should use following steps:
* <p>
* Use {@link GenericContainer#withAccessToHost(boolean)} to force the host access mechanism
* <p>
* Use {@link org.testcontainers.Testcontainers#exposeHostPorts(int...)} to expose host machine ports to containers
* <p>
* Use {@link GenericContainer#INTERNAL_HOST_HOSTNAME} to calculate hostname for callback
*
* @see <a href="https://www.testcontainers.org/features/networking/">Testcontainers Networking</a>
*/
@Testcontainers
class WebhooksExtensionTest {

private static final Logger LOGGER = LoggerFactory.getLogger(WebhooksExtensionTest.class);
private static final String WIREMOCK_PATH = "/wiremock/callback-trigger";
private static final String APPLICATION_PATH = "/application/callback-receiver";


TestHttpServer applicationServer = TestHttpServer.newInstance();
@Container
WireMockContainer wiremockServer = new WireMockContainer(TestConfig.WIREMOCK_2_IMAGE)
.withLogConsumer(new Slf4jLogConsumer(LOGGER))
.withCliArg("--global-response-templating")
.withMapping("webhook-callback-template", WebhooksExtensionTest.class, "webhook-callback-template.json")
.withExtensions("Webhooks",
Collections.singleton("org.wiremock.webhooks.Webhooks"),
Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-webhooks-extension-2.35.0.jar").toFile()))
.withAccessToHost(true); // Force the host access mechanism

@Test
void callbackUsingJsonStub() throws Exception {
// given
exposeHostPorts(applicationServer.getPort()); // Exposing host ports to the container

String wiremockUrl = wiremockServer.getUrl(WIREMOCK_PATH);
String applicationCallbackUrl = String.format("http://%s:%d%s", GenericContainer.INTERNAL_HOST_HOSTNAME, applicationServer.getPort(), APPLICATION_PATH);

// when
HttpResponse response = new TestHttpClient().post(
wiremockUrl,
"{\"callbackMethod\": \"PUT\", \"callbackUrl\": \"" + applicationCallbackUrl + "\"}"
);

// then
assertThat(response).as("Wiremock Response").isNotNull().satisfies(it -> {
assertThat(it.getStatusCode()).as("Wiremock Response Status").isEqualTo(200);
assertThat(it.getBody()).as("Wiremock Response Body")
.contains("Please wait callback")
.contains("PUT")
.contains(applicationCallbackUrl);
});

await().atMost(Duration.ofMillis(5000)).untilAsserted(() -> {
assertThat(applicationServer.getRecordedRequests()).as("Received Callback")
.hasSize(1)
.first().usingRecursiveComparison()
.isEqualTo(new TestHttpServer.RecordedRequest("PUT", APPLICATION_PATH, "Async processing Finished"));
});
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Copyright (C) 2023 WireMock Inc, Oleg Nenashev and all project contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wiremock.integrations.testcontainers.wiremock2;

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.wiremock.integrations.testcontainers.TestConfig;
import org.wiremock.integrations.testcontainers.WireMockContainer;
import org.wiremock.integrations.testcontainers.testsupport.http.HttpResponse;
import org.wiremock.integrations.testcontainers.testsupport.http.TestHttpClient;

import java.nio.file.Paths;
import java.util.Collections;

import static org.assertj.core.api.Assertions.assertThat;

/**
* Tests the WireMock extension loading.
* It uses multiple external Jars supplied by the Maven Dependency Plugin.
*/
@Testcontainers
class WireMockContainerExtensionsCombinationTest {

private static final Logger LOGGER = LoggerFactory.getLogger(WireMockContainerExtensionsCombinationTest.class);

@Container
WireMockContainer wiremockServer = new WireMockContainer(TestConfig.WIREMOCK_2_IMAGE)
.withLogConsumer(new Slf4jLogConsumer(LOGGER))
.withMapping("json-body-transformer", WireMockContainerExtensionsCombinationTest.class, "json-body-transformer.json")
.withExtensions("Webhook",
Collections.singleton("org.wiremock.webhooks.Webhooks"),
Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-webhooks-extension-2.35.0.jar").toFile()))
.withExtensions("JSON Body Transformer",
Collections.singleton("com.ninecookies.wiremock.extensions.JsonBodyTransformer"),
Collections.singleton(Paths.get("target", "test-wiremock-extension", "wiremock-extensions-0.4.1-jar-with-dependencies.jar").toFile()));

@Test
void testJSONBodyTransformer() throws Exception {
// given
String url = wiremockServer.getUrl("/json-body-transformer");
String body = "{\"name\":\"John Doe\"}";

// when
HttpResponse response = new TestHttpClient().post(url, body);

// then
assertThat(response.getBody())
.as("Wrong response body")
.contains("Hello, John Doe!");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"request": {
"method": "POST",
"urlPath": "/wiremock/callback-trigger"
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"jsonBody": {
"message": "Please wait callback",
"method": "{{jsonPath request.body '$.callbackMethod'}}",
"url": "{{jsonPath request.body '$.callbackUrl'}}"
}
},
"postServeActions": [
{
"name": "webhook",
"parameters": {
"method": "{{jsonPath originalRequest.body '$.callbackMethod'}}",
"url": "{{jsonPath originalRequest.body '$.callbackUrl'}}",
"body": "Async processing Finished",
"delay": {
"type": "fixed",
"milliseconds": 1000
}
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"request": {
"method": "POST",
"url": "/json-body-transformer"
},
"response": {
"status": 201,
"headers": {
"content-type": "application/json"
},
"jsonBody": {
"message": "Hello, $(name)!"
},
"transformers" : ["json-body-transformer"]
}
}

0 comments on commit 95fe426

Please sign in to comment.