From 2212c7a97a421c1a1942b2790fd6007e1c4b4aec Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Wed, 12 Jul 2023 11:35:36 -0300 Subject: [PATCH 01/13] Updating version check in main CI script. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 888e313..06aa1a3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -41,7 +41,7 @@ jobs: URL=$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/latest LATEST=$(curl --silent "$URL" | jq -r .name) if [ "$LATEST" == "$VERSION" ]; then - echo "Version is used." + echo "Version already used: $VERSION" exit 1 fi From 8a5bc1fb11c93a617282be713e6693d1efd56751 Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Wed, 12 Jul 2023 14:38:02 -0300 Subject: [PATCH 02/13] Updating version badge. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 398c68b..51f57d4 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ httpbucket -[![BuildWithLove](https://img.shields.io/badge/%20built%20with-%20%E2%9D%A4-ff69b4.svg "build with love")](https://github.com/testainers/httpbucket/stargazers) -[![Docker Image Version](https://img.shields.io/docker/v/testainers/httpbucket)](https://hub.docker.com/r/testainers/httpbucket/tags) +[![Build With Love](https://img.shields.io/badge/%20built%20with-%20%E2%9D%A4-ff69b4.svg)](https://github.com/testainers/httpbucket/stargazers) +[![Version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fapi.github.com%2Frepos%2Ftestainers%2Fhttpbucket%2Freleases%2Flatest&query=%24.name&label=version&color=orange)](https://hub.docker.com/r/testainers/httpbucket/tags) [![Licence](https://img.shields.io/github/license/testainers/httpbucket?color=blue)](https://github.com/testainers/httpbucket/blob/main/LICENSE) [![Build](https://img.shields.io/github/actions/workflow/status/testainers/httpbucket/main.yml?branch=main)](https://github.com/testainers/httpbucket/releases/latest) -[![Coverage Report](https://img.shields.io/badge/coverage-report-C08EA1 "Coverage Report")](https://testainers.github.io/httpbucket/) +[![Coverage Report](https://img.shields.io/badge/coverage-report-C08EA1)](https://testainers.github.io/httpbucket/) **httpucket** is a powerful microservice designed specifically for testing HTTP requests with a wide range of request URLs. It serves as a valuable tool for From 84c9412b0e68dc3fd5fffcfa585870d589270da3 Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Sun, 23 Jul 2023 19:02:06 -0300 Subject: [PATCH 03/13] Updating Quarkus to 3.2.1. --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 03b2cad..a712916 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ #Gradle properties quarkusPluginId=io.quarkus -quarkusPluginVersion=3.2.0.Final +quarkusPluginVersion=3.2.1.Final quarkusPlatformGroupId=io.quarkus.platform quarkusPlatformArtifactId=quarkus-bom -quarkusPlatformVersion=3.2.0.Final +quarkusPlatformVersion=3.2.1.Final From 30db72992ece19f2837b702caee60248e19f3508 Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Mon, 24 Jul 2023 00:16:39 -0300 Subject: [PATCH 04/13] Creating BasicAuthResource. --- .../com/testainers/BasicAuthResource.java | 102 ++++++ .../java/com/testainers/LengthResource.java | 1 + .../java/com/testainers/MethodsResource.java | 5 +- .../java/com/testainers/RedirectResource.java | 1 + .../java/com/testainers/StatusResource.java | 4 +- src/test/java/com/testainers/BaseTest.java | 50 +++ .../java/com/testainers/BasicAuthTest.java | 330 ++++++++++++++++++ .../testainers/LengthResourceDeleteTest.java | 3 +- .../com/testainers/LengthResourceGetTest.java | 3 +- .../testainers/LengthResourcePatchTest.java | 3 +- .../testainers/LengthResourcePostTest.java | 3 +- .../com/testainers/LengthResourcePutTest.java | 3 +- .../com/testainers/MethodsResourceTest.java | 143 ++++---- .../testainers/StatusResourceDeleteTest.java | 202 ++++------- .../com/testainers/StatusResourceGetTest.java | 169 ++++----- .../testainers/StatusResourceHeadTest.java | 119 +++++++ .../testainers/StatusResourcePatchTest.java | 202 ++++------- .../testainers/StatusResourcePostTest.java | 201 ++++------- .../com/testainers/StatusResourcePutTest.java | 201 ++++------- 19 files changed, 1005 insertions(+), 740 deletions(-) create mode 100644 src/main/java/com/testainers/BasicAuthResource.java create mode 100644 src/test/java/com/testainers/BaseTest.java create mode 100644 src/test/java/com/testainers/BasicAuthTest.java create mode 100644 src/test/java/com/testainers/StatusResourceHeadTest.java diff --git a/src/main/java/com/testainers/BasicAuthResource.java b/src/main/java/com/testainers/BasicAuthResource.java new file mode 100644 index 0000000..2486f7c --- /dev/null +++ b/src/main/java/com/testainers/BasicAuthResource.java @@ -0,0 +1,102 @@ +package com.testainers; + +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.jboss.resteasy.spi.HttpRequest; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Eduardo Folly + */ +@Path("/basic-auth") +public class BasicAuthResource { + + @Inject + HttpRequest request; + + @GET + @HEAD + @Path("/{user}/{pass}") + @APIResponses({ + @APIResponse(responseCode = "200"), + @APIResponse(responseCode = "401"), + @APIResponse(responseCode = "500"), + }) + @Produces(MediaType.APPLICATION_JSON) + public Response withoutBody( + @HeaderParam(HttpHeaders.AUTHORIZATION) String auth, + @PathParam("user") String user, + @PathParam("pass") String pass + ) { + return getResponse(auth, user, pass, null); + } + + @POST + @PUT + @PATCH + @DELETE + @Path("/{user}/{pass}") + @APIResponses({ + @APIResponse(responseCode = "200"), + @APIResponse(responseCode = "401"), + @APIResponse(responseCode = "500"), + }) + @Produces(MediaType.APPLICATION_JSON) + public Response withBody( + @HeaderParam(HttpHeaders.AUTHORIZATION) String auth, + @PathParam("user") String user, + @PathParam("pass") String pass, + Object body) { + return getResponse(auth, user, pass, body); + } + + private Response getResponse(String auth, String user, String pass, + Object body) { + ResponseBody responseBody = new ResponseBody(request, body); + int code = 401; + + Map bodyMap = new HashMap<>(); + bodyMap.put("auth", false); + bodyMap.put("user", user); + bodyMap.put("pass", pass); + bodyMap.put("message", "Unauthorized."); + + if (body != null) { + bodyMap.put("body", body); + } + + if (auth == null || auth.isBlank()) { + code = 500; + bodyMap.put("message", "Authorization header not present."); + } else { + String encoded = Base64 + .getEncoder() + .encodeToString((user + ":" + pass) + .getBytes(StandardCharsets.UTF_8)); + + boolean ok = auth.equals("Basic " + encoded); + + bodyMap.put("auth", ok); + + if (ok) { + code = 200; + bodyMap.put("message", "Success."); + } + + } + + responseBody.body = bodyMap; + + return Response.status(code).entity(responseBody).build(); + } + +} diff --git a/src/main/java/com/testainers/LengthResource.java b/src/main/java/com/testainers/LengthResource.java index a196fad..ff4b053 100644 --- a/src/main/java/com/testainers/LengthResource.java +++ b/src/main/java/com/testainers/LengthResource.java @@ -20,6 +20,7 @@ public class LengthResource { @GET + @HEAD @POST @PUT @PATCH diff --git a/src/main/java/com/testainers/MethodsResource.java b/src/main/java/com/testainers/MethodsResource.java index 385252f..32516fb 100644 --- a/src/main/java/com/testainers/MethodsResource.java +++ b/src/main/java/com/testainers/MethodsResource.java @@ -17,9 +17,10 @@ public class MethodsResource { HttpRequest request; @GET + @HEAD @APIResponses({@APIResponse(responseCode = "200")}) @Produces(MediaType.APPLICATION_JSON) - public ResponseBody get() { + public ResponseBody withoutBody() { return new ResponseBody(request, null); } @@ -29,7 +30,7 @@ public ResponseBody get() { @DELETE @APIResponses({@APIResponse(responseCode = "200")}) @Produces(MediaType.APPLICATION_JSON) - public ResponseBody others(Object body) { + public ResponseBody withBody(Object body) { return new ResponseBody(request, body); } diff --git a/src/main/java/com/testainers/RedirectResource.java b/src/main/java/com/testainers/RedirectResource.java index 873b23e..79dec72 100644 --- a/src/main/java/com/testainers/RedirectResource.java +++ b/src/main/java/com/testainers/RedirectResource.java @@ -18,6 +18,7 @@ public class RedirectResource { @GET + @HEAD @POST @PUT @PATCH diff --git a/src/main/java/com/testainers/StatusResource.java b/src/main/java/com/testainers/StatusResource.java index d521706..3846543 100644 --- a/src/main/java/com/testainers/StatusResource.java +++ b/src/main/java/com/testainers/StatusResource.java @@ -18,6 +18,7 @@ public class StatusResource { HttpRequest request; @GET + @HEAD @Produces(MediaType.APPLICATION_JSON) public Response get( @Parameter(description = "Code must be between 200 and 599. " + @@ -40,7 +41,8 @@ public Response others( "are not supported.", schema = @Schema(minimum = "200", maximum = "599") ) - @PathParam("code") Integer code, Object body) { + @PathParam("code") Integer code, + Object body) { return getResponse(code, body); } diff --git a/src/test/java/com/testainers/BaseTest.java b/src/test/java/com/testainers/BaseTest.java new file mode 100644 index 0000000..3d3adc5 --- /dev/null +++ b/src/test/java/com/testainers/BaseTest.java @@ -0,0 +1,50 @@ +package com.testainers; + +import io.restassured.http.ContentType; +import io.restassured.specification.RequestSpecification; + +import java.util.List; +import java.util.Map; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.Matchers.*; + +/** + * @author Eduardo Folly + */ +public class BaseTest { + + protected static final Map HEADERS = + Map.of("test-header", List.of("test-header-value"), + "test-header-2", List.of("test-header-value-2")); + + protected static final Map QUERY_PARAMS = + Map.of("test-qs", List.of("test-qs")); + + protected static final Map BODY = Map + .of("test_string", "test", + "test_int", 1, + "test_boolean", true); + + protected RequestSpecification base() { + return given().when() + .headers(HEADERS) + .queryParams(QUERY_PARAMS); + + } + + protected RequestSpecification json() { + return base() + .contentType(ContentType.JSON) + .body(BODY); + } + + protected Object[] bodyMatchers(String method) { + return new Object[]{"method", is(method), + "queryParameters", is(QUERY_PARAMS), + "headers", aMapWithSize(greaterThanOrEqualTo(HEADERS.size())), + "headers", hasEntry(in(HEADERS.keySet()), in(HEADERS.values())), + }; + } + +} diff --git a/src/test/java/com/testainers/BasicAuthTest.java b/src/test/java/com/testainers/BasicAuthTest.java new file mode 100644 index 0000000..c1f828f --- /dev/null +++ b/src/test/java/com/testainers/BasicAuthTest.java @@ -0,0 +1,330 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static org.hamcrest.Matchers.*; + +/** + * @author Eduardo Folly + */ +@QuarkusTest +public class BasicAuthTest extends BaseTest { + + private static final String user = "test"; + private static final String pass = "test-pass0"; + + @Test + public void getNoHeader() { + base().get("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(500) + .body("body", + is(Map.of("auth", false, + "user", user, + "pass", pass, + "message", "Authorization header not present.")), + bodyMatchers("GET")); + } + + @Test + public void getSuccess() { + base().auth().preemptive().basic(user, pass) + .get("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(200) + .body("body", is(Map.of("auth", true, + "user", user, + "pass", pass, + "message", "Success.")), + bodyMatchers("GET")); + } + + @Test + public void getUserFail() { + base().auth().preemptive().basic(user, pass) + .get("/basic-auth/{user}Fail/{pass}", user, pass) + .then() + .statusCode(401) + .body("body", is(Map.of("auth", false, + "user", user + "Fail", + "pass", pass, + "message", "Unauthorized.")), + bodyMatchers("GET")); + } + + @Test + public void getPassFail() { + base().auth().preemptive().basic(user, pass) + .get("/basic-auth/{user}/{pass}Fail", user, pass) + .then() + .statusCode(401) + .body("body", is(Map.of("auth", false, + "user", user, + "pass", pass + "Fail", + "message", "Unauthorized.")), + bodyMatchers("GET")); + } + + @Test + public void headNoHeader() { + base().head("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(500) + .body(is("")); + } + + @Test + public void headSuccess() { + base().auth().preemptive().basic(user, pass) + .head("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(200) + .body(is("")); + } + + @Test + public void headUserFail() { + base().auth().preemptive().basic(user, pass) + .head("/basic-auth/{user}Fail/{pass}", user, pass) + .then() + .statusCode(401) + .body(is("")); + } + + @Test + public void headPassFail() { + base().auth().preemptive().basic(user, pass) + .head("/basic-auth/{user}/{pass}Fail", user, pass) + .then() + .statusCode(401) + .body(is("")); + } + + @Test + public void postNoHeader() { + json().post("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(500) + .body("body", + is(Map.of("auth", false, + "user", user, + "pass", pass, + "body", BODY, + "message", "Authorization header not present.")), + bodyMatchers("POST")); + } + + @Test + public void postSuccess() { + json().auth().preemptive().basic(user, pass) + .post("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(200) + .body("body", is(Map.of("auth", true, + "user", user, + "pass", pass, + "body", BODY, + "message", "Success.")), + bodyMatchers("POST")); + } + + @Test + public void postUserFail() { + json().auth().preemptive().basic(user, pass) + .post("/basic-auth/{user}Fail/{pass}", user, pass) + .then() + .statusCode(401) + .body("body", is(Map.of("auth", false, + "user", user + "Fail", + "pass", pass, + "body", BODY, + "message", "Unauthorized.")), + bodyMatchers("POST")); + } + + @Test + public void postPassFail() { + json().auth().preemptive().basic(user, pass) + .post("/basic-auth/{user}/{pass}Fail", user, pass) + .then() + .statusCode(401) + .body("body", is(Map.of("auth", false, + "user", user, + "pass", pass + "Fail", + "body", BODY, + "message", "Unauthorized.")), + bodyMatchers("POST")); + } + + @Test + public void putNoHeader() { + json().put("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(500) + .body("body", + is(Map.of("auth", false, + "user", user, + "pass", pass, + "body", BODY, + "message", "Authorization header not present.")), + bodyMatchers("PUT")); + } + + @Test + public void putSuccess() { + json().auth().preemptive().basic(user, pass) + .put("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(200) + .body("body", is(Map.of("auth", true, + "user", user, + "pass", pass, + "body", BODY, + "message", "Success.")), + bodyMatchers("PUT")); + } + + @Test + public void putUserFail() { + json().auth().preemptive().basic(user, pass) + .put("/basic-auth/{user}Fail/{pass}", user, pass) + .then() + .statusCode(401) + .body("body", is(Map.of("auth", false, + "user", user + "Fail", + "pass", pass, + "body", BODY, + "message", "Unauthorized.")), + bodyMatchers("PUT")); + } + + @Test + public void putPassFail() { + json().auth().preemptive().basic(user, pass) + .put("/basic-auth/{user}/{pass}Fail", user, pass) + .then() + .statusCode(401) + .body("body", is(Map.of("auth", false, + "user", user, + "pass", pass + "Fail", + "body", BODY, + "message", "Unauthorized.")), + bodyMatchers("PUT")); + } + + @Test + public void patchNoHeader() { + json().patch("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(500) + .body("body", + is(Map.of("auth", false, + "user", user, + "pass", pass, + "body", BODY, + "message", "Authorization header not present.")), + bodyMatchers("PATCH")); + } + + @Test + public void patchSuccess() { + json().auth().preemptive().basic(user, pass) + .patch("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(200) + .body("body", is(Map.of("auth", true, + "user", user, + "pass", pass, + "body", BODY, + "message", "Success.")), + bodyMatchers("PATCH")); + } + + @Test + public void patchUserFail() { + json().auth().preemptive().basic(user, pass) + .patch("/basic-auth/{user}Fail/{pass}", user, pass) + .then() + .statusCode(401) + .body("body", is(Map.of("auth", false, + "user", user + "Fail", + "pass", pass, + "body", BODY, + "message", "Unauthorized.")), + bodyMatchers("PATCH")); + } + + @Test + public void patchPassFail() { + json().auth().preemptive().basic(user, pass) + .patch("/basic-auth/{user}/{pass}Fail", user, pass) + .then() + .statusCode(401) + .body("body", is(Map.of("auth", false, + "user", user, + "pass", pass + "Fail", + "body", BODY, + "message", "Unauthorized.")), + bodyMatchers("PATCH")); + } + + @Test + public void deleteNoHeader() { + json().delete("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(500) + .body("body", + is(Map.of("auth", false, + "user", user, + "pass", pass, + "body", BODY, + "message", "Authorization header not present.")), + bodyMatchers("DELETE")); + } + + @Test + public void deleteSuccess() { + json().auth().preemptive().basic(user, pass) + .delete("/basic-auth/{user}/{pass}", user, pass) + .then() + .statusCode(200) + .body("body", is(Map.of("auth", true, + "user", user, + "pass", pass, + "body", BODY, + "message", "Success.")), + bodyMatchers("DELETE")); + } + + @Test + public void deleteUserFail() { + json().auth().preemptive().basic(user, pass) + .delete("/basic-auth/{user}Fail/{pass}", user, pass) + .then() + .statusCode(401) + .body("body", is(Map.of("auth", false, + "user", user + "Fail", + "pass", pass, + "body", BODY, + "message", "Unauthorized.")), + bodyMatchers("DELETE")); + } + + @Test + public void deletePassFail() { + json().auth().preemptive().basic(user, pass) + .delete("/basic-auth/{user}/{pass}Fail", user, pass) + .then() + .statusCode(401) + .body("body", is(Map.of("auth", false, + "user", user, + "pass", pass + "Fail", + "body", BODY, + "message", "Unauthorized.")), + bodyMatchers("DELETE")); + } + +} diff --git a/src/test/java/com/testainers/LengthResourceDeleteTest.java b/src/test/java/com/testainers/LengthResourceDeleteTest.java index 0d4a6f3..bab4983 100644 --- a/src/test/java/com/testainers/LengthResourceDeleteTest.java +++ b/src/test/java/com/testainers/LengthResourceDeleteTest.java @@ -6,8 +6,7 @@ import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly diff --git a/src/test/java/com/testainers/LengthResourceGetTest.java b/src/test/java/com/testainers/LengthResourceGetTest.java index 710b1d6..41f2a00 100644 --- a/src/test/java/com/testainers/LengthResourceGetTest.java +++ b/src/test/java/com/testainers/LengthResourceGetTest.java @@ -6,8 +6,7 @@ import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly diff --git a/src/test/java/com/testainers/LengthResourcePatchTest.java b/src/test/java/com/testainers/LengthResourcePatchTest.java index bf8608b..7579775 100644 --- a/src/test/java/com/testainers/LengthResourcePatchTest.java +++ b/src/test/java/com/testainers/LengthResourcePatchTest.java @@ -6,8 +6,7 @@ import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly diff --git a/src/test/java/com/testainers/LengthResourcePostTest.java b/src/test/java/com/testainers/LengthResourcePostTest.java index 75ca7a9..9801c70 100644 --- a/src/test/java/com/testainers/LengthResourcePostTest.java +++ b/src/test/java/com/testainers/LengthResourcePostTest.java @@ -6,8 +6,7 @@ import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly diff --git a/src/test/java/com/testainers/LengthResourcePutTest.java b/src/test/java/com/testainers/LengthResourcePutTest.java index f431233..0cc0c89 100644 --- a/src/test/java/com/testainers/LengthResourcePutTest.java +++ b/src/test/java/com/testainers/LengthResourcePutTest.java @@ -6,8 +6,7 @@ import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly diff --git a/src/test/java/com/testainers/MethodsResourceTest.java b/src/test/java/com/testainers/MethodsResourceTest.java index 33f01dc..b6533f8 100644 --- a/src/test/java/com/testainers/MethodsResourceTest.java +++ b/src/test/java/com/testainers/MethodsResourceTest.java @@ -1,111 +1,96 @@ package com.testainers; import io.quarkus.test.junit.QuarkusTest; -import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; -import java.util.List; -import java.util.Map; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly */ @QuarkusTest -public class MethodsResourceTest { - - private static final Map BODY = Map - .of("test_string", "test", - "test_int", 1, - "test_boolean", true); +public class MethodsResourceTest extends BaseTest { @Test public void testMethodsGet() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .get("/methods") - .then() - .statusCode(200) - .body("method", is("GET"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")) - ); + base().get("/methods") + .then() + .statusCode(200) + .body("method", is("GET"), + "queryParameters", is(QUERY_PARAMS), + "headers", + aMapWithSize(greaterThanOrEqualTo(HEADERS.size())), + "headers", + hasEntry(in(HEADERS.keySet()), in(HEADERS.values())) + ); + + } + + @Test + public void testMethodsHead() { + base().head("/methods") + .then() + .statusCode(200); } @Test public void testMethodsPost() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .post("/methods") - .then() - .statusCode(200) - .body("method", is("POST"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - ); + json().post("/methods") + .then() + .statusCode(200) + .body("method", is("POST"), + "queryParameters", is(QUERY_PARAMS), + "headers", + aMapWithSize(greaterThanOrEqualTo(HEADERS.size())), + "headers", + hasEntry(in(HEADERS.keySet()), in(HEADERS.values())), + "body", is(BODY) + ); } @Test public void testMethodsPut() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .put("/methods") - .then() - .statusCode(200) - .body("method", is("PUT"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - ); + json().put("/methods") + .then() + .statusCode(200) + .body("method", is("PUT"), + "queryParameters", is(QUERY_PARAMS), + "headers", + aMapWithSize(greaterThanOrEqualTo(HEADERS.size())), + "headers", + hasEntry(in(HEADERS.keySet()), in(HEADERS.values())), + "body", is(BODY) + ); } @Test public void testMethodsPatch() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .patch("/methods") - .then() - .statusCode(200) - .body("method", is("PATCH"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - ); + json().patch("/methods") + .then() + .statusCode(200) + .body("method", is("PATCH"), + "queryParameters", is(QUERY_PARAMS), + "headers", + aMapWithSize(greaterThanOrEqualTo(HEADERS.size())), + "headers", + hasEntry(in(HEADERS.keySet()), in(HEADERS.values())), + "body", is(BODY) + ); } @Test public void testMethodsDelete() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .delete("/methods") - .then() - .statusCode(200) - .body("method", is("DELETE"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - ); + json().delete("/methods") + .then() + .statusCode(200) + .body("method", is("DELETE"), + "queryParameters", is(QUERY_PARAMS), + "headers", + aMapWithSize(greaterThanOrEqualTo(HEADERS.size())), + "headers", + hasEntry(in(HEADERS.keySet()), in(HEADERS.values())), + "body", is(BODY) + ); } } \ No newline at end of file diff --git a/src/test/java/com/testainers/StatusResourceDeleteTest.java b/src/test/java/com/testainers/StatusResourceDeleteTest.java index a1a6b9a..c3ff83d 100644 --- a/src/test/java/com/testainers/StatusResourceDeleteTest.java +++ b/src/test/java/com/testainers/StatusResourceDeleteTest.java @@ -1,200 +1,130 @@ package com.testainers; import io.quarkus.test.junit.QuarkusTest; -import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; -import java.util.List; -import java.util.Map; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.containsStringIgnoringCase; -import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly */ @QuarkusTest -public class StatusResourceDeleteTest { - - private static final Map BODY = Map - .of("test_string", "test", - "test_int", 1, - "test_boolean", true); +public class StatusResourceDeleteTest extends BaseTest { @Test public void testStatusDeleteString() { - given().when() - .delete("/status/a") - .then() - .statusCode(404) - .statusLine(containsStringIgnoringCase("Not Found")); + json().delete("/status/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); } @Test public void testStatusDeleteDouble() { - given().when() - .delete("/status/1.8") - .then() - .statusCode(404) - .statusLine(containsStringIgnoringCase("Not Found")); + json().delete("/status/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); } @Test public void testStatusDeleteNegative() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/-1") - .then() - .statusCode(500) - .body("method", is("DELETE"), - "body", is("Unknown status code: -1") - ); + json().delete("/status/-1") + .then() + .statusCode(500) + .body("body", is("Unknown status code: -1"), + bodyMatchers("DELETE")); } @Test public void testStatusDelete0() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/0") - .then() - .statusCode(500) - .body("method", is("DELETE"), - "body", is("Unknown status code: 0") - ); + json().delete("/status/0") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 0"), + bodyMatchers("DELETE")); } @Test public void testStatusDelete99() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/99") - .then() - .statusCode(500) - .body("method", is("DELETE"), - "body", is("Unknown status code: 99") - ); + json().delete("/status/99") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 99"), + bodyMatchers("DELETE")); } @Test public void testStatusDelete100() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/100") - .then() - .statusCode(500) - .body("method", is("DELETE"), - "body", - is("Informational responses are not supported: 100") - ); + json().delete("/status/100") + .then() + .statusCode(500) + .body("body", + is("Informational responses are not supported: 100"), + bodyMatchers("DELETE")); } @Test public void testStatusDelete199() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/199") - .then() - .statusCode(500) - .body("method", is("DELETE"), - "body", - is("Informational responses are not supported: 199") - ); + json().delete("/status/199") + .then() + .statusCode(500) + .body("body", + is("Informational responses are not supported: 199"), + bodyMatchers("DELETE")); } @Test public void testStatusDelete200() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/200") - .then() - .statusCode(200) - .body("method", is("DELETE"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - ); + json().delete("/status/200") + .then() + .statusCode(200) + .body("body", is(BODY), + bodyMatchers("DELETE")); } @Test public void testStatusDelete204() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/204") - .then() - .statusCode(204) - .body(is("")); + json().delete("/status/204") + .then() + .statusCode(204) + .body(is("")); } @Test public void testStatusDelete205() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/205") - .then() - .statusCode(205) - .headers("content-length", "0") - .body(is("")); + json().delete("/status/205") + .then() + .statusCode(205) + .headers("content-length", "0") + .body(is("")); } @Test public void testStatusDelete304() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/304") - .then() - .statusCode(304) - .body(is("")); + json().delete("/status/304") + .then() + .statusCode(304) + .body(is("")); } @Test public void testStatusDelete599() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/599") - .then() - .statusCode(599) - .body("method", is("DELETE"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - - ); + json().delete("/status/599") + .then() + .statusCode(599) + .body("body", is(BODY), + bodyMatchers("DELETE") + ); } @Test public void testStatusDelete600() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .delete("/status/600") - .then() - .statusCode(500) - .body("method", is("DELETE"), - "body", is("Unknown status code: 600") - ); + json().delete("/status/600") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 600"), + bodyMatchers("DELETE")); } } diff --git a/src/test/java/com/testainers/StatusResourceGetTest.java b/src/test/java/com/testainers/StatusResourceGetTest.java index 17f473e..b7a3d46 100644 --- a/src/test/java/com/testainers/StatusResourceGetTest.java +++ b/src/test/java/com/testainers/StatusResourceGetTest.java @@ -4,166 +4,127 @@ import org.junit.jupiter.api.Test; -import java.util.List; -import java.util.Map; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly */ @QuarkusTest -public class StatusResourceGetTest { +public class StatusResourceGetTest extends BaseTest { @Test public void testStatusGetString() { - given().when() - .get("/status/a") - .then() - .statusCode(404) - .statusLine(containsStringIgnoringCase("Not Found")); + base().get("/status/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); } @Test public void testStatusGetDouble() { - given().when() - .get("/status/1.8") - .then() - .statusCode(404) - .statusLine(containsStringIgnoringCase("Not Found")); + base().get("/status/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); } @Test public void testStatusGetNegative() { - given().when() - .get("/status/-1") - .then() - .statusCode(500) - .body("method", is("GET"), - "body", is("Unknown status code: -1") - ); + base().get("/status/-1") + .then() + .statusCode(500) + .body("body", is("Unknown status code: -1"), + bodyMatchers("GET")); } @Test public void testStatusGet0() { - given().when() - .get("/status/0") - .then() - .statusCode(500) - .body("method", is("GET"), - "body", is("Unknown status code: 0") - ); + base().get("/status/0") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 0"), + bodyMatchers("GET")); } @Test public void testStatusGet99() { - given().when() - .get("/status/99") - .then() - .statusCode(500) - .body("method", is("GET"), - "body", is("Unknown status code: 99") - ); + base().get("/status/99") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 99"), + bodyMatchers("GET")); } @Test public void testStatusGet100() { - given().when() - .get("/status/100") - .then() - .statusCode(500) - .body("method", is("GET"), - "body", - is("Informational responses are not supported: 100") - ); + base().get("/status/100") + .then() + .statusCode(500) + .body("body", + is("Informational responses are not supported: 100"), + bodyMatchers("GET")); } @Test public void testStatusGet199() { - given().when() - .get("/status/199") - .then() - .statusCode(500) - .body("method", is("GET"), - "body", - is("Informational responses are not supported: 199") - ); + base().get("/status/199") + .then() + .statusCode(500) + .body("body", + is("Informational responses are not supported: 199"), + bodyMatchers("GET")); } @Test public void testStatusGet200() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .get("/status/200") - .then() - .statusCode(200) - .body("method", is("GET"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")) - ); + base().get("/status/200") + .then() + .statusCode(200) + .body("body", nullValue(), + bodyMatchers("GET")); } @Test public void testStatusGet204() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .get("/status/204") - .then() - .statusCode(204) - .body(is("")); + base().get("/status/204") + .then() + .statusCode(204) + .body(is("")); } @Test public void testStatusGet205() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .get("/status/205") - .then() - .statusCode(205) - .headers("content-length", "0") - .body(is("")); + base().get("/status/205") + .then() + .statusCode(205) + .headers("content-length", "0") + .body(is("")); } @Test public void testStatusGet304() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .get("/status/304") - .then() - .statusCode(304) - .body(is("")); + base().get("/status/304") + .then() + .statusCode(304) + .body(is("")); } @Test public void testStatusGet599() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .get("/status/599") - .then() - .statusCode(599) - .body("method", is("GET"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")) - ); + base().get("/status/599") + .then() + .statusCode(599) + .body("body", nullValue(), + bodyMatchers("GET")); } @Test public void testStatusGet600() { - given().when() - .get("/status/600") - .then() - .statusCode(500) - .body("method", is("GET"), - "body", is("Unknown status code: 600") - ); + base().get("/status/600") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 600"), + bodyMatchers("GET")); } } diff --git a/src/test/java/com/testainers/StatusResourceHeadTest.java b/src/test/java/com/testainers/StatusResourceHeadTest.java new file mode 100644 index 0000000..d8ccabd --- /dev/null +++ b/src/test/java/com/testainers/StatusResourceHeadTest.java @@ -0,0 +1,119 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.CoreMatchers.*; + +/** + * @author Eduardo Folly + */ +@QuarkusTest +public class StatusResourceHeadTest extends BaseTest { + + @Test + public void testStatusHeadString() { + base().head("/status/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testStatusHeadDouble() { + base().head("/status/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testStatusHeadNegative() { + base().head("/status/-1") + .then() + .statusCode(500) + .body(is("")); + } + + @Test + public void testStatusHead0() { + base().head("/status/0") + .then() + .statusCode(500) + .body(is("")); + } + + @Test + public void testStatusHead99() { + base().head("/status/99") + .then() + .statusCode(500) + .body(is("")); + } + + @Test + public void testStatusHead100() { + base().head("/status/100") + .then() + .statusCode(500) + .body(is("")); + } + + @Test + public void testStatusHead199() { + base().head("/status/199") + .then() + .statusCode(500) + .body(is("")); + } + + @Test + public void testStatusHead200() { + base().head("/status/200") + .then() + .statusCode(200) + .body(is("")); + } + + @Test + public void testStatusHead204() { + base().head("/status/204") + .then() + .statusCode(204) + .body(is("")); + } + + @Test + public void testStatusHead205() { + base().head("/status/205") + .then() + .statusCode(205) + .headers("content-length", "0") + .body(is("")); + } + + @Test + public void testStatusHead304() { + base().head("/status/304") + .then() + .statusCode(304) + .body(is("")); + } + + @Test + public void testStatusHead599() { + base().head("/status/599") + .then() + .statusCode(599) + .body(is("")); + } + + @Test + public void testStatusHead600() { + base().head("/status/600") + .then() + .statusCode(500) + .body(is("")); + } + +} diff --git a/src/test/java/com/testainers/StatusResourcePatchTest.java b/src/test/java/com/testainers/StatusResourcePatchTest.java index a3c038a..1712cbc 100644 --- a/src/test/java/com/testainers/StatusResourcePatchTest.java +++ b/src/test/java/com/testainers/StatusResourcePatchTest.java @@ -1,200 +1,130 @@ package com.testainers; import io.quarkus.test.junit.QuarkusTest; -import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; -import java.util.List; -import java.util.Map; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.containsStringIgnoringCase; -import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly */ @QuarkusTest -public class StatusResourcePatchTest { - - private static final Map BODY = Map - .of("test_string", "test", - "test_int", 1, - "test_boolean", true); +public class StatusResourcePatchTest extends BaseTest { @Test public void testStatusPatchString() { - given().when() - .patch("/status/a") - .then() - .statusCode(404) - .statusLine(containsStringIgnoringCase("Not Found")); + base().patch("/status/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); } @Test public void testStatusPatchDouble() { - given().when() - .patch("/status/1.8") - .then() - .statusCode(404) - .statusLine(containsStringIgnoringCase("Not Found")); + base().patch("/status/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); } @Test public void testStatusPatchNegative() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/-1") - .then() - .statusCode(500) - .body("method", is("PATCH"), - "body", is("Unknown status code: -1") - ); + json().patch("/status/-1") + .then() + .statusCode(500) + .body("body", is("Unknown status code: -1"), + bodyMatchers("PATCH")) + ; } @Test public void testStatusPatch0() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/0") - .then() - .statusCode(500) - .body("method", is("PATCH"), - "body", is("Unknown status code: 0") - ); + json().patch("/status/0") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 0"), + bodyMatchers("PATCH")); } @Test public void testStatusPatch99() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/99") - .then() - .statusCode(500) - .body("method", is("PATCH"), - "body", is("Unknown status code: 99") - ); + json().patch("/status/99") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 99"), + bodyMatchers("PATCH")); } @Test public void testStatusPatch100() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/100") - .then() - .statusCode(500) - .body("method", is("PATCH"), - "body", - is("Informational responses are not supported: 100") - ); + json().patch("/status/100") + .then() + .statusCode(500) + .body("body", + is("Informational responses are not supported: 100"), + bodyMatchers("PATCH")); } @Test public void testStatusPatch199() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/199") - .then() - .statusCode(500) - .body("method", is("PATCH"), - "body", - is("Informational responses are not supported: 199") - ); + json().patch("/status/199") + .then() + .statusCode(500) + .body("body", + is("Informational responses are not supported: 199"), + bodyMatchers("PATCH")); } @Test public void testStatusPatch200() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/200") - .then() - .statusCode(200) - .body("method", is("PATCH"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - ); + json().patch("/status/200") + .then() + .statusCode(200) + .body("body", is(BODY), + bodyMatchers("PATCH")); } @Test public void testStatusPatch204() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/204") - .then() - .statusCode(204) - .body(is("")); + json().patch("/status/204") + .then() + .statusCode(204) + .body(is("")); } @Test public void testStatusPatch205() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/205") - .then() - .statusCode(205) - .headers("content-length", "0") - .body(is("")); + json().patch("/status/205") + .then() + .statusCode(205) + .headers("content-length", "0") + .body(is("")); } @Test public void testStatusPatch304() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/304") - .then() - .statusCode(304) - .body(is("")); + json().patch("/status/304") + .then() + .statusCode(304) + .body(is("")); } @Test public void testStatusPatch599() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/599") - .then() - .statusCode(599) - .body("method", is("PATCH"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - - ); + json().patch("/status/599") + .then() + .statusCode(599) + .body("body", is(BODY), + bodyMatchers("PATCH")); } @Test public void testStatusPatch600() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .patch("/status/600") - .then() - .statusCode(500) - .body("method", is("PATCH"), - "body", is("Unknown status code: 600") - ); + json().patch("/status/600") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 600"), + bodyMatchers("PATCH")); } } diff --git a/src/test/java/com/testainers/StatusResourcePostTest.java b/src/test/java/com/testainers/StatusResourcePostTest.java index ec9e8ac..fad0135 100644 --- a/src/test/java/com/testainers/StatusResourcePostTest.java +++ b/src/test/java/com/testainers/StatusResourcePostTest.java @@ -1,200 +1,129 @@ package com.testainers; import io.quarkus.test.junit.QuarkusTest; -import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; -import java.util.List; -import java.util.Map; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.containsStringIgnoringCase; -import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly */ @QuarkusTest -public class StatusResourcePostTest { - - private static final Map BODY = Map - .of("test_string", "test", - "test_int", 1, - "test_boolean", true); +public class StatusResourcePostTest extends BaseTest { @Test public void testStatusPostString() { - given().when() - .post("/status/a") - .then() - .statusCode(404) - .statusLine(containsStringIgnoringCase("Not Found")); + base().post("/status/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); } @Test public void testStatusPostDouble() { - given().when() - .post("/status/1.8") - .then() - .statusCode(404) - .statusLine(containsStringIgnoringCase("Not Found")); + base().post("/status/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); } @Test public void testStatusPostNegative() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/-1") - .then() - .statusCode(500) - .body("method", is("POST"), - "body", is("Unknown status code: -1") - ); + json().post("/status/-1") + .then() + .statusCode(500) + .body("body", is("Unknown status code: -1"), + bodyMatchers("POST")); } @Test public void testStatusPost0() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/0") - .then() - .statusCode(500) - .body("method", is("POST"), - "body", is("Unknown status code: 0") - ); + json().post("/status/0") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 0"), + bodyMatchers("POST")); } @Test public void testStatusPost99() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/99") - .then() - .statusCode(500) - .body("method", is("POST"), - "body", is("Unknown status code: 99") - ); + json().post("/status/99") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 99"), + bodyMatchers("POST")); } @Test public void testStatusPost100() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/100") - .then() - .statusCode(500) - .body("method", is("POST"), - "body", - is("Informational responses are not supported: 100") - ); + json().post("/status/100") + .then() + .statusCode(500) + .body("body", + is("Informational responses are not supported: 100"), + bodyMatchers("POST")); } @Test public void testStatusPost199() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/199") - .then() - .statusCode(500) - .body("method", is("POST"), - "body", - is("Informational responses are not supported: 199") - ); + json().post("/status/199") + .then() + .statusCode(500) + .body("body", + is("Informational responses are not supported: 199"), + bodyMatchers("POST")); } @Test public void testStatusPost200() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/200") - .then() - .statusCode(200) - .body("method", is("POST"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - ); + json().post("/status/200") + .then() + .statusCode(200) + .body("body", is(BODY), + bodyMatchers("POST")); } @Test public void testStatusPost204() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/204") - .then() - .statusCode(204) - .body(is("")); + json().post("/status/204") + .then() + .statusCode(204) + .body(is("")); } @Test public void testStatusPost205() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/205") - .then() - .statusCode(205) - .headers("content-length", "0") - .body(is("")); + json().post("/status/205") + .then() + .statusCode(205) + .headers("content-length", "0") + .body(is("")); } @Test public void testStatusPost304() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/304") - .then() - .statusCode(304) - .body(is("")); + json().post("/status/304") + .then() + .statusCode(304) + .body(is("")); } @Test public void testStatusPost599() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/599") - .then() - .statusCode(599) - .body("method", is("POST"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - - ); + json().post("/status/599") + .then() + .statusCode(599) + .body("body", is(BODY), + bodyMatchers("POST")); } @Test public void testStatusPost600() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .post("/status/600") - .then() - .statusCode(500) - .body("method", is("POST"), - "body", is("Unknown status code: 600") - ); + json().post("/status/600") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 600"), + bodyMatchers("POST")); } } diff --git a/src/test/java/com/testainers/StatusResourcePutTest.java b/src/test/java/com/testainers/StatusResourcePutTest.java index 355638f..3ff29bf 100644 --- a/src/test/java/com/testainers/StatusResourcePutTest.java +++ b/src/test/java/com/testainers/StatusResourcePutTest.java @@ -1,200 +1,129 @@ package com.testainers; import io.quarkus.test.junit.QuarkusTest; -import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; -import java.util.List; -import java.util.Map; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.containsStringIgnoringCase; -import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.*; /** * @author Eduardo Folly */ @QuarkusTest -public class StatusResourcePutTest { - - private static final Map BODY = Map - .of("test_string", "test", - "test_int", 1, - "test_boolean", true); +public class StatusResourcePutTest extends BaseTest { @Test public void testStatusPutString() { - given().when() - .put("/status/a") - .then() - .statusCode(404) - .statusLine(containsStringIgnoringCase("Not Found")); + base().put("/status/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); } @Test public void testStatusPutDouble() { - given().when() - .put("/status/1.8") - .then() - .statusCode(404) - .statusLine(containsStringIgnoringCase("Not Found")); + base().put("/status/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); } @Test public void testStatusPutNegative() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/-1") - .then() - .statusCode(500) - .body("method", is("PUT"), - "body", is("Unknown status code: -1") - ); + json().put("/status/-1") + .then() + .statusCode(500) + .body("body", is("Unknown status code: -1"), + bodyMatchers("PUT")); } @Test public void testStatusPut0() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/0") - .then() - .statusCode(500) - .body("method", is("PUT"), - "body", is("Unknown status code: 0") - ); + json().put("/status/0") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 0"), + bodyMatchers("PUT")); } @Test public void testStatusPut99() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/99") - .then() - .statusCode(500) - .body("method", is("PUT"), - "body", is("Unknown status code: 99") - ); + json().put("/status/99") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 99"), + bodyMatchers("PUT")); } @Test public void testStatusPut100() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/100") - .then() - .statusCode(500) - .body("method", is("PUT"), - "body", - is("Informational responses are not supported: 100") - ); + json().put("/status/100") + .then() + .statusCode(500) + .body("body", + is("Informational responses are not supported: 100"), + bodyMatchers("PUT")); } @Test public void testStatusPut199() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/199") - .then() - .statusCode(500) - .body("method", is("PUT"), - "body", - is("Informational responses are not supported: 199") - ); + json().put("/status/199") + .then() + .statusCode(500) + .body("body", + is("Informational responses are not supported: 199"), + bodyMatchers("PUT")); } @Test public void testStatusPut200() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/200") - .then() - .statusCode(200) - .body("method", is("PUT"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - ); + json().put("/status/200") + .then() + .statusCode(200) + .body("body", is(BODY), + bodyMatchers("PUT")); } @Test public void testStatusPut204() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/204") - .then() - .statusCode(204) - .body(is("")); + json().put("/status/204") + .then() + .statusCode(204) + .body(is("")); } @Test public void testStatusPut205() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/205") - .then() - .statusCode(205) - .headers("content-length", "0") - .body(is("")); + json().put("/status/205") + .then() + .statusCode(205) + .headers("content-length", "0") + .body(is("")); } @Test public void testStatusPut304() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/304") - .then() - .statusCode(304) - .body(is("")); + json().put("/status/304") + .then() + .statusCode(304) + .body(is("")); } @Test public void testStatusPut599() { - given().when() - .headers("test-header", "test-header-value") - .queryParam("test", "test") - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/599") - .then() - .statusCode(599) - .body("method", is("PUT"), - "queryParameters", - is(Map.of("test", List.of("test"))), - "headers.test-header", is(List.of("test-header-value")), - "body", is(BODY) - - ); + json().put("/status/599") + .then() + .statusCode(599) + .body("body", is(BODY), + bodyMatchers("PUT")); } @Test public void testStatusPut600() { - given().when() - .contentType(ContentType.JSON) - .body(BODY) - .put("/status/600") - .then() - .statusCode(500) - .body("method", is("PUT"), - "body", is("Unknown status code: 600") - ); + json().put("/status/600") + .then() + .statusCode(500) + .body("body", is("Unknown status code: 600"), + bodyMatchers("PUT")); } } From 5a31a2c1acad59ba74d09c5b1abdd36587c28c3d Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Mon, 24 Jul 2023 00:42:51 -0300 Subject: [PATCH 05/13] Fixing BasicAuthResource response codes. --- .../com/testainers/BasicAuthResource.java | 12 ++-- src/main/resources/application.properties | 1 + .../java/com/testainers/BasicAuthTest.java | 56 +++++++++---------- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/testainers/BasicAuthResource.java b/src/main/java/com/testainers/BasicAuthResource.java index 2486f7c..75bf970 100644 --- a/src/main/java/com/testainers/BasicAuthResource.java +++ b/src/main/java/com/testainers/BasicAuthResource.java @@ -1,5 +1,6 @@ package com.testainers; +import io.quarkus.security.Authenticated; import jakarta.inject.Inject; import jakarta.ws.rs.*; import jakarta.ws.rs.core.HttpHeaders; @@ -18,6 +19,7 @@ * @author Eduardo Folly */ @Path("/basic-auth") +@Authenticated public class BasicAuthResource { @Inject @@ -29,7 +31,7 @@ public class BasicAuthResource { @APIResponses({ @APIResponse(responseCode = "200"), @APIResponse(responseCode = "401"), - @APIResponse(responseCode = "500"), + @APIResponse(responseCode = "403"), }) @Produces(MediaType.APPLICATION_JSON) public Response withoutBody( @@ -48,7 +50,7 @@ public Response withoutBody( @APIResponses({ @APIResponse(responseCode = "200"), @APIResponse(responseCode = "401"), - @APIResponse(responseCode = "500"), + @APIResponse(responseCode = "403"), }) @Produces(MediaType.APPLICATION_JSON) public Response withBody( @@ -62,20 +64,20 @@ public Response withBody( private Response getResponse(String auth, String user, String pass, Object body) { ResponseBody responseBody = new ResponseBody(request, body); - int code = 401; + int code = 403; Map bodyMap = new HashMap<>(); bodyMap.put("auth", false); bodyMap.put("user", user); bodyMap.put("pass", pass); - bodyMap.put("message", "Unauthorized."); + bodyMap.put("message", "Forbidden."); if (body != null) { bodyMap.put("body", body); } if (auth == null || auth.isBlank()) { - code = 500; + code = 401; bodyMap.put("message", "Authorization header not present."); } else { String encoded = Base64 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f93345d..00efa12 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -21,6 +21,7 @@ quarkus.micrometer.export.prometheus.path=/metrics # quarkus.smallrye-openapi.path=/openapi quarkus.smallrye-openapi.info-title=httpbucket +quarkus.smallrye-openapi.security-scheme=basic # quarkus.swagger-ui.always-include=true quarkus.swagger-ui.path=/swagger-ui diff --git a/src/test/java/com/testainers/BasicAuthTest.java b/src/test/java/com/testainers/BasicAuthTest.java index c1f828f..64446ca 100644 --- a/src/test/java/com/testainers/BasicAuthTest.java +++ b/src/test/java/com/testainers/BasicAuthTest.java @@ -20,7 +20,7 @@ public class BasicAuthTest extends BaseTest { public void getNoHeader() { base().get("/basic-auth/{user}/{pass}", user, pass) .then() - .statusCode(500) + .statusCode(401) .body("body", is(Map.of("auth", false, "user", user, @@ -47,11 +47,11 @@ public void getUserFail() { base().auth().preemptive().basic(user, pass) .get("/basic-auth/{user}Fail/{pass}", user, pass) .then() - .statusCode(401) + .statusCode(403) .body("body", is(Map.of("auth", false, "user", user + "Fail", "pass", pass, - "message", "Unauthorized.")), + "message", "Forbidden.")), bodyMatchers("GET")); } @@ -60,11 +60,11 @@ public void getPassFail() { base().auth().preemptive().basic(user, pass) .get("/basic-auth/{user}/{pass}Fail", user, pass) .then() - .statusCode(401) + .statusCode(403) .body("body", is(Map.of("auth", false, "user", user, "pass", pass + "Fail", - "message", "Unauthorized.")), + "message", "Forbidden.")), bodyMatchers("GET")); } @@ -72,7 +72,7 @@ public void getPassFail() { public void headNoHeader() { base().head("/basic-auth/{user}/{pass}", user, pass) .then() - .statusCode(500) + .statusCode(401) .body(is("")); } @@ -90,7 +90,7 @@ public void headUserFail() { base().auth().preemptive().basic(user, pass) .head("/basic-auth/{user}Fail/{pass}", user, pass) .then() - .statusCode(401) + .statusCode(403) .body(is("")); } @@ -99,7 +99,7 @@ public void headPassFail() { base().auth().preemptive().basic(user, pass) .head("/basic-auth/{user}/{pass}Fail", user, pass) .then() - .statusCode(401) + .statusCode(403) .body(is("")); } @@ -107,7 +107,7 @@ public void headPassFail() { public void postNoHeader() { json().post("/basic-auth/{user}/{pass}", user, pass) .then() - .statusCode(500) + .statusCode(401) .body("body", is(Map.of("auth", false, "user", user, @@ -136,12 +136,12 @@ public void postUserFail() { json().auth().preemptive().basic(user, pass) .post("/basic-auth/{user}Fail/{pass}", user, pass) .then() - .statusCode(401) + .statusCode(403) .body("body", is(Map.of("auth", false, "user", user + "Fail", "pass", pass, "body", BODY, - "message", "Unauthorized.")), + "message", "Forbidden.")), bodyMatchers("POST")); } @@ -150,12 +150,12 @@ public void postPassFail() { json().auth().preemptive().basic(user, pass) .post("/basic-auth/{user}/{pass}Fail", user, pass) .then() - .statusCode(401) + .statusCode(403) .body("body", is(Map.of("auth", false, "user", user, "pass", pass + "Fail", "body", BODY, - "message", "Unauthorized.")), + "message", "Forbidden.")), bodyMatchers("POST")); } @@ -163,7 +163,7 @@ public void postPassFail() { public void putNoHeader() { json().put("/basic-auth/{user}/{pass}", user, pass) .then() - .statusCode(500) + .statusCode(401) .body("body", is(Map.of("auth", false, "user", user, @@ -192,12 +192,12 @@ public void putUserFail() { json().auth().preemptive().basic(user, pass) .put("/basic-auth/{user}Fail/{pass}", user, pass) .then() - .statusCode(401) + .statusCode(403) .body("body", is(Map.of("auth", false, "user", user + "Fail", "pass", pass, "body", BODY, - "message", "Unauthorized.")), + "message", "Forbidden.")), bodyMatchers("PUT")); } @@ -206,12 +206,12 @@ public void putPassFail() { json().auth().preemptive().basic(user, pass) .put("/basic-auth/{user}/{pass}Fail", user, pass) .then() - .statusCode(401) + .statusCode(403) .body("body", is(Map.of("auth", false, "user", user, "pass", pass + "Fail", "body", BODY, - "message", "Unauthorized.")), + "message", "Forbidden.")), bodyMatchers("PUT")); } @@ -219,7 +219,7 @@ public void putPassFail() { public void patchNoHeader() { json().patch("/basic-auth/{user}/{pass}", user, pass) .then() - .statusCode(500) + .statusCode(401) .body("body", is(Map.of("auth", false, "user", user, @@ -248,12 +248,12 @@ public void patchUserFail() { json().auth().preemptive().basic(user, pass) .patch("/basic-auth/{user}Fail/{pass}", user, pass) .then() - .statusCode(401) + .statusCode(403) .body("body", is(Map.of("auth", false, "user", user + "Fail", "pass", pass, "body", BODY, - "message", "Unauthorized.")), + "message", "Forbidden.")), bodyMatchers("PATCH")); } @@ -262,12 +262,12 @@ public void patchPassFail() { json().auth().preemptive().basic(user, pass) .patch("/basic-auth/{user}/{pass}Fail", user, pass) .then() - .statusCode(401) + .statusCode(403) .body("body", is(Map.of("auth", false, "user", user, "pass", pass + "Fail", "body", BODY, - "message", "Unauthorized.")), + "message", "Forbidden.")), bodyMatchers("PATCH")); } @@ -275,7 +275,7 @@ public void patchPassFail() { public void deleteNoHeader() { json().delete("/basic-auth/{user}/{pass}", user, pass) .then() - .statusCode(500) + .statusCode(401) .body("body", is(Map.of("auth", false, "user", user, @@ -304,12 +304,12 @@ public void deleteUserFail() { json().auth().preemptive().basic(user, pass) .delete("/basic-auth/{user}Fail/{pass}", user, pass) .then() - .statusCode(401) + .statusCode(403) .body("body", is(Map.of("auth", false, "user", user + "Fail", "pass", pass, "body", BODY, - "message", "Unauthorized.")), + "message", "Forbidden.")), bodyMatchers("DELETE")); } @@ -318,12 +318,12 @@ public void deletePassFail() { json().auth().preemptive().basic(user, pass) .delete("/basic-auth/{user}/{pass}Fail", user, pass) .then() - .statusCode(401) + .statusCode(403) .body("body", is(Map.of("auth", false, "user", user, "pass", pass + "Fail", "body", BODY, - "message", "Unauthorized.")), + "message", "Forbidden.")), bodyMatchers("DELETE")); } From b90985cc723a82280bf8c288da46bcd5a0b0905d Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Mon, 24 Jul 2023 00:43:41 -0300 Subject: [PATCH 06/13] Version bump 0.0.5. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5289c04..bf2f645 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ dependencies { } group 'com.testainers' -version '0.0.4' +version '0.0.5' java { sourceCompatibility = JavaVersion.VERSION_17 From 2a06d41e5205ed8a332be16e032cf65167a424aa Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Mon, 24 Jul 2023 17:56:33 -0300 Subject: [PATCH 07/13] Creating delay resource. --- gradle.properties | 4 +- .../java/com/testainers/DelayResource.java | 87 +++++++++++++++++++ .../java/com/testainers/LengthResource.java | 3 +- ...chTestIT.java => BasicAuthResourceIT.java} | 2 +- ...TestIT.java => DelayResourceDeleteIT.java} | 2 +- .../com/testainers/DelayResourceGetIT.java | 8 ++ .../com/testainers/DelayResourceHeadIT.java | 8 ++ .../com/testainers/DelayResourcePatchIT.java | 8 ++ .../com/testainers/DelayResourcePostIT.java | 8 ++ .../com/testainers/DelayResourcePutIT.java | 8 ++ ...estIT.java => LengthResourceDeleteIT.java} | 2 +- .../com/testainers/LengthResourceGetIT.java | 8 ++ ...TestIT.java => LengthResourcePatchIT.java} | 2 +- .../com/testainers/LengthResourcePostIT.java | 8 ++ .../com/testainers/LengthResourcePutIT.java | 8 ++ .../com/testainers/MethodsResourceIT.java | 2 +- .../testainers/StatusResourceDeleteIT.java | 2 +- .../com/testainers/StatusResourceGetIT.java | 2 +- ...eTestIT.java => StatusResourceHeadIT.java} | 2 +- .../com/testainers/StatusResourcePatchIT.java | 2 +- .../com/testainers/StatusResourcePostIT.java | 2 +- .../com/testainers/StatusResourcePutIT.java | 2 +- .../{BaseTest.java => BaseResourceTest.java} | 2 +- ...thTest.java => BasicAuthResourceTest.java} | 2 +- .../testainers/DelayResourceDeleteTest.java | 84 ++++++++++++++++++ .../com/testainers/DelayResourceGetTest.java | 83 ++++++++++++++++++ .../com/testainers/DelayResourceHeadTest.java | 79 +++++++++++++++++ .../testainers/DelayResourcePatchTest.java | 84 ++++++++++++++++++ .../com/testainers/DelayResourcePostTest.java | 84 ++++++++++++++++++ .../com/testainers/DelayResourcePutTest.java | 84 ++++++++++++++++++ ....java => MethodsResourceResourceTest.java} | 2 +- ... => StatusResourceDeleteResourceTest.java} | 2 +- ...ava => StatusResourceGetResourceTest.java} | 10 ++- ...va => StatusResourceHeadResourceTest.java} | 2 +- ...a => StatusResourcePatchResourceTest.java} | 2 +- ...va => StatusResourcePostResourceTest.java} | 2 +- ...ava => StatusResourcePutResourceTest.java} | 2 +- 37 files changed, 681 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/testainers/DelayResource.java rename src/native-test/java/com/testainers/{LengthResourcePatchTestIT.java => BasicAuthResourceIT.java} (68%) rename src/native-test/java/com/testainers/{LengthResourcePutTestIT.java => DelayResourceDeleteIT.java} (71%) create mode 100644 src/native-test/java/com/testainers/DelayResourceGetIT.java create mode 100644 src/native-test/java/com/testainers/DelayResourceHeadIT.java create mode 100644 src/native-test/java/com/testainers/DelayResourcePatchIT.java create mode 100644 src/native-test/java/com/testainers/DelayResourcePostIT.java create mode 100644 src/native-test/java/com/testainers/DelayResourcePutIT.java rename src/native-test/java/com/testainers/{LengthResourcePostTestIT.java => LengthResourceDeleteIT.java} (71%) create mode 100644 src/native-test/java/com/testainers/LengthResourceGetIT.java rename src/native-test/java/com/testainers/{LengthResourceGetTestIT.java => LengthResourcePatchIT.java} (71%) create mode 100644 src/native-test/java/com/testainers/LengthResourcePostIT.java create mode 100644 src/native-test/java/com/testainers/LengthResourcePutIT.java rename src/native-test/java/com/testainers/{LengthResourceDeleteTestIT.java => StatusResourceHeadIT.java} (67%) rename src/test/java/com/testainers/{BaseTest.java => BaseResourceTest.java} (97%) rename src/test/java/com/testainers/{BasicAuthTest.java => BasicAuthResourceTest.java} (99%) create mode 100644 src/test/java/com/testainers/DelayResourceDeleteTest.java create mode 100644 src/test/java/com/testainers/DelayResourceGetTest.java create mode 100644 src/test/java/com/testainers/DelayResourceHeadTest.java create mode 100644 src/test/java/com/testainers/DelayResourcePatchTest.java create mode 100644 src/test/java/com/testainers/DelayResourcePostTest.java create mode 100644 src/test/java/com/testainers/DelayResourcePutTest.java rename src/test/java/com/testainers/{MethodsResourceTest.java => MethodsResourceResourceTest.java} (97%) rename src/test/java/com/testainers/{StatusResourceDeleteTest.java => StatusResourceDeleteResourceTest.java} (97%) rename src/test/java/com/testainers/{StatusResourceGetTest.java => StatusResourceGetResourceTest.java} (91%) rename src/test/java/com/testainers/{StatusResourceHeadTest.java => StatusResourceHeadResourceTest.java} (97%) rename src/test/java/com/testainers/{StatusResourcePatchTest.java => StatusResourcePatchResourceTest.java} (97%) rename src/test/java/com/testainers/{StatusResourcePostTest.java => StatusResourcePostResourceTest.java} (97%) rename src/test/java/com/testainers/{StatusResourcePutTest.java => StatusResourcePutResourceTest.java} (97%) diff --git a/gradle.properties b/gradle.properties index a712916..008ce78 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ #Gradle properties quarkusPluginId=io.quarkus -quarkusPluginVersion=3.2.1.Final +quarkusPluginVersion=3.2.2.Final quarkusPlatformGroupId=io.quarkus.platform quarkusPlatformArtifactId=quarkus-bom -quarkusPlatformVersion=3.2.1.Final +quarkusPlatformVersion=3.2.2.Final diff --git a/src/main/java/com/testainers/DelayResource.java b/src/main/java/com/testainers/DelayResource.java new file mode 100644 index 0000000..6d767b4 --- /dev/null +++ b/src/main/java/com/testainers/DelayResource.java @@ -0,0 +1,87 @@ +package com.testainers; + +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.eclipse.microprofile.openapi.annotations.parameters.Parameter; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.jboss.resteasy.spi.HttpRequest; + +/** + * @author Eduardo Folly + */ +@Path("/delay") +public class DelayResource { + + @Inject + HttpRequest request; + + @GET + @HEAD + @Path("/{delay}") + @APIResponses({ + @APIResponse(responseCode = "200"), + @APIResponse(responseCode = "400"), + @APIResponse(responseCode = "500"), + }) + @Produces(MediaType.APPLICATION_JSON) + public Response withoutBody( + @Parameter(description = "Delay must be between 0 and 10 seconds.", + schema = @Schema(minimum = "1", maximum = "10", + defaultValue = "10" + ) + ) + @PathParam("delay") int delay + ) { + return getResponse(delay, null); + } + + @POST + @PUT + @PATCH + @DELETE + @Path("/{delay}") + @APIResponses({ + @APIResponse(responseCode = "200"), + @APIResponse(responseCode = "400"), + @APIResponse(responseCode = "500"), + }) + @Produces(MediaType.APPLICATION_JSON) + public Response withBody( + @Parameter(description = "Delay must be between 0 and 10 seconds.", + schema = @Schema(minimum = "1", maximum = "10", + defaultValue = "10" + ) + ) + @PathParam("delay") int delay, + Object body + ) { + return getResponse(delay, body); + } + + private Response getResponse(int delay, Object body) { + ResponseBody responseBody = new ResponseBody(request, body); + int code = 200; + + if (delay < 0 || delay > 10) { + code = 400; + responseBody.body = String.format("Invalid delay: %d", delay); + } else { + try { + Thread.sleep(delay * 1000L); + responseBody.body = + String.format("Slept for %d seconds.", delay); + } catch (InterruptedException e) { + code = 500; + responseBody.body = + String.format("Interrupted: %s", e.getMessage()); + } + } + + return Response.status(code).entity(responseBody).build(); + } + +} diff --git a/src/main/java/com/testainers/LengthResource.java b/src/main/java/com/testainers/LengthResource.java index ff4b053..f12f99c 100644 --- a/src/main/java/com/testainers/LengthResource.java +++ b/src/main/java/com/testainers/LengthResource.java @@ -40,7 +40,8 @@ public Response length( defaultValue = "10" ) ) - @PathParam("size") int size) { + @PathParam("size") int size + ) { if (size < 1 || size > 2048) { return Response .status(500) diff --git a/src/native-test/java/com/testainers/LengthResourcePatchTestIT.java b/src/native-test/java/com/testainers/BasicAuthResourceIT.java similarity index 68% rename from src/native-test/java/com/testainers/LengthResourcePatchTestIT.java rename to src/native-test/java/com/testainers/BasicAuthResourceIT.java index c5060e5..11ce8f9 100644 --- a/src/native-test/java/com/testainers/LengthResourcePatchTestIT.java +++ b/src/native-test/java/com/testainers/BasicAuthResourceIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class LengthResourcePatchTestIT extends LengthResourcePatchTest { +public class BasicAuthResourceIT extends BasicAuthResourceTest { // Execute the same tests but in packaged mode. } diff --git a/src/native-test/java/com/testainers/LengthResourcePutTestIT.java b/src/native-test/java/com/testainers/DelayResourceDeleteIT.java similarity index 71% rename from src/native-test/java/com/testainers/LengthResourcePutTestIT.java rename to src/native-test/java/com/testainers/DelayResourceDeleteIT.java index e1c007a..99c3713 100644 --- a/src/native-test/java/com/testainers/LengthResourcePutTestIT.java +++ b/src/native-test/java/com/testainers/DelayResourceDeleteIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class LengthResourcePutTestIT extends LengthResourcePutTest { +public class DelayResourceDeleteIT extends DelayResourceDeleteTest { // Execute the same tests but in packaged mode. } diff --git a/src/native-test/java/com/testainers/DelayResourceGetIT.java b/src/native-test/java/com/testainers/DelayResourceGetIT.java new file mode 100644 index 0000000..add151e --- /dev/null +++ b/src/native-test/java/com/testainers/DelayResourceGetIT.java @@ -0,0 +1,8 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +public class DelayResourceGetIT extends DelayResourceGetTest { + // Execute the same tests but in packaged mode. +} diff --git a/src/native-test/java/com/testainers/DelayResourceHeadIT.java b/src/native-test/java/com/testainers/DelayResourceHeadIT.java new file mode 100644 index 0000000..3a03348 --- /dev/null +++ b/src/native-test/java/com/testainers/DelayResourceHeadIT.java @@ -0,0 +1,8 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +public class DelayResourceHeadIT extends DelayResourceHeadTest { + // Execute the same tests but in packaged mode. +} diff --git a/src/native-test/java/com/testainers/DelayResourcePatchIT.java b/src/native-test/java/com/testainers/DelayResourcePatchIT.java new file mode 100644 index 0000000..6c85dd1 --- /dev/null +++ b/src/native-test/java/com/testainers/DelayResourcePatchIT.java @@ -0,0 +1,8 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +public class DelayResourcePatchIT extends DelayResourcePatchTest { + // Execute the same tests but in packaged mode. +} diff --git a/src/native-test/java/com/testainers/DelayResourcePostIT.java b/src/native-test/java/com/testainers/DelayResourcePostIT.java new file mode 100644 index 0000000..b6d82f5 --- /dev/null +++ b/src/native-test/java/com/testainers/DelayResourcePostIT.java @@ -0,0 +1,8 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +public class DelayResourcePostIT extends DelayResourcePostTest { + // Execute the same tests but in packaged mode. +} diff --git a/src/native-test/java/com/testainers/DelayResourcePutIT.java b/src/native-test/java/com/testainers/DelayResourcePutIT.java new file mode 100644 index 0000000..68dbbec --- /dev/null +++ b/src/native-test/java/com/testainers/DelayResourcePutIT.java @@ -0,0 +1,8 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +public class DelayResourcePutIT extends DelayResourcePutTest { + // Execute the same tests but in packaged mode. +} diff --git a/src/native-test/java/com/testainers/LengthResourcePostTestIT.java b/src/native-test/java/com/testainers/LengthResourceDeleteIT.java similarity index 71% rename from src/native-test/java/com/testainers/LengthResourcePostTestIT.java rename to src/native-test/java/com/testainers/LengthResourceDeleteIT.java index 6cc2b98..837b994 100644 --- a/src/native-test/java/com/testainers/LengthResourcePostTestIT.java +++ b/src/native-test/java/com/testainers/LengthResourceDeleteIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class LengthResourcePostTestIT extends LengthResourcePostTest { +public class LengthResourceDeleteIT extends LengthResourceDeleteTest { // Execute the same tests but in packaged mode. } diff --git a/src/native-test/java/com/testainers/LengthResourceGetIT.java b/src/native-test/java/com/testainers/LengthResourceGetIT.java new file mode 100644 index 0000000..b59a268 --- /dev/null +++ b/src/native-test/java/com/testainers/LengthResourceGetIT.java @@ -0,0 +1,8 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +public class LengthResourceGetIT extends LengthResourceGetTest { + // Execute the same tests but in packaged mode. +} diff --git a/src/native-test/java/com/testainers/LengthResourceGetTestIT.java b/src/native-test/java/com/testainers/LengthResourcePatchIT.java similarity index 71% rename from src/native-test/java/com/testainers/LengthResourceGetTestIT.java rename to src/native-test/java/com/testainers/LengthResourcePatchIT.java index 5c69526..e8c9909 100644 --- a/src/native-test/java/com/testainers/LengthResourceGetTestIT.java +++ b/src/native-test/java/com/testainers/LengthResourcePatchIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class LengthResourceGetTestIT extends LengthResourceGetTest { +public class LengthResourcePatchIT extends LengthResourcePatchTest { // Execute the same tests but in packaged mode. } diff --git a/src/native-test/java/com/testainers/LengthResourcePostIT.java b/src/native-test/java/com/testainers/LengthResourcePostIT.java new file mode 100644 index 0000000..7566576 --- /dev/null +++ b/src/native-test/java/com/testainers/LengthResourcePostIT.java @@ -0,0 +1,8 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +public class LengthResourcePostIT extends LengthResourcePostTest { + // Execute the same tests but in packaged mode. +} diff --git a/src/native-test/java/com/testainers/LengthResourcePutIT.java b/src/native-test/java/com/testainers/LengthResourcePutIT.java new file mode 100644 index 0000000..a5e4069 --- /dev/null +++ b/src/native-test/java/com/testainers/LengthResourcePutIT.java @@ -0,0 +1,8 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +public class LengthResourcePutIT extends LengthResourcePutTest { + // Execute the same tests but in packaged mode. +} diff --git a/src/native-test/java/com/testainers/MethodsResourceIT.java b/src/native-test/java/com/testainers/MethodsResourceIT.java index b3afef6..262c0d0 100644 --- a/src/native-test/java/com/testainers/MethodsResourceIT.java +++ b/src/native-test/java/com/testainers/MethodsResourceIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class MethodsResourceIT extends MethodsResourceTest { +public class MethodsResourceIT extends MethodsResourceResourceTest { // Execute the same tests but in packaged mode. } diff --git a/src/native-test/java/com/testainers/StatusResourceDeleteIT.java b/src/native-test/java/com/testainers/StatusResourceDeleteIT.java index 38f9472..e819a15 100644 --- a/src/native-test/java/com/testainers/StatusResourceDeleteIT.java +++ b/src/native-test/java/com/testainers/StatusResourceDeleteIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class StatusResourceDeleteIT extends StatusResourceDeleteTest { +public class StatusResourceDeleteIT extends StatusResourceDeleteResourceTest { // Execute the same tests but in packaged mode. } diff --git a/src/native-test/java/com/testainers/StatusResourceGetIT.java b/src/native-test/java/com/testainers/StatusResourceGetIT.java index 7c5381c..db3e29f 100644 --- a/src/native-test/java/com/testainers/StatusResourceGetIT.java +++ b/src/native-test/java/com/testainers/StatusResourceGetIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class StatusResourceGetIT extends StatusResourceGetTest { +public class StatusResourceGetIT extends StatusResourceGetResourceTest { // Execute the same tests but in packaged mode. } diff --git a/src/native-test/java/com/testainers/LengthResourceDeleteTestIT.java b/src/native-test/java/com/testainers/StatusResourceHeadIT.java similarity index 67% rename from src/native-test/java/com/testainers/LengthResourceDeleteTestIT.java rename to src/native-test/java/com/testainers/StatusResourceHeadIT.java index c14a2a8..48c5a1b 100644 --- a/src/native-test/java/com/testainers/LengthResourceDeleteTestIT.java +++ b/src/native-test/java/com/testainers/StatusResourceHeadIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class LengthResourceDeleteTestIT extends LengthResourceDeleteTest { +public class StatusResourceHeadIT extends StatusResourceHeadResourceTest { // Execute the same tests but in packaged mode. } diff --git a/src/native-test/java/com/testainers/StatusResourcePatchIT.java b/src/native-test/java/com/testainers/StatusResourcePatchIT.java index 4c6dc6e..7c38797 100644 --- a/src/native-test/java/com/testainers/StatusResourcePatchIT.java +++ b/src/native-test/java/com/testainers/StatusResourcePatchIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class StatusResourcePatchIT extends StatusResourcePatchTest { +public class StatusResourcePatchIT extends StatusResourcePatchResourceTest { // Execute the same tests but in packaged mode. } diff --git a/src/native-test/java/com/testainers/StatusResourcePostIT.java b/src/native-test/java/com/testainers/StatusResourcePostIT.java index 475f076..72d5518 100644 --- a/src/native-test/java/com/testainers/StatusResourcePostIT.java +++ b/src/native-test/java/com/testainers/StatusResourcePostIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class StatusResourcePostIT extends StatusResourcePostTest { +public class StatusResourcePostIT extends StatusResourcePostResourceTest { // Execute the same tests but in packaged mode. } diff --git a/src/native-test/java/com/testainers/StatusResourcePutIT.java b/src/native-test/java/com/testainers/StatusResourcePutIT.java index 6bf788c..cf24588 100644 --- a/src/native-test/java/com/testainers/StatusResourcePutIT.java +++ b/src/native-test/java/com/testainers/StatusResourcePutIT.java @@ -3,6 +3,6 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -public class StatusResourcePutIT extends StatusResourcePutTest { +public class StatusResourcePutIT extends StatusResourcePutResourceTest { // Execute the same tests but in packaged mode. } diff --git a/src/test/java/com/testainers/BaseTest.java b/src/test/java/com/testainers/BaseResourceTest.java similarity index 97% rename from src/test/java/com/testainers/BaseTest.java rename to src/test/java/com/testainers/BaseResourceTest.java index 3d3adc5..e16fdec 100644 --- a/src/test/java/com/testainers/BaseTest.java +++ b/src/test/java/com/testainers/BaseResourceTest.java @@ -12,7 +12,7 @@ /** * @author Eduardo Folly */ -public class BaseTest { +public class BaseResourceTest { protected static final Map HEADERS = Map.of("test-header", List.of("test-header-value"), diff --git a/src/test/java/com/testainers/BasicAuthTest.java b/src/test/java/com/testainers/BasicAuthResourceTest.java similarity index 99% rename from src/test/java/com/testainers/BasicAuthTest.java rename to src/test/java/com/testainers/BasicAuthResourceTest.java index 64446ca..8fa5708 100644 --- a/src/test/java/com/testainers/BasicAuthTest.java +++ b/src/test/java/com/testainers/BasicAuthResourceTest.java @@ -11,7 +11,7 @@ * @author Eduardo Folly */ @QuarkusTest -public class BasicAuthTest extends BaseTest { +public class BasicAuthResourceTest extends BaseResourceTest { private static final String user = "test"; private static final String pass = "test-pass0"; diff --git a/src/test/java/com/testainers/DelayResourceDeleteTest.java b/src/test/java/com/testainers/DelayResourceDeleteTest.java new file mode 100644 index 0000000..0dcf99f --- /dev/null +++ b/src/test/java/com/testainers/DelayResourceDeleteTest.java @@ -0,0 +1,84 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.Matchers.containsStringIgnoringCase; +import static org.hamcrest.Matchers.is; + +/** + * @author Eduardo Folly + */ +@QuarkusTest +public class DelayResourceDeleteTest extends BaseResourceTest { + + @Test + public void testDelayDeleteEmpty() { + json().delete("/delay") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayDeleteString() { + json().delete("/delay/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayDeleteDouble() { + json().delete("/delay/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayDeleteNegative() { + json().delete("/delay/-1") + .then() + .statusCode(400) + .body("body", is("Invalid delay: -1"), + bodyMatchers("DELETE")); + } + + @Test + public void testDelayDelete0() { + json().delete("/delay/0") + .then() + .statusCode(200) + .body("body", is("Slept for 0 seconds."), + bodyMatchers("DELETE")); + } + + @Test + public void testDelayDelete1() { + json().delete("/delay/1") + .then() + .statusCode(200) + .body("body", is("Slept for 1 seconds."), + bodyMatchers("DELETE")); + } + + @Test + public void testDelayDelete10() { + json().delete("/delay/10") + .then() + .statusCode(200) + .body("body", is("Slept for 10 seconds."), + bodyMatchers("DELETE")); + } + + @Test + public void testDelayDelete11() { + json().delete("/delay/11") + .then() + .statusCode(400) + .body("body", is("Invalid delay: 11"), + bodyMatchers("DELETE")); + } + +} diff --git a/src/test/java/com/testainers/DelayResourceGetTest.java b/src/test/java/com/testainers/DelayResourceGetTest.java new file mode 100644 index 0000000..3375729 --- /dev/null +++ b/src/test/java/com/testainers/DelayResourceGetTest.java @@ -0,0 +1,83 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.Matchers.*; + +/** + * @author Eduardo Folly + */ +@QuarkusTest +public class DelayResourceGetTest extends BaseResourceTest { + + @Test + public void testDelayGetEmpty() { + base().get("/delay") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayGetString() { + base().get("/delay/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayGetDouble() { + base().get("/delay/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayGetNegative() { + base().get("/delay/-1") + .then() + .statusCode(400) + .body("body", is("Invalid delay: -1"), + bodyMatchers("GET")); + } + + @Test + public void testDelayGet0() { + base().get("/delay/0") + .then() + .statusCode(200) + .body("body", is("Slept for 0 seconds."), + bodyMatchers("GET")); + } + + @Test + public void testDelayGet1() { + base().get("/delay/1") + .then() + .statusCode(200) + .body("body", is("Slept for 1 seconds."), + bodyMatchers("GET")); + } + + @Test + public void testDelayGet10() { + base().get("/delay/10") + .then() + .statusCode(200) + .body("body", is("Slept for 10 seconds."), + bodyMatchers("GET")); + } + + @Test + public void testDelayGet11() { + base().get("/delay/11") + .then() + .statusCode(400) + .body("body", is("Invalid delay: 11"), + bodyMatchers("GET")); + } + +} diff --git a/src/test/java/com/testainers/DelayResourceHeadTest.java b/src/test/java/com/testainers/DelayResourceHeadTest.java new file mode 100644 index 0000000..f3af995 --- /dev/null +++ b/src/test/java/com/testainers/DelayResourceHeadTest.java @@ -0,0 +1,79 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.Matchers.containsStringIgnoringCase; +import static org.hamcrest.Matchers.is; + +/** + * @author Eduardo Folly + */ +@QuarkusTest +public class DelayResourceHeadTest extends BaseResourceTest { + + @Test + public void testDelayHeadEmpty() { + base().head("/delay") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayHeadString() { + base().head("/delay/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayHeadDouble() { + base().head("/delay/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayHeadNegative() { + base().head("/delay/-1") + .then() + .statusCode(400) + .body(is("")); + } + + @Test + public void testDelayHead0() { + base().head("/delay/0") + .then() + .statusCode(200) + .body(is("")); + } + + @Test + public void testDelayHead1() { + base().head("/delay/1") + .then() + .statusCode(200) + .body(is("")); + } + + @Test + public void testDelayHead10() { + base().head("/delay/10") + .then() + .statusCode(200) + .body(is("")); + } + + @Test + public void testDelayHead11() { + base().head("/delay/11") + .then() + .statusCode(400) + .body(is("")); + } + +} diff --git a/src/test/java/com/testainers/DelayResourcePatchTest.java b/src/test/java/com/testainers/DelayResourcePatchTest.java new file mode 100644 index 0000000..9836b1c --- /dev/null +++ b/src/test/java/com/testainers/DelayResourcePatchTest.java @@ -0,0 +1,84 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.Matchers.containsStringIgnoringCase; +import static org.hamcrest.Matchers.is; + +/** + * @author Eduardo Folly + */ +@QuarkusTest +public class DelayResourcePatchTest extends BaseResourceTest { + + @Test + public void testDelayPatchEmpty() { + json().patch("/delay") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayPatchString() { + json().patch("/delay/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayPatchDouble() { + json().patch("/delay/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayPatchNegative() { + json().patch("/delay/-1") + .then() + .statusCode(400) + .body("body", is("Invalid delay: -1"), + bodyMatchers("PATCH")); + } + + @Test + public void testDelayPatch0() { + json().patch("/delay/0") + .then() + .statusCode(200) + .body("body", is("Slept for 0 seconds."), + bodyMatchers("PATCH")); + } + + @Test + public void testDelayPatch1() { + json().patch("/delay/1") + .then() + .statusCode(200) + .body("body", is("Slept for 1 seconds."), + bodyMatchers("PATCH")); + } + + @Test + public void testDelayPatch10() { + json().patch("/delay/10") + .then() + .statusCode(200) + .body("body", is("Slept for 10 seconds."), + bodyMatchers("PATCH")); + } + + @Test + public void testDelayPatch11() { + json().patch("/delay/11") + .then() + .statusCode(400) + .body("body", is("Invalid delay: 11"), + bodyMatchers("PATCH")); + } + +} diff --git a/src/test/java/com/testainers/DelayResourcePostTest.java b/src/test/java/com/testainers/DelayResourcePostTest.java new file mode 100644 index 0000000..4830166 --- /dev/null +++ b/src/test/java/com/testainers/DelayResourcePostTest.java @@ -0,0 +1,84 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.Matchers.containsStringIgnoringCase; +import static org.hamcrest.Matchers.is; + +/** + * @author Eduardo Folly + */ +@QuarkusTest +public class DelayResourcePostTest extends BaseResourceTest { + + @Test + public void testDelayPostEmpty() { + json().post("/delay") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayPostString() { + json().post("/delay/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayPostDouble() { + json().post("/delay/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayPostNegative() { + json().post("/delay/-1") + .then() + .statusCode(400) + .body("body", is("Invalid delay: -1"), + bodyMatchers("POST")); + } + + @Test + public void testDelayPost0() { + json().post("/delay/0") + .then() + .statusCode(200) + .body("body", is("Slept for 0 seconds."), + bodyMatchers("POST")); + } + + @Test + public void testDelayPost1() { + json().post("/delay/1") + .then() + .statusCode(200) + .body("body", is("Slept for 1 seconds."), + bodyMatchers("POST")); + } + + @Test + public void testDelayPost10() { + json().post("/delay/10") + .then() + .statusCode(200) + .body("body", is("Slept for 10 seconds."), + bodyMatchers("POST")); + } + + @Test + public void testDelayPost11() { + json().post("/delay/11") + .then() + .statusCode(400) + .body("body", is("Invalid delay: 11"), + bodyMatchers("POST")); + } + +} diff --git a/src/test/java/com/testainers/DelayResourcePutTest.java b/src/test/java/com/testainers/DelayResourcePutTest.java new file mode 100644 index 0000000..68456b1 --- /dev/null +++ b/src/test/java/com/testainers/DelayResourcePutTest.java @@ -0,0 +1,84 @@ +package com.testainers; + +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.Matchers.containsStringIgnoringCase; +import static org.hamcrest.Matchers.is; + +/** + * @author Eduardo Folly + */ +@QuarkusTest +public class DelayResourcePutTest extends BaseResourceTest { + + @Test + public void testDelayPutEmpty() { + json().put("/delay") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayPutString() { + json().put("/delay/a") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayPutDouble() { + json().put("/delay/1.8") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } + + @Test + public void testDelayPutNegative() { + json().put("/delay/-1") + .then() + .statusCode(400) + .body("body", is("Invalid delay: -1"), + bodyMatchers("PUT")); + } + + @Test + public void testDelayPut0() { + json().put("/delay/0") + .then() + .statusCode(200) + .body("body", is("Slept for 0 seconds."), + bodyMatchers("PUT")); + } + + @Test + public void testDelayPut1() { + json().put("/delay/1") + .then() + .statusCode(200) + .body("body", is("Slept for 1 seconds."), + bodyMatchers("PUT")); + } + + @Test + public void testDelayPut10() { + json().put("/delay/10") + .then() + .statusCode(200) + .body("body", is("Slept for 10 seconds."), + bodyMatchers("PUT")); + } + + @Test + public void testDelayPut11() { + json().put("/delay/11") + .then() + .statusCode(400) + .body("body", is("Invalid delay: 11"), + bodyMatchers("PUT")); + } + +} diff --git a/src/test/java/com/testainers/MethodsResourceTest.java b/src/test/java/com/testainers/MethodsResourceResourceTest.java similarity index 97% rename from src/test/java/com/testainers/MethodsResourceTest.java rename to src/test/java/com/testainers/MethodsResourceResourceTest.java index b6533f8..b449b4c 100644 --- a/src/test/java/com/testainers/MethodsResourceTest.java +++ b/src/test/java/com/testainers/MethodsResourceResourceTest.java @@ -9,7 +9,7 @@ * @author Eduardo Folly */ @QuarkusTest -public class MethodsResourceTest extends BaseTest { +public class MethodsResourceResourceTest extends BaseResourceTest { @Test public void testMethodsGet() { diff --git a/src/test/java/com/testainers/StatusResourceDeleteTest.java b/src/test/java/com/testainers/StatusResourceDeleteResourceTest.java similarity index 97% rename from src/test/java/com/testainers/StatusResourceDeleteTest.java rename to src/test/java/com/testainers/StatusResourceDeleteResourceTest.java index c3ff83d..bd64fd4 100644 --- a/src/test/java/com/testainers/StatusResourceDeleteTest.java +++ b/src/test/java/com/testainers/StatusResourceDeleteResourceTest.java @@ -9,7 +9,7 @@ * @author Eduardo Folly */ @QuarkusTest -public class StatusResourceDeleteTest extends BaseTest { +public class StatusResourceDeleteResourceTest extends BaseResourceTest { @Test public void testStatusDeleteString() { diff --git a/src/test/java/com/testainers/StatusResourceGetTest.java b/src/test/java/com/testainers/StatusResourceGetResourceTest.java similarity index 91% rename from src/test/java/com/testainers/StatusResourceGetTest.java rename to src/test/java/com/testainers/StatusResourceGetResourceTest.java index b7a3d46..683ece0 100644 --- a/src/test/java/com/testainers/StatusResourceGetTest.java +++ b/src/test/java/com/testainers/StatusResourceGetResourceTest.java @@ -10,7 +10,15 @@ * @author Eduardo Folly */ @QuarkusTest -public class StatusResourceGetTest extends BaseTest { +public class StatusResourceGetResourceTest extends BaseResourceTest { + + @Test + public void testStatusGetEmpty() { + base().get("/status") + .then() + .statusCode(404) + .statusLine(containsStringIgnoringCase("Not Found")); + } @Test public void testStatusGetString() { diff --git a/src/test/java/com/testainers/StatusResourceHeadTest.java b/src/test/java/com/testainers/StatusResourceHeadResourceTest.java similarity index 97% rename from src/test/java/com/testainers/StatusResourceHeadTest.java rename to src/test/java/com/testainers/StatusResourceHeadResourceTest.java index d8ccabd..aabc5a1 100644 --- a/src/test/java/com/testainers/StatusResourceHeadTest.java +++ b/src/test/java/com/testainers/StatusResourceHeadResourceTest.java @@ -9,7 +9,7 @@ * @author Eduardo Folly */ @QuarkusTest -public class StatusResourceHeadTest extends BaseTest { +public class StatusResourceHeadResourceTest extends BaseResourceTest { @Test public void testStatusHeadString() { diff --git a/src/test/java/com/testainers/StatusResourcePatchTest.java b/src/test/java/com/testainers/StatusResourcePatchResourceTest.java similarity index 97% rename from src/test/java/com/testainers/StatusResourcePatchTest.java rename to src/test/java/com/testainers/StatusResourcePatchResourceTest.java index 1712cbc..289936d 100644 --- a/src/test/java/com/testainers/StatusResourcePatchTest.java +++ b/src/test/java/com/testainers/StatusResourcePatchResourceTest.java @@ -9,7 +9,7 @@ * @author Eduardo Folly */ @QuarkusTest -public class StatusResourcePatchTest extends BaseTest { +public class StatusResourcePatchResourceTest extends BaseResourceTest { @Test public void testStatusPatchString() { diff --git a/src/test/java/com/testainers/StatusResourcePostTest.java b/src/test/java/com/testainers/StatusResourcePostResourceTest.java similarity index 97% rename from src/test/java/com/testainers/StatusResourcePostTest.java rename to src/test/java/com/testainers/StatusResourcePostResourceTest.java index fad0135..ef90b51 100644 --- a/src/test/java/com/testainers/StatusResourcePostTest.java +++ b/src/test/java/com/testainers/StatusResourcePostResourceTest.java @@ -9,7 +9,7 @@ * @author Eduardo Folly */ @QuarkusTest -public class StatusResourcePostTest extends BaseTest { +public class StatusResourcePostResourceTest extends BaseResourceTest { @Test public void testStatusPostString() { diff --git a/src/test/java/com/testainers/StatusResourcePutTest.java b/src/test/java/com/testainers/StatusResourcePutResourceTest.java similarity index 97% rename from src/test/java/com/testainers/StatusResourcePutTest.java rename to src/test/java/com/testainers/StatusResourcePutResourceTest.java index 3ff29bf..4089413 100644 --- a/src/test/java/com/testainers/StatusResourcePutTest.java +++ b/src/test/java/com/testainers/StatusResourcePutResourceTest.java @@ -9,7 +9,7 @@ * @author Eduardo Folly */ @QuarkusTest -public class StatusResourcePutTest extends BaseTest { +public class StatusResourcePutResourceTest extends BaseResourceTest { @Test public void testStatusPutString() { From a3dd35ee00d494aa385d23b22fed554d979619a0 Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Mon, 12 Feb 2024 11:49:59 -0300 Subject: [PATCH 08/13] Updating project. --- .github/workflows/main.yml | 14 ++++++++------ README.md | 1 + build.gradle | 2 ++ gradle.properties | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- src/main/docker/Dockerfile.jvm | 5 +++-- src/main/docker/Dockerfile.legacy-jar | 6 ++++-- src/main/docker/Dockerfile.native | 4 ++-- src/main/docker/Dockerfile.native-micro | 2 +- src/main/resources/META-INF/branding/style.css | 14 ++++++++++++-- src/main/resources/application.properties | 11 +++++++++-- 11 files changed, 45 insertions(+), 20 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 06aa1a3..de23705 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,17 +19,16 @@ jobs: QUARKUS_JACOCO_EXCLUDES: '**/SimpleHealthCheck.class' steps: - name: Code Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'adopt' java-version: '17' cache: 'gradle' - name: Get Gradle Version - id: version-step run: | VERSION=$(grep 'version' build.gradle | cut -f 2 -d "'") echo "VERSION=$VERSION" >> $GITHUB_ENV @@ -58,16 +57,19 @@ jobs: -subj "/C=US/ST=SC/L=Hometown/O=IT/emailAddress=root@localhost/CN=localhost" - name: Build - run: ./gradlew build --no-daemon -Dquarkus.package.type=native -Dquarkus.native.container-build=true + run: | + ./gradlew build --no-daemon \ + -Dquarkus.package.type=native \ + -Dquarkus.native.container-build=true - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ env.OWNER }} password: ${{ secrets.DOCKER_TOKEN }} - name: Docker Build & Push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: push: true context: . diff --git a/README.md b/README.md index 51f57d4..0e8f35a 100644 --- a/README.md +++ b/README.md @@ -93,3 +93,4 @@ openssl req \ - /swagger-ui - /health - /metrics +- /info diff --git a/build.gradle b/build.gradle index bf2f645..09cd296 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,8 @@ dependencies { implementation "io.quarkus:quarkus-smallrye-health" implementation 'io.quarkus:quarkus-resteasy' implementation 'io.quarkus:quarkus-resteasy-jackson' + implementation 'io.quarkus:quarkus-container-image-jib' + implementation 'io.quarkus:quarkus-info' implementation 'io.quarkus:quarkus-arc' implementation 'io.smallrye.config:smallrye-config-source-file-system' testImplementation 'io.quarkus:quarkus-junit5' diff --git a/gradle.properties b/gradle.properties index a712916..633b193 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ #Gradle properties quarkusPluginId=io.quarkus -quarkusPluginVersion=3.2.1.Final +quarkusPluginVersion=3.7.2 quarkusPlatformGroupId=io.quarkus.platform quarkusPlatformArtifactId=quarkus-bom -quarkusPlatformVersion=3.2.1.Final +quarkusPlatformVersion=3.7.2 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 15de902..a595206 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/docker/Dockerfile.jvm b/src/main/docker/Dockerfile.jvm index c42dec0..91daae1 100644 --- a/src/main/docker/Dockerfile.jvm +++ b/src/main/docker/Dockerfile.jvm @@ -77,7 +77,7 @@ # accessed directly. (example: "foo.example.com,bar.example.com") # ### -FROM registry.access.redhat.com/ubi8/openjdk-17:1.15 +FROM registry.access.redhat.com/ubi8/openjdk-17:1.18 ENV LANGUAGE='en_US:en' @@ -90,6 +90,7 @@ COPY --chown=185 build/quarkus-app/quarkus/ /deployments/quarkus/ EXPOSE 8080 USER 185 -ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] diff --git a/src/main/docker/Dockerfile.legacy-jar b/src/main/docker/Dockerfile.legacy-jar index 45e580a..8b3a052 100644 --- a/src/main/docker/Dockerfile.legacy-jar +++ b/src/main/docker/Dockerfile.legacy-jar @@ -77,7 +77,7 @@ # accessed directly. (example: "foo.example.com,bar.example.com") # ### -FROM registry.access.redhat.com/ubi8/openjdk-17:1.15 +FROM registry.access.redhat.com/ubi8/openjdk-17:1.18 ENV LANGUAGE='en_US:en' @@ -87,5 +87,7 @@ COPY build/*-runner.jar /deployments/quarkus-run.jar EXPOSE 8080 USER 185 -ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + +ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ] \ No newline at end of file diff --git a/src/main/docker/Dockerfile.native b/src/main/docker/Dockerfile.native index 298b573..efe3bb2 100644 --- a/src/main/docker/Dockerfile.native +++ b/src/main/docker/Dockerfile.native @@ -14,7 +14,7 @@ # docker run -i --rm -p 8080:8080 quarkus/httpbucket # ### -FROM registry.access.redhat.com/ubi8/ubi-minimal:8.6 +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.9 WORKDIR /work/ RUN chown 1001 /work \ && chmod "g+rwX" /work \ @@ -24,4 +24,4 @@ COPY --chown=1001:root build/*-runner /work/application EXPOSE 8080 USER 1001 -CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] \ No newline at end of file diff --git a/src/main/docker/Dockerfile.native-micro b/src/main/docker/Dockerfile.native-micro index b7fca3b..c18a2e8 100644 --- a/src/main/docker/Dockerfile.native-micro +++ b/src/main/docker/Dockerfile.native-micro @@ -32,4 +32,4 @@ EXPOSE 8443 USER 1001 -CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] +ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] \ No newline at end of file diff --git a/src/main/resources/META-INF/branding/style.css b/src/main/resources/META-INF/branding/style.css index 8c83861..8c6d7e9 100644 --- a/src/main/resources/META-INF/branding/style.css +++ b/src/main/resources/META-INF/branding/style.css @@ -19,9 +19,19 @@ body{ background-color: #C38FA3; } -#swaggerUiTitleLink:before { - content: 'Testainers'; +.swagger-ui .topbar-wrapper:before { + content: "Testainers"; + padding-left: 60px; font-weight: normal; + font-size: 3.0em; + background-image: url("logo.png"); + background-repeat: no-repeat; + background-position: start; + background-size: contain; +} + +.swagger-ui .topbar-wrapper svg { + display: none; } .swagger-ui .topbar .download-url-wrapper { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 00efa12..01ba21b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,7 +5,7 @@ quarkus.banner.enabled=false quarkus.application.name=httpbucket quarkus.ssl.native=true # -# %prod.smallrye.config.source.file.locations=/run/secrets +%prod.smallrye.config.source.file.locations=/run/secrets # quarkus.http.ssl.certificate.files=${httpbucket.ssl.cert:cert.pem} quarkus.http.ssl.certificate.key-files=${httpbucket.ssl.key:key.pem} @@ -14,6 +14,8 @@ quarkus.http.cors=true quarkus.http.cors.origins=* quarkus.http.cors.access-control-max-age=24H # +quarkus.info.path=/info +# quarkus.health.openapi.included=true quarkus.smallrye-health.root-path=/health # @@ -27,4 +29,9 @@ quarkus.swagger-ui.always-include=true quarkus.swagger-ui.path=/swagger-ui quarkus.swagger-ui.theme=flattop quarkus.swagger-ui.title=httpbucket -quarkus.swagger-ui.footer=© 2023 - Testainers +quarkus.swagger-ui.footer=© 2024 - Testainers +# +quarkus.container-image.build=true +quarkus.container-image.group=testainers +quarkus.container-image.additional-tags=latest +quarkus.container-image.push=false From 21689c7cd0818c9ae312e4dbdd490d3695da9f04 Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Mon, 12 Feb 2024 12:29:13 -0300 Subject: [PATCH 09/13] JIB test. --- .github/workflows/dev-jib.yml | 101 ++++++++++++++++++++++ src/main/resources/application.properties | 5 -- 2 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/dev-jib.yml diff --git a/.github/workflows/dev-jib.yml b/.github/workflows/dev-jib.yml new file mode 100644 index 0000000..4079552 --- /dev/null +++ b/.github/workflows/dev-jib.yml @@ -0,0 +1,101 @@ +name: Test JIB + +on: + push: + branches: [ dev ] + + +jobs: + build: + name: Build + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Code Checkout + uses: actions/checkout@v4 + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'adopt' + java-version: '17' + cache: 'gradle' + + - name: Get Gradle Version + run: | + VERSION=$(grep 'version' build.gradle | cut -f 2 -d "'") + echo "VERSION=$VERSION" >> $GITHUB_ENV + echo "REPO=$GITHUB_REPOSITORY" >> $GITHUB_ENV + echo "OWNER=$GITHUB_REPOSITORY_OWNER" >> $GITHUB_ENV + +# - name: Check if version is used +# run: | +# URL=$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/latest +# LATEST=$(curl --silent "$URL" | jq -r .name) +# if [ "$LATEST" == "$VERSION" ]; then +# echo "Version already used: $VERSION" +# exit 1 +# fi + + - name: Generating self-signed certificate + run: | + openssl req \ + -newkey rsa:2048 \ + -new \ + -nodes \ + -x509 \ + -days 3650 \ + -keyout key.pem \ + -out cert.pem \ + -subj "/C=US/ST=SC/L=Hometown/O=IT/emailAddress=root@localhost/CN=localhost" + + - name: Build + run: | + ./gradlew build --no-daemon \ + -Dquarkus.package.type=native \ + -Dquarkus.native.container-build=true \ + -Dquarkus.container-image.username=${{ env.OWNER }} \ + -Dquarkus.container-image.password=${{ secrets.DOCKER_TOKEN }} \ + -Dquarkus.container-image.group=${{ env.OWNER }} \ + -Dquarkus.container-image.name=${{ env.REPO }} \ + -Dquarkus.container-image.tag=t${{ env.VERSION }} \ + -Dquarkus.container-image.additional-tags=test \ + -Dquarkus.jib.platforms=linux/amd64,linux/arm64 + +# - name: Login to DockerHub +# uses: docker/login-action@v3 +# with: +# username: ${{ env.OWNER }} +# password: ${{ secrets.DOCKER_TOKEN }} + +# - name: Docker Build & Push +# uses: docker/build-push-action@v5 +# with: +# push: true +# context: . +# file: src/main/docker/Dockerfile.native-micro +# tags: | +# ${{ env.REPO }}:${{ env.VERSION }} +# ${{ env.REPO }}:latest + +# - name: Creating GitHub Tag +# uses: mathieudutour/github-tag-action@v6.1 +# with: +# custom_tag: ${{ env.VERSION }} +# github_token: ${{ secrets.GITHUB_TOKEN }} + +# - name: Create GitHub Release +# uses: ncipollo/release-action@v1 +# with: +# tag: ${{ env.VERSION }} +# token: ${{ secrets.GITHUB_TOKEN }} + +# - name: Overwrite Coverage Theme +# run: | +# /bin/cp -rf helpers/coverage/* build/coverage/. + +# - name: Publishing to GitHub Pages +# uses: peaceiris/actions-gh-pages@v3 +# with: +# publish_dir: ./build/coverage +# github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 01ba21b..54cb835 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -30,8 +30,3 @@ quarkus.swagger-ui.path=/swagger-ui quarkus.swagger-ui.theme=flattop quarkus.swagger-ui.title=httpbucket quarkus.swagger-ui.footer=© 2024 - Testainers -# -quarkus.container-image.build=true -quarkus.container-image.group=testainers -quarkus.container-image.additional-tags=latest -quarkus.container-image.push=false From 5082990c640bb149f43d5ffe755cf9a5219661c5 Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Mon, 12 Feb 2024 12:37:41 -0300 Subject: [PATCH 10/13] Updating CI script. --- .github/workflows/dev-jib.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dev-jib.yml b/.github/workflows/dev-jib.yml index 4079552..3b51956 100644 --- a/.github/workflows/dev-jib.yml +++ b/.github/workflows/dev-jib.yml @@ -19,7 +19,6 @@ jobs: with: distribution: 'adopt' java-version: '17' - cache: 'gradle' - name: Get Gradle Version run: | @@ -52,8 +51,11 @@ jobs: - name: Build run: | ./gradlew build --no-daemon \ + -DskipTests \ -Dquarkus.package.type=native \ -Dquarkus.native.container-build=true \ + -Dquarkus.container-image.build=true \ + -Dquarkus.container-image.push=true \ -Dquarkus.container-image.username=${{ env.OWNER }} \ -Dquarkus.container-image.password=${{ secrets.DOCKER_TOKEN }} \ -Dquarkus.container-image.group=${{ env.OWNER }} \ From b1c6d30d691a25566261d9f272775b9f3b430780 Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Mon, 12 Feb 2024 12:52:58 -0300 Subject: [PATCH 11/13] Updating CI script. --- .github/workflows/dev-jib.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dev-jib.yml b/.github/workflows/dev-jib.yml index 3b51956..54d7613 100644 --- a/.github/workflows/dev-jib.yml +++ b/.github/workflows/dev-jib.yml @@ -59,7 +59,7 @@ jobs: -Dquarkus.container-image.username=${{ env.OWNER }} \ -Dquarkus.container-image.password=${{ secrets.DOCKER_TOKEN }} \ -Dquarkus.container-image.group=${{ env.OWNER }} \ - -Dquarkus.container-image.name=${{ env.REPO }} \ + -Dquarkus.container-image.name=httpbucket \ -Dquarkus.container-image.tag=t${{ env.VERSION }} \ -Dquarkus.container-image.additional-tags=test \ -Dquarkus.jib.platforms=linux/amd64,linux/arm64 From 4942c4e6553e8d1fba1084e3955a2fba21cfedf8 Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Mon, 12 Feb 2024 13:17:33 -0300 Subject: [PATCH 12/13] Updating CI script. --- .github/workflows/dev-jib.yml | 41 ++++++++++------------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/.github/workflows/dev-jib.yml b/.github/workflows/dev-jib.yml index 54d7613..353d2f6 100644 --- a/.github/workflows/dev-jib.yml +++ b/.github/workflows/dev-jib.yml @@ -4,7 +4,6 @@ on: push: branches: [ dev ] - jobs: build: name: Build @@ -24,17 +23,18 @@ jobs: run: | VERSION=$(grep 'version' build.gradle | cut -f 2 -d "'") echo "VERSION=$VERSION" >> $GITHUB_ENV - echo "REPO=$GITHUB_REPOSITORY" >> $GITHUB_ENV + REPO=$(echo $GITHUB_REPOSITORY | cut -f 2 -d "/") + echo "REPO=$REPO" >> $GITHUB_ENV echo "OWNER=$GITHUB_REPOSITORY_OWNER" >> $GITHUB_ENV -# - name: Check if version is used -# run: | -# URL=$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/latest -# LATEST=$(curl --silent "$URL" | jq -r .name) -# if [ "$LATEST" == "$VERSION" ]; then -# echo "Version already used: $VERSION" -# exit 1 -# fi + - name: Check if version is used + run: | + URL=$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/latest + LATEST=$(curl --silent "$URL" | jq -r .name) + if [ "$LATEST" == "$VERSION" ]; then + echo "Version already used: $VERSION" + exit 1 + fi - name: Generating self-signed certificate run: | @@ -48,10 +48,9 @@ jobs: -out cert.pem \ -subj "/C=US/ST=SC/L=Hometown/O=IT/emailAddress=root@localhost/CN=localhost" - - name: Build + - name: Test & Build run: | ./gradlew build --no-daemon \ - -DskipTests \ -Dquarkus.package.type=native \ -Dquarkus.native.container-build=true \ -Dquarkus.container-image.build=true \ @@ -59,27 +58,11 @@ jobs: -Dquarkus.container-image.username=${{ env.OWNER }} \ -Dquarkus.container-image.password=${{ secrets.DOCKER_TOKEN }} \ -Dquarkus.container-image.group=${{ env.OWNER }} \ - -Dquarkus.container-image.name=httpbucket \ + -Dquarkus.container-image.name=${{ env.REPO }} \ -Dquarkus.container-image.tag=t${{ env.VERSION }} \ -Dquarkus.container-image.additional-tags=test \ -Dquarkus.jib.platforms=linux/amd64,linux/arm64 -# - name: Login to DockerHub -# uses: docker/login-action@v3 -# with: -# username: ${{ env.OWNER }} -# password: ${{ secrets.DOCKER_TOKEN }} - -# - name: Docker Build & Push -# uses: docker/build-push-action@v5 -# with: -# push: true -# context: . -# file: src/main/docker/Dockerfile.native-micro -# tags: | -# ${{ env.REPO }}:${{ env.VERSION }} -# ${{ env.REPO }}:latest - # - name: Creating GitHub Tag # uses: mathieudutour/github-tag-action@v6.1 # with: From aa8089bc2cccd6c98644f550dfb8b4be72f84db5 Mon Sep 17 00:00:00 2001 From: Eduardo Folly Date: Mon, 12 Feb 2024 13:42:46 -0300 Subject: [PATCH 13/13] Updating CI script. --- .github/workflows/dev-jib.yml | 86 ------------------- .github/workflows/main.yml | 34 +++----- .github/workflows/test.yml | 5 +- .../resources/META-INF/resources/index.html | 2 +- 4 files changed, 16 insertions(+), 111 deletions(-) delete mode 100644 .github/workflows/dev-jib.yml diff --git a/.github/workflows/dev-jib.yml b/.github/workflows/dev-jib.yml deleted file mode 100644 index 353d2f6..0000000 --- a/.github/workflows/dev-jib.yml +++ /dev/null @@ -1,86 +0,0 @@ -name: Test JIB - -on: - push: - branches: [ dev ] - -jobs: - build: - name: Build - runs-on: ubuntu-latest - timeout-minutes: 15 - steps: - - name: Code Checkout - uses: actions/checkout@v4 - - - name: Setup Java - uses: actions/setup-java@v4 - with: - distribution: 'adopt' - java-version: '17' - - - name: Get Gradle Version - run: | - VERSION=$(grep 'version' build.gradle | cut -f 2 -d "'") - echo "VERSION=$VERSION" >> $GITHUB_ENV - REPO=$(echo $GITHUB_REPOSITORY | cut -f 2 -d "/") - echo "REPO=$REPO" >> $GITHUB_ENV - echo "OWNER=$GITHUB_REPOSITORY_OWNER" >> $GITHUB_ENV - - - name: Check if version is used - run: | - URL=$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/latest - LATEST=$(curl --silent "$URL" | jq -r .name) - if [ "$LATEST" == "$VERSION" ]; then - echo "Version already used: $VERSION" - exit 1 - fi - - - name: Generating self-signed certificate - run: | - openssl req \ - -newkey rsa:2048 \ - -new \ - -nodes \ - -x509 \ - -days 3650 \ - -keyout key.pem \ - -out cert.pem \ - -subj "/C=US/ST=SC/L=Hometown/O=IT/emailAddress=root@localhost/CN=localhost" - - - name: Test & Build - run: | - ./gradlew build --no-daemon \ - -Dquarkus.package.type=native \ - -Dquarkus.native.container-build=true \ - -Dquarkus.container-image.build=true \ - -Dquarkus.container-image.push=true \ - -Dquarkus.container-image.username=${{ env.OWNER }} \ - -Dquarkus.container-image.password=${{ secrets.DOCKER_TOKEN }} \ - -Dquarkus.container-image.group=${{ env.OWNER }} \ - -Dquarkus.container-image.name=${{ env.REPO }} \ - -Dquarkus.container-image.tag=t${{ env.VERSION }} \ - -Dquarkus.container-image.additional-tags=test \ - -Dquarkus.jib.platforms=linux/amd64,linux/arm64 - -# - name: Creating GitHub Tag -# uses: mathieudutour/github-tag-action@v6.1 -# with: -# custom_tag: ${{ env.VERSION }} -# github_token: ${{ secrets.GITHUB_TOKEN }} - -# - name: Create GitHub Release -# uses: ncipollo/release-action@v1 -# with: -# tag: ${{ env.VERSION }} -# token: ${{ secrets.GITHUB_TOKEN }} - -# - name: Overwrite Coverage Theme -# run: | -# /bin/cp -rf helpers/coverage/* build/coverage/. - -# - name: Publishing to GitHub Pages -# uses: peaceiris/actions-gh-pages@v3 -# with: -# publish_dir: ./build/coverage -# github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index de23705..7e1159b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,7 +4,6 @@ on: push: branches: [ main ] - jobs: build: name: Build @@ -26,13 +25,13 @@ jobs: with: distribution: 'adopt' java-version: '17' - cache: 'gradle' - name: Get Gradle Version run: | VERSION=$(grep 'version' build.gradle | cut -f 2 -d "'") echo "VERSION=$VERSION" >> $GITHUB_ENV - echo "REPO=$GITHUB_REPOSITORY" >> $GITHUB_ENV + REPO=$(echo $GITHUB_REPOSITORY | cut -f 2 -d "/") + echo "REPO=$REPO" >> $GITHUB_ENV echo "OWNER=$GITHUB_REPOSITORY_OWNER" >> $GITHUB_ENV - name: Check if version is used @@ -56,27 +55,20 @@ jobs: -out cert.pem \ -subj "/C=US/ST=SC/L=Hometown/O=IT/emailAddress=root@localhost/CN=localhost" - - name: Build + - name: Test & Build run: | ./gradlew build --no-daemon \ -Dquarkus.package.type=native \ - -Dquarkus.native.container-build=true - - - name: Login to DockerHub - uses: docker/login-action@v3 - with: - username: ${{ env.OWNER }} - password: ${{ secrets.DOCKER_TOKEN }} - - - name: Docker Build & Push - uses: docker/build-push-action@v5 - with: - push: true - context: . - file: src/main/docker/Dockerfile.native-micro - tags: | - ${{ env.REPO }}:${{ env.VERSION }} - ${{ env.REPO }}:latest + -Dquarkus.native.container-build=true \ + -Dquarkus.container-image.build=true \ + -Dquarkus.container-image.push=true \ + -Dquarkus.container-image.username=${{ env.OWNER }} \ + -Dquarkus.container-image.password=${{ secrets.DOCKER_TOKEN }} \ + -Dquarkus.container-image.group=${{ env.OWNER }} \ + -Dquarkus.container-image.name=${{ env.REPO }} \ + -Dquarkus.container-image.tag=t${{ env.VERSION }} \ + -Dquarkus.container-image.additional-tags=test \ + -Dquarkus.jib.platforms=linux/amd64,linux/arm64 - name: Creating GitHub Tag uses: mathieudutour/github-tag-action@v6.1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4d6d05e..d1e61bd 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,14 +9,13 @@ jobs: timeout-minutes: 20 steps: - name: Code Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'adopt' java-version: '17' - cache: 'gradle' - name: Generating self-signed certificate run: | diff --git a/src/main/resources/META-INF/resources/index.html b/src/main/resources/META-INF/resources/index.html index 953af48..f8760c5 100644 --- a/src/main/resources/META-INF/resources/index.html +++ b/src/main/resources/META-INF/resources/index.html @@ -1,5 +1,5 @@ - + httpbucket