From 7272e8fab27c88b165a1268a17684b12499f19da Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Wed, 20 Dec 2023 07:00:08 +0100 Subject: [PATCH] refactor(mockwebserver): DefaultMockServerCrudTest uses Vert.x to perform verifications Signed-off-by: Marc Nuri --- junit/mockwebserver/pom.xml | 11 + .../DefaultMockServerCrudTest.groovy | 225 +++++++++++------- pom.xml | 5 + 3 files changed, 150 insertions(+), 91 deletions(-) diff --git a/junit/mockwebserver/pom.xml b/junit/mockwebserver/pom.xml index 74ee6e0afa2..1b598652e1d 100644 --- a/junit/mockwebserver/pom.xml +++ b/junit/mockwebserver/pom.xml @@ -43,6 +43,17 @@ io.fabric8 zjsonpatch + + io.vertx + vertx-web-client + test + + + io.vertx + vertx-uri-template + ${vertx.version} + test + org.spockframework spock-core diff --git a/junit/mockwebserver/src/test/groovy/io/fabric8/mockwebserver/DefaultMockServerCrudTest.groovy b/junit/mockwebserver/src/test/groovy/io/fabric8/mockwebserver/DefaultMockServerCrudTest.groovy index 6e0840dec3b..c37f5211faa 100644 --- a/junit/mockwebserver/src/test/groovy/io/fabric8/mockwebserver/DefaultMockServerCrudTest.groovy +++ b/junit/mockwebserver/src/test/groovy/io/fabric8/mockwebserver/DefaultMockServerCrudTest.groovy @@ -15,25 +15,23 @@ */ package io.fabric8.mockwebserver -import com.fasterxml.jackson.databind.ObjectMapper import io.fabric8.mockwebserver.crud.CrudDispatcher -import okhttp3.MediaType -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.RequestBody +import io.vertx.core.Future +import io.vertx.core.Vertx +import io.vertx.ext.web.client.WebClient import okhttp3.mockwebserver.MockWebServer import spock.lang.Shared import spock.lang.Specification +import spock.util.concurrent.AsyncConditions class DefaultMockServerCrudTest extends Specification { - DefaultMockServer server - @Shared - def client = new OkHttpClient() - + static def vertx = Vertx.vertx() @Shared - def mapper = new ObjectMapper() + static def client = WebClient.create(vertx) + + DefaultMockServer server def setup() { server = new DefaultMockServer(new Context(), new MockWebServer(), new HashMap<>(), @@ -45,98 +43,143 @@ class DefaultMockServerCrudTest extends Specification { server.shutdown() } - def "get /, with empty store, should return 404"() { - when: - def result = client.newCall(new Request.Builder().url(server.url("/")).build()).execute() - - then: - assert result.code() == 404 - assert result.body().string() == "" + def cleanupSpec() { + client.close() + vertx.close() } - def "get /, with one item, should return item"() { - given: - client.newCall(new Request.Builder().url(server.url("/")).post( - RequestBody.create(MediaType.parse("application/json"), - mapper.writeValueAsString(new User(1L, "user", true)))).build()). - execute() - - when: - def result = client.newCall(new Request.Builder().url(server.url("/")).build()).execute() + def "GET /, with empty store, should return 404"() { + given: "An HTTP request to /" + def request = client.get(server.port, server.getHostName(), "/") + and: "An instance of AsyncConditions" + def async = new AsyncConditions(1) + + when: "The request is sent and completed" + request.send().onComplete { res -> + async.evaluate { + assert res.result().statusCode() == 404 + assert res.result().body() == null + } + } + + then: "Expect the result to be completed in the specified time" + async.await(10) + } - then: - assert result.code() == 200 - assert result.body().string() == "{\"id\":1,\"username\":\"user\",\"enabled\":true}" + def "POST /, with one item, should return item"() { + given: "An HTTP request to /" + def request = client.post(server.port, server.getHostName(), "/") + and: "An instance of AsyncConditions" + def async = new AsyncConditions(1) + + when: "The request is sent with one JSON item and completed" + request.sendJson(new User(1L, "user", true)).onComplete { res -> + async.evaluate { + assert res.result().statusCode() == 202 + assert res.result().body().toString() == "{\"id\":1,\"username\":\"user\",\"enabled\":true}" + } + } + + then: "Expect the result to be completed in the specified time" + async.await(10) } - def "get /, with multiple items, should return array"() { - given: - client.newCall(new Request.Builder().url(server.url("/")).post( - RequestBody.create(MediaType.parse("application/json"), - mapper.writeValueAsString(new User(1L, "user", true)))).build()). - execute() - client.newCall(new Request.Builder().url(server.url("/")).post( - RequestBody.create(MediaType.parse("application/json"), - mapper.writeValueAsString(new User(2L, "user-2", true)))).build()). - execute() - - when: - def result = client.newCall(new Request.Builder().url(server.url("/")).build()).execute() - - then: - assert result.code() == 200 - assert result.body().string() == - "[{\"id\":1,\"username\":\"user\",\"enabled\":true},{\"id\":2,\"username\":\"user-2\",\"enabled\":true}]" + def "GET /, with multiple items, should return array"() { + given: "An HTTP request to /" + def request = client.get(server.port, server.getHostName(), "/") + and: "An instance of AsyncConditions" + def async = new AsyncConditions(1) + and: "Items in the server" + def itemsInServer = Future.all( + client.post(server.port, server.getHostName(), "/") + .sendJson(new User(1L, "user", true)), + client.post(server.port, server.getHostName(), "/") + .sendJson(new User(2L, "user-2", true)) + ) + + when: "The request is sent and completed" + itemsInServer.onComplete {isr -> + request.send().onComplete { res -> + async.evaluate { assert res.result().statusCode() == 200 + assert res.result().body().toString() == "[{\"id\":1,\"username\":\"user\",\"enabled\":true},{\"id\":2,\"username\":\"user-2\",\"enabled\":true}]" + } + } + } + + then: "Expect the result to be completed in the specified time" + async.await(10) } - def "get /1, with existent item, should return item"() { - given: - client.newCall(new Request.Builder().url(server.url("/")).post( - RequestBody.create(MediaType.parse("application/json"), - mapper.writeValueAsString(new User(1L, "user", true)))).build()). - execute() - client.newCall(new Request.Builder().url(server.url("/")).post( - RequestBody.create(MediaType.parse("application/json"), - mapper.writeValueAsString(new User(2L, "user-2", true)))).build()). - execute() - - when: - def result = client.newCall(new Request.Builder().url(server.url("/1")).build()).execute() - - then: - assert result.code() == 200 - assert result.body().string() == "{\"id\":1,\"username\":\"user\",\"enabled\":true}" + def "GET /1, with existent item, should return item"() { + given: "An HTTP request to /1" + def request = client.get(server.port, server.getHostName(), "/1") + and: "An instance of AsyncConditions" + def async = new AsyncConditions(1) + and: "Items in the server" + def itemsInServer = Future.all( + client.post(server.port, server.getHostName(), "/") + .sendJson(new User(1L, "user", true)), + client.post(server.port, server.getHostName(), "/") + .sendJson(new User(2L, "user-2", true)) + ) + + when: "The request is sent and completed" + itemsInServer.onComplete {isr -> + request.send().onComplete { res -> + async.evaluate { + assert res.result().statusCode() == 200 + assert res.result().body().toString() == "{\"id\":1,\"username\":\"user\",\"enabled\":true}" + } + } + } + + then: "Expect the result to be completed in the specified time" + async.await(10) } - def "put /1, with missing item, should create item"() { - when: - def result = client.newCall(new Request.Builder().url(server.url("/1")).put( - RequestBody.create(MediaType.parse("application/json"), - mapper.writeValueAsString(new User(1L, "user-replaced", true)))).build()). - execute() + def "PUT /1, with missing item, should create item"() { + given: "An HTTP request to /1" + def request = client.put(server.port, server.getHostName(), "/1") + and: "An instance of AsyncConditions" + def async = new AsyncConditions(1) + + + when: "The request is sent with one JSON item and completed" + request.sendJson(new User(1L, "user-replaced", true)).onComplete { res -> + async.evaluate { + assert res.result().statusCode() == 201 + assert res.result().body().toString() == "{\"id\":1,\"username\":\"user-replaced\",\"enabled\":true}" + } + } - then: - assert result.code() == 201 - assert result.body().string() == "{\"id\":1,\"username\":\"user-replaced\",\"enabled\":true}" + then: "Expect the result to be completed in the specified time" + async.await(10) } - def "put /1, with existent item, should replace item"() { - given: - client.newCall(new Request.Builder().url(server.url("/")).post( - RequestBody.create(MediaType.parse("application/json"), - mapper.writeValueAsString(new User(1L, "user", true)))).build()). - execute() - - when: - def result = client.newCall(new Request.Builder().url(server.url("/1")).put( - RequestBody.create(MediaType.parse("application/json"), - mapper.writeValueAsString(new User(1L, "user-replaced", true)))).build()). - execute() - - then: - assert result.code() == 202 - assert result.body().string() == "{\"id\":1,\"username\":\"user-replaced\",\"enabled\":true}" - def item = client.newCall(new Request.Builder().url(server.url("/1")).build()).execute() - assert item.body().string() == "{\"id\":1,\"username\":\"user-replaced\",\"enabled\":true}" + def "PUT /1, with existent item, should replace item"() { + given: "An HTTP request to /1" + def request = client.put(server.port, server.getHostName(), "/1") + and: "An instance of AsyncConditions" + def async = new AsyncConditions(1) + and: "Items in the server" + def itemsInServer = Future.all( + client.post(server.port, server.getHostName(), "/") + .sendJson(new User(1L, "user", true)), + client.post(server.port, server.getHostName(), "/") + .sendJson(new User(2L, "user-2", true)) + ) + + when: "The request is sent with one JSON item and completed" + itemsInServer.onComplete { isr -> + request.sendJson(new User(1L, "user-replaced", true)).onComplete { res -> + async.evaluate { + assert res.result().statusCode() == 202 + assert res.result().body().toString() == "{\"id\":1,\"username\":\"user-replaced\",\"enabled\":true}" + } + } + } + + then: "Expect the result to be completed in the specified time" + async.await(10) } } diff --git a/pom.xml b/pom.xml index d31ed846f69..417b2bdd9b9 100644 --- a/pom.xml +++ b/pom.xml @@ -817,6 +817,11 @@ + + io.vertx + vertx-web + ${vertx.version} + info.picocli picocli