From 63afe3a59eeb07768a81f8dba13071c69cd2b0f3 Mon Sep 17 00:00:00 2001 From: "tomasz.michalak" Date: Thu, 6 Sep 2018 09:36:40 +0200 Subject: [PATCH 1/6] Integration tests use Vert.x WebClient and verify the result in onSuccess method instead of subscribe lambda. --- .../SampleApplicationIntegrationTest.java | 97 ++++++++----------- 1 file changed, 40 insertions(+), 57 deletions(-) diff --git a/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationIntegrationTest.java b/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationIntegrationTest.java index 50a3c35..19eee69 100644 --- a/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationIntegrationTest.java +++ b/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationIntegrationTest.java @@ -19,21 +19,17 @@ import io.knotx.dataobjects.AdapterResponse; import io.knotx.dataobjects.ClientResponse; -import io.knotx.junit.util.FileReader; import io.knotx.junit5.KnotxApplyConfiguration; import io.knotx.junit5.KnotxExtension; -import io.knotx.junit5.KnotxTestUtils; +import io.knotx.junit5.util.FileReader; import io.knotx.proxy.AdapterProxy; import io.netty.handler.codec.http.HttpResponseStatus; -import io.reactivex.Observable; import io.vertx.core.Future; -import io.vertx.core.http.HttpClientOptions; -import io.vertx.core.http.HttpMethod; import io.vertx.core.json.JsonObject; import io.vertx.junit5.VertxTestContext; +import io.vertx.reactivex.core.MultiMap; import io.vertx.reactivex.core.Vertx; -import io.vertx.reactivex.core.http.HttpClient; -import io.vertx.reactivex.core.http.HttpClientResponse; +import io.vertx.reactivex.ext.web.client.WebClient; import io.vertx.serviceproxy.ServiceBinder; import java.util.Map; import org.apache.commons.lang3.StringUtils; @@ -64,7 +60,8 @@ public void whenRequestingLocalSimplePageWithGet_expectLocalSimpleHtml( @KnotxApplyConfiguration("knotx-test-app-custom-symbol.json") public void whenRequestingLocalSimplePageWithGetCustomSymbol_expectLocalSimpleHtml( VertxTestContext context, Vertx vertx) { - testGetRequest(context, vertx, "/content/local/customSymbol.html", "localSimpleResultAngular.html"); + testGetRequest(context, vertx, "/content/local/customSymbol.html", + "localSimpleResultAngular.html"); } @Test @@ -117,7 +114,7 @@ public void whenRequestingWithPostMethodFirstForm_expectFirstFormPresentingFormA VertxTestContext context, Vertx vertx) { mockActionAdapter(vertx, getFirstTestFormData(), null); testPostRequest(context, vertx, LOCAL_MULTIPLE_FORMS_URI, getFirstTestFormData().getMap(), - "multipleFormWithPostResult.html", false); + "multipleFormWithPostResult.html"); } @Test @@ -126,67 +123,53 @@ public void whenRequestingWithPostFirstFormTwiceWithDifferentData_expectDifferen VertxTestContext context, Vertx vertx) { mockActionAdapter(vertx, getFirstTestFormData(), getSecondTestFormData()); testPostRequest(context, vertx, LOCAL_MULTIPLE_FORMS_URI, getFirstTestFormData().getMap(), - "multipleFormWithPostResult.html", false); + "multipleFormWithPostResult.html"); testPostRequest(context, vertx, LOCAL_MULTIPLE_FORMS_URI, getSecondTestFormData().getMap(), - "multipleFormWithPostResult2.html", false); - } - - private void testPostRequest(VertxTestContext context, Vertx vertx, String url, Map formData, - String expectedResponseFile, boolean ajaxCall) { - HttpClient client = vertx.createHttpClient(); - - Observable request = KnotxTestUtils - .asyncRequest(client, HttpMethod.POST, KNOTX_SERVER_PORT, - KNOTX_SERVER_ADDRESS, url, req -> { - String bodyForm = formData.entrySet().stream() - .map(entry -> entry.getKey() + "=" + entry.getValue()) - .reduce((p1, p2) -> p1 + "&" + p2).get(); - req.headers().set("content-length", String.valueOf(bodyForm.length())); - req.headers().set("content-type", "application/x-www-form-urlencoded"); - if (ajaxCall) { - req.headers().set("X-Requested-With", "XMLHttpRequest"); - } - req.write(bodyForm); - }); + "multipleFormWithPostResult2.html"); + } - request.subscribe(resp -> resp.bodyHandler(body -> { - assertEquals(resp.statusCode(), HttpResponseStatus.OK.code()); - try { - assertEquals(Jsoup.parse(body.toString()).body().html(), - Jsoup.parse(FileReader.readText(expectedResponseFile)).body().html()); - } catch (Exception e) { - context.failNow(e); - } + private void testPostRequest(VertxTestContext context, Vertx vertx, String url, + Map formData, + String expectedResponseFile) { - context.completeNow(); - })); + WebClient client = WebClient.create(vertx); + client.post(KNOTX_SERVER_PORT, KNOTX_SERVER_ADDRESS, url) + .rxSendForm(getMultiMap(formData)) + .doOnSuccess(resp -> { + assertEquals(resp.statusCode(), HttpResponseStatus.OK.code()); + assertEquals(Jsoup.parse(resp.body().toString()).body().html(), + Jsoup.parse(FileReader.readTextSafe(expectedResponseFile)).body().html()); + }) + .subscribe(onSuccess -> context.completeNow(), context::failNow); } - private void testGetRequest(VertxTestContext context, Vertx vertx, String url, String expectedResponseFile) { - HttpClient client = vertx.createHttpClient(new HttpClientOptions()); + private MultiMap getMultiMap(Map formData) { + MultiMap formMap = MultiMap.caseInsensitiveMultiMap(); + formData.forEach((key, value) -> formMap.add(key, (String) value)); + return formMap; + } - client.getNow(KNOTX_SERVER_PORT, KNOTX_SERVER_ADDRESS, url, - resp -> resp.bodyHandler(body -> { + private void testGetRequest(VertxTestContext context, Vertx vertx, String url, + String expectedResponseFile) { + WebClient client = WebClient.create(vertx); + client.get(KNOTX_SERVER_PORT, KNOTX_SERVER_ADDRESS, url).rxSend() + .doOnSuccess(resp -> { assertEquals(resp.statusCode(), HttpResponseStatus.OK.code()); - try { - assertEquals(Jsoup.parse(body.toString()).body().html().trim(), - Jsoup.parse(FileReader.readText(expectedResponseFile)).body().html().trim()); - } catch (Exception e) { - context.failNow(e); - } + assertEquals(Jsoup.parse(resp.body().toString()).body().html().trim(), + Jsoup.parse(FileReader.readTextSafe(expectedResponseFile)).body().html().trim()); client.close(); - context.completeNow(); - })); + }) + .subscribe(onSuccess -> context.completeNow(), context::failNow); } private void testGetServerError(VertxTestContext context, Vertx vertx, String url) { - HttpClient client = vertx.createHttpClient(); - client.getNow(KNOTX_SERVER_PORT, KNOTX_SERVER_ADDRESS, url, - resp -> resp.bodyHandler(body -> { + WebClient client = WebClient.create(vertx); + client.get(KNOTX_SERVER_PORT, KNOTX_SERVER_ADDRESS, url).rxSend() + .doOnSuccess(resp -> { assertEquals(resp.statusCode(), HttpResponseStatus.INTERNAL_SERVER_ERROR.code()); client.close(); - context.completeNow(); - })); + }) + .subscribe(onSuccess -> context.completeNow(), context::failNow); } private JsonObject getFirstTestFormData() { From 78f92bb3904e2a8226046c2adf8d2965a1ee91de Mon Sep 17 00:00:00 2001 From: "tomasz.michalak" Date: Thu, 6 Sep 2018 11:17:04 +0200 Subject: [PATCH 2/6] Integration tests: HOCON syntax. --- ...mpleApplicationHeadersIntegrationTest.java | 2 +- .../SampleApplicationIntegrationTest.java | 14 +- .../src/test/resources/knotx-test-app.conf | 281 ++++++++++++++++ .../src/test/resources/knotx-test-app.json | 306 ------------------ 4 files changed, 289 insertions(+), 314 deletions(-) create mode 100644 knotx-it-tests/src/test/resources/knotx-test-app.conf delete mode 100644 knotx-it-tests/src/test/resources/knotx-test-app.json diff --git a/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationHeadersIntegrationTest.java b/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationHeadersIntegrationTest.java index 1879c4e..ad5f02f 100644 --- a/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationHeadersIntegrationTest.java +++ b/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationHeadersIntegrationTest.java @@ -46,7 +46,7 @@ public void before() { } @Test - @KnotxApplyConfiguration("knotx-test-app.json") + @KnotxApplyConfiguration("knotx-test-app.conf") public void whenRequestingRemoteRepository_expectOnlyAllowedResponseHeaders( VertxTestContext context, Vertx vertx) { testGetRequest(context, vertx, REMOTE_REQUEST_URI); diff --git a/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationIntegrationTest.java b/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationIntegrationTest.java index 19eee69..69c106f 100644 --- a/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationIntegrationTest.java +++ b/knotx-it-tests/src/test/java/io/knotx/example/monolith/SampleApplicationIntegrationTest.java @@ -50,7 +50,7 @@ public class SampleApplicationIntegrationTest { private static final String KNOTX_SERVER_ADDRESS = "localhost"; @Test - @KnotxApplyConfiguration("knotx-test-app.json") + @KnotxApplyConfiguration("knotx-test-app.conf") public void whenRequestingLocalSimplePageWithGet_expectLocalSimpleHtml( VertxTestContext context, Vertx vertx) { testGetRequest(context, vertx, LOCAL_REQUEST_URI, "localSimpleResult.html"); @@ -80,21 +80,21 @@ public void whenRequestingLocalPageWhereInServiceIsMissingResponseBody_expectNoB } @Test - @KnotxApplyConfiguration("knotx-test-app.json") + @KnotxApplyConfiguration("knotx-test-app.conf") public void whenRequestingPageWithMissingServiceWithoutConfiguration_expectServerError( VertxTestContext context, Vertx vertx) { testGetServerError(context, vertx, MISSING_SERVICE_CONFIG_REQUEST_URI); } @Test - @KnotxApplyConfiguration("knotx-test-app.json") + @KnotxApplyConfiguration("knotx-test-app.conf") public void whenRequestingRemoteSimplePageWithGet_expectRemoteSimpleHtml( VertxTestContext context, Vertx vertx) { testGetRequest(context, vertx, REMOTE_REQUEST_URI, "remoteSimpleResult.html"); } @Test - @KnotxApplyConfiguration("knotx-test-app.json") + @KnotxApplyConfiguration("knotx-test-app.conf") public void whenRequestingRemoteSimplePageWithGetAndRequestParameterNameContainsSpace_expectRemoteSimpleHtml( VertxTestContext context, Vertx vertx) { testGetRequest(context, vertx, REMOTE_REQUEST_URI_WITH_PARAMETER_CONTAINING_SPACE, @@ -102,14 +102,14 @@ public void whenRequestingRemoteSimplePageWithGetAndRequestParameterNameContains } @Test - @KnotxApplyConfiguration("knotx-test-app.json") + @KnotxApplyConfiguration("knotx-test-app.conf") public void whenRequestingLocalMultipleFormsPageWithGet_expectMutlipleFormsWithGetResultHtml( VertxTestContext context, Vertx vertx) { testGetRequest(context, vertx, LOCAL_MULTIPLE_FORMS_URI, "multipleFormWithGetResult.html"); } @Test - @KnotxApplyConfiguration("knotx-test-app.json") + @KnotxApplyConfiguration("knotx-test-app.conf") public void whenRequestingWithPostMethodFirstForm_expectFirstFormPresentingFormActionResult( VertxTestContext context, Vertx vertx) { mockActionAdapter(vertx, getFirstTestFormData(), null); @@ -118,7 +118,7 @@ public void whenRequestingWithPostMethodFirstForm_expectFirstFormPresentingFormA } @Test - @KnotxApplyConfiguration("knotx-test-app.json") + @KnotxApplyConfiguration("knotx-test-app.conf") public void whenRequestingWithPostFirstFormTwiceWithDifferentData_expectDifferentResultOfFirstFormForEachRequest( VertxTestContext context, Vertx vertx) { mockActionAdapter(vertx, getFirstTestFormData(), getSecondTestFormData()); diff --git a/knotx-it-tests/src/test/resources/knotx-test-app.conf b/knotx-it-tests/src/test/resources/knotx-test-app.conf new file mode 100644 index 0000000..401a1e0 --- /dev/null +++ b/knotx-it-tests/src/test/resources/knotx-test-app.conf @@ -0,0 +1,281 @@ +########## Modules ########## +modules = [ + "server=io.knotx.server.KnotxServerVerticle", + "httpRepo=io.knotx.repository.http.HttpRepositoryConnectorVerticle", + "fsRepo=io.knotx.repository.fs.FilesystemRepositoryConnectorVerticle", + "splitter=io.knotx.splitter.FragmentSplitterVerticle", + "assembler=io.knotx.assembler.FragmentAssemblerVerticle", + "hbsKnot=io.knotx.knot.templating.HandlebarsKnotVerticle", + "serviceKnot=io.knotx.knot.service.ServiceKnotVerticle", + "actionKnot=io.knotx.knot.action.ActionKnotVerticle", + "serviceAdapter=io.knotx.adapter.service.http.HttpServiceAdapterVerticle", + "mockRepo=io.knotx.mocks.MockRemoteRepositoryVerticle", + "mockService=io.knotx.mocks.MockServiceVerticle" +], + +########### Globals ########### +global { + serverPort = 9092 + + snippetOptions { + # Knot.x snippet HTML tag name. Default is 'script'. + # Change here if you want to use different tag name, e.g. 'knotx:snippet' + tagName = script + + # This prefix will start every snippet parameter in the snippet tag. + # You may set it to 'data-xxxx-' when snippet tag name is an HTML tag to keep HTML5 data naming + # compliance, e.g. when you set it to 'data-knotx-', snippet params will look like: + #