From 33a6609a49c882941ad2a134da1e979b6ebbc6a4 Mon Sep 17 00:00:00 2001 From: Johan Chavaillaz Date: Sun, 31 Dec 2023 17:06:05 +0100 Subject: [PATCH] Add tests for each HTTP client. --- pom.xml | 20 +++++++++-- .../apache/AbstractApacheHttpClient.java | 2 +- .../common/java/AbstractJavaHttpClient.java | 2 +- .../common/okhttp/AbstractOkHttpClient.java | 2 +- .../common/vertx/AbstractVertxHttpClient.java | 2 +- .../client/common/apache/ApacheHttpTest.java | 34 ++++++++++++++++++ .../common/apache/ApacheHttpUserApi.java | 22 ++++++++++++ .../DeserializationExceptionTest.java | 2 +- .../client/common/java/JavaHttpTest.java | 35 +++++++++++++++++++ .../client/common/java/JavaHttpUserApi.java | 21 +++++++++++ .../chavaillaz/client/common/model/User.java | 10 ++++++ .../client/common/model/UserApi.java | 28 +++++++++++++++ .../client/common/okhttp/OkHttpTest.java | 34 ++++++++++++++++++ .../client/common/okhttp/OkHttpUserApi.java | 21 +++++++++++ .../client/common/vertx/VertxHttpTest.java | 35 +++++++++++++++++++ .../client/common/vertx/VertxHttpUserApi.java | 23 ++++++++++++ 16 files changed, 285 insertions(+), 8 deletions(-) create mode 100644 src/test/java/com/chavaillaz/client/common/apache/ApacheHttpTest.java create mode 100644 src/test/java/com/chavaillaz/client/common/apache/ApacheHttpUserApi.java create mode 100644 src/test/java/com/chavaillaz/client/common/java/JavaHttpTest.java create mode 100644 src/test/java/com/chavaillaz/client/common/java/JavaHttpUserApi.java create mode 100644 src/test/java/com/chavaillaz/client/common/model/User.java create mode 100644 src/test/java/com/chavaillaz/client/common/model/UserApi.java create mode 100644 src/test/java/com/chavaillaz/client/common/okhttp/OkHttpTest.java create mode 100644 src/test/java/com/chavaillaz/client/common/okhttp/OkHttpUserApi.java create mode 100644 src/test/java/com/chavaillaz/client/common/vertx/VertxHttpTest.java create mode 100644 src/test/java/com/chavaillaz/client/common/vertx/VertxHttpUserApi.java diff --git a/pom.xml b/pom.xml index b050bdf..5782f4a 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,13 @@ + + com.fasterxml.jackson + jackson-bom + 2.16.1 + pom + import + org.apache.logging.log4j log4j-bom @@ -58,9 +65,9 @@ import - com.fasterxml.jackson - jackson-bom - 2.16.1 + org.mockito + mockito-bom + 5.8.0 pom import @@ -145,6 +152,13 @@ log4j-slf4j2-impl test + + + org.wiremock + wiremock + 3.3.1 + test + diff --git a/src/main/java/com/chavaillaz/client/common/apache/AbstractApacheHttpClient.java b/src/main/java/com/chavaillaz/client/common/apache/AbstractApacheHttpClient.java index 4c82a4a..5c21f38 100644 --- a/src/main/java/com/chavaillaz/client/common/apache/AbstractApacheHttpClient.java +++ b/src/main/java/com/chavaillaz/client/common/apache/AbstractApacheHttpClient.java @@ -28,7 +28,7 @@ /** * Abstract class implementing common parts for Apache HTTP. */ -public class AbstractApacheHttpClient extends AbstractHttpClient implements AutoCloseable { +public abstract class AbstractApacheHttpClient extends AbstractHttpClient implements AutoCloseable { protected final CloseableHttpAsyncClient client; diff --git a/src/main/java/com/chavaillaz/client/common/java/AbstractJavaHttpClient.java b/src/main/java/com/chavaillaz/client/common/java/AbstractJavaHttpClient.java index 52f3bd8..45b5809 100644 --- a/src/main/java/com/chavaillaz/client/common/java/AbstractJavaHttpClient.java +++ b/src/main/java/com/chavaillaz/client/common/java/AbstractJavaHttpClient.java @@ -19,7 +19,7 @@ /** * Abstract class implementing common parts for Java HTTP. */ -public class AbstractJavaHttpClient extends AbstractHttpClient implements AutoCloseable { +public abstract class AbstractJavaHttpClient extends AbstractHttpClient implements AutoCloseable { protected final HttpClient client; diff --git a/src/main/java/com/chavaillaz/client/common/okhttp/AbstractOkHttpClient.java b/src/main/java/com/chavaillaz/client/common/okhttp/AbstractOkHttpClient.java index 8043ed4..70c2e67 100644 --- a/src/main/java/com/chavaillaz/client/common/okhttp/AbstractOkHttpClient.java +++ b/src/main/java/com/chavaillaz/client/common/okhttp/AbstractOkHttpClient.java @@ -20,7 +20,7 @@ /** * Abstract class implementing common parts for OkHttp. */ -public class AbstractOkHttpClient extends AbstractHttpClient implements AutoCloseable { +public abstract class AbstractOkHttpClient extends AbstractHttpClient implements AutoCloseable { public static final RequestBody EMPTY_BODY = RequestBody.create(EMPTY, null); public static final MediaType MEDIA_TYPE_JSON = MediaType.parse(HEADER_CONTENT_JSON); diff --git a/src/main/java/com/chavaillaz/client/common/vertx/AbstractVertxHttpClient.java b/src/main/java/com/chavaillaz/client/common/vertx/AbstractVertxHttpClient.java index 544e3d5..5194529 100644 --- a/src/main/java/com/chavaillaz/client/common/vertx/AbstractVertxHttpClient.java +++ b/src/main/java/com/chavaillaz/client/common/vertx/AbstractVertxHttpClient.java @@ -18,7 +18,7 @@ /** * Abstract class implementing common parts for Vert.x HTTP. */ -public class AbstractVertxHttpClient extends AbstractHttpClient implements AutoCloseable { +public abstract class AbstractVertxHttpClient extends AbstractHttpClient implements AutoCloseable { protected final WebClient client; diff --git a/src/test/java/com/chavaillaz/client/common/apache/ApacheHttpTest.java b/src/test/java/com/chavaillaz/client/common/apache/ApacheHttpTest.java new file mode 100644 index 0000000..a338f2c --- /dev/null +++ b/src/test/java/com/chavaillaz/client/common/apache/ApacheHttpTest.java @@ -0,0 +1,34 @@ +package com.chavaillaz.client.common.apache; + +import static com.chavaillaz.client.common.apache.ApacheHttpUtils.defaultHttpClientBuilder; +import static com.chavaillaz.client.common.model.UserApi.stubForUserApi; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import com.chavaillaz.client.common.model.User; +import com.chavaillaz.client.common.security.AnonymousAuthentication; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; +import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +@WireMockTest +class ApacheHttpTest { + + @BeforeEach + void setup() { + stubForUserApi(); + } + + @Test + void testApache(WireMockRuntimeInfo wiremock) throws Exception { + CloseableHttpAsyncClient client = defaultHttpClientBuilder(null).build(); + try (var api = new ApacheHttpUserApi(client, wiremock.getHttpBaseUrl(), new AnonymousAuthentication())) { + User user = api.getUser().join(); + assertNotNull(user); + assertEquals("WireMock", user.getUsername()); + } + } + +} diff --git a/src/test/java/com/chavaillaz/client/common/apache/ApacheHttpUserApi.java b/src/test/java/com/chavaillaz/client/common/apache/ApacheHttpUserApi.java new file mode 100644 index 0000000..5d23cf8 --- /dev/null +++ b/src/test/java/com/chavaillaz/client/common/apache/ApacheHttpUserApi.java @@ -0,0 +1,22 @@ +package com.chavaillaz.client.common.apache; + +import static org.apache.hc.client5.http.async.methods.SimpleRequestBuilder.get; + +import java.util.concurrent.CompletableFuture; + +import com.chavaillaz.client.common.model.User; +import com.chavaillaz.client.common.model.UserApi; +import com.chavaillaz.client.common.security.Authentication; +import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient; + +public class ApacheHttpUserApi extends AbstractApacheHttpClient implements UserApi { + + public ApacheHttpUserApi(CloseableHttpAsyncClient client, String baseUrl, Authentication authentication) { + super(client, baseUrl, authentication); + } + + public CompletableFuture getUser() { + return sendAsync(requestBuilder(get(), URL_USER), User.class); + } + +} diff --git a/src/test/java/com/chavaillaz/client/common/exception/DeserializationExceptionTest.java b/src/test/java/com/chavaillaz/client/common/exception/DeserializationExceptionTest.java index c8d5ff6..5cfe7aa 100644 --- a/src/test/java/com/chavaillaz/client/common/exception/DeserializationExceptionTest.java +++ b/src/test/java/com/chavaillaz/client/common/exception/DeserializationExceptionTest.java @@ -20,7 +20,7 @@ void testExceptionMessageWithClass() { } @Test - void testExcepionMessageWithJavaType() { + void testExceptionMessageWithJavaType() { JavaType type = TypeFactory.defaultInstance() .constructSimpleType(String.class, new JavaType[]{}); Exception root = new Exception("Root"); diff --git a/src/test/java/com/chavaillaz/client/common/java/JavaHttpTest.java b/src/test/java/com/chavaillaz/client/common/java/JavaHttpTest.java new file mode 100644 index 0000000..ac9e5eb --- /dev/null +++ b/src/test/java/com/chavaillaz/client/common/java/JavaHttpTest.java @@ -0,0 +1,35 @@ +package com.chavaillaz.client.common.java; + +import static com.chavaillaz.client.common.java.JavaHttpUtils.defaultHttpClientBuilder; +import static com.chavaillaz.client.common.model.UserApi.stubForUserApi; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.net.http.HttpClient; + +import com.chavaillaz.client.common.model.User; +import com.chavaillaz.client.common.security.AnonymousAuthentication; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +@WireMockTest +class JavaHttpTest { + + @BeforeEach + void setup() { + stubForUserApi(); + } + + @Test + void testJava(WireMockRuntimeInfo wiremock) { + HttpClient client = defaultHttpClientBuilder(null).build(); + try (var api = new JavaHttpUserApi(client, wiremock.getHttpBaseUrl(), new AnonymousAuthentication())) { + User user = api.getUser().join(); + assertNotNull(user); + assertEquals("WireMock", user.getUsername()); + } + } + +} diff --git a/src/test/java/com/chavaillaz/client/common/java/JavaHttpUserApi.java b/src/test/java/com/chavaillaz/client/common/java/JavaHttpUserApi.java new file mode 100644 index 0000000..efb613e --- /dev/null +++ b/src/test/java/com/chavaillaz/client/common/java/JavaHttpUserApi.java @@ -0,0 +1,21 @@ +package com.chavaillaz.client.common.java; + +import java.net.http.HttpClient; +import java.util.concurrent.CompletableFuture; + +import com.chavaillaz.client.common.model.User; +import com.chavaillaz.client.common.model.UserApi; +import com.chavaillaz.client.common.security.Authentication; + +public class JavaHttpUserApi extends AbstractJavaHttpClient implements UserApi { + + public JavaHttpUserApi(HttpClient client, String baseUrl, Authentication authentication) { + super(client, baseUrl, authentication); + } + + @Override + public CompletableFuture getUser() { + return sendAsync(requestBuilder(URL_USER).GET(), User.class); + } + +} diff --git a/src/test/java/com/chavaillaz/client/common/model/User.java b/src/test/java/com/chavaillaz/client/common/model/User.java new file mode 100644 index 0000000..2a93a89 --- /dev/null +++ b/src/test/java/com/chavaillaz/client/common/model/User.java @@ -0,0 +1,10 @@ +package com.chavaillaz.client.common.model; + +import lombok.Data; + +@Data +public class User { + + private String username; + +} diff --git a/src/test/java/com/chavaillaz/client/common/model/UserApi.java b/src/test/java/com/chavaillaz/client/common/model/UserApi.java new file mode 100644 index 0000000..52ed8e3 --- /dev/null +++ b/src/test/java/com/chavaillaz/client/common/model/UserApi.java @@ -0,0 +1,28 @@ +package com.chavaillaz.client.common.model; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.common.ContentTypes.APPLICATION_JSON; + +import java.util.concurrent.CompletableFuture; + +public interface UserApi extends AutoCloseable { + + String URL_USER = "/user"; + + static void stubForUserApi() { + stubFor(get("/user").willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", APPLICATION_JSON) + .withBody("{\"username\": \"WireMock\"}"))); + } + + /** + * Gets the current user. + * + * @return A {@link CompletableFuture} with the user + */ + CompletableFuture getUser(); + +} diff --git a/src/test/java/com/chavaillaz/client/common/okhttp/OkHttpTest.java b/src/test/java/com/chavaillaz/client/common/okhttp/OkHttpTest.java new file mode 100644 index 0000000..9a0c654 --- /dev/null +++ b/src/test/java/com/chavaillaz/client/common/okhttp/OkHttpTest.java @@ -0,0 +1,34 @@ +package com.chavaillaz.client.common.okhttp; + +import static com.chavaillaz.client.common.model.UserApi.stubForUserApi; +import static com.chavaillaz.client.common.okhttp.OkHttpUtils.defaultHttpClientBuilder; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import com.chavaillaz.client.common.model.User; +import com.chavaillaz.client.common.security.AnonymousAuthentication; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; +import okhttp3.OkHttpClient; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +@WireMockTest +class OkHttpTest { + + @BeforeEach + void setup() { + stubForUserApi(); + } + + @Test + void testOkHttp(WireMockRuntimeInfo wiremock) throws Exception { + OkHttpClient client = defaultHttpClientBuilder(null).build(); + try (var api = new OkHttpUserApi(client, wiremock.getHttpBaseUrl(), new AnonymousAuthentication())) { + User user = api.getUser().join(); + assertNotNull(user); + assertEquals("WireMock", user.getUsername()); + } + } + +} \ No newline at end of file diff --git a/src/test/java/com/chavaillaz/client/common/okhttp/OkHttpUserApi.java b/src/test/java/com/chavaillaz/client/common/okhttp/OkHttpUserApi.java new file mode 100644 index 0000000..67eddce --- /dev/null +++ b/src/test/java/com/chavaillaz/client/common/okhttp/OkHttpUserApi.java @@ -0,0 +1,21 @@ +package com.chavaillaz.client.common.okhttp; + +import java.util.concurrent.CompletableFuture; + +import com.chavaillaz.client.common.model.User; +import com.chavaillaz.client.common.model.UserApi; +import com.chavaillaz.client.common.security.Authentication; +import okhttp3.OkHttpClient; + +public class OkHttpUserApi extends AbstractOkHttpClient implements UserApi { + + public OkHttpUserApi(OkHttpClient client, String baseUrl, Authentication authentication) { + super(client, baseUrl, authentication); + } + + @Override + public CompletableFuture getUser() { + return sendAsync(requestBuilder(URL_USER).get(), User.class); + } + +} diff --git a/src/test/java/com/chavaillaz/client/common/vertx/VertxHttpTest.java b/src/test/java/com/chavaillaz/client/common/vertx/VertxHttpTest.java new file mode 100644 index 0000000..31d3eee --- /dev/null +++ b/src/test/java/com/chavaillaz/client/common/vertx/VertxHttpTest.java @@ -0,0 +1,35 @@ +package com.chavaillaz.client.common.vertx; + +import static com.chavaillaz.client.common.model.UserApi.stubForUserApi; +import static com.chavaillaz.client.common.vertx.VertxUtils.defaultWebClientOptions; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import com.chavaillaz.client.common.model.User; +import com.chavaillaz.client.common.security.AnonymousAuthentication; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; +import io.vertx.core.Vertx; +import io.vertx.ext.web.client.WebClient; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +@WireMockTest +class VertxHttpTest { + + @BeforeEach + void setup() { + stubForUserApi(); + } + + @Test + void testVertx(WireMockRuntimeInfo wiremock) throws Exception { + WebClient client = WebClient.create(Vertx.vertx(), defaultWebClientOptions(null)); + try (var api = new VertxHttpUserApi(client, wiremock.getHttpBaseUrl(), new AnonymousAuthentication())) { + User user = api.getUser().join(); + assertNotNull(user); + assertEquals("WireMock", user.getUsername()); + } + } + +} diff --git a/src/test/java/com/chavaillaz/client/common/vertx/VertxHttpUserApi.java b/src/test/java/com/chavaillaz/client/common/vertx/VertxHttpUserApi.java new file mode 100644 index 0000000..3de89d7 --- /dev/null +++ b/src/test/java/com/chavaillaz/client/common/vertx/VertxHttpUserApi.java @@ -0,0 +1,23 @@ +package com.chavaillaz.client.common.vertx; + +import static io.vertx.core.http.HttpMethod.GET; + +import java.util.concurrent.CompletableFuture; + +import com.chavaillaz.client.common.model.User; +import com.chavaillaz.client.common.model.UserApi; +import com.chavaillaz.client.common.security.Authentication; +import io.vertx.ext.web.client.WebClient; + +public class VertxHttpUserApi extends AbstractVertxHttpClient implements UserApi { + + protected VertxHttpUserApi(WebClient client, String baseUrl, Authentication authentication) { + super(client, baseUrl, authentication); + } + + @Override + public CompletableFuture getUser() { + return handleAsync(requestBuilder(GET, URL_USER).send(), User.class); + } + +}