This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new 736b197 Expand ElasticSearch REST test coverage
736b197 is described below
commit 736b19727fc635ebbde101d4c5decebf51b9adc5
Author: James Netherton <[email protected]>
AuthorDate: Mon Jul 26 12:00:30 2021 +0100
Expand ElasticSearch REST test coverage
Fixes #2819
---
integration-tests/elasticsearch-rest/pom.xml | 5 +
.../rest/it/ElasticsearchRestResource.java | 260 ++++++++++++++++--
.../rest/it/ElasticsearchRestRoutes.java | 38 ++-
.../rest/it/ElasticSearchTestResource.java | 13 +-
.../rest/it/ElasticsearchRestTest.java | 292 ++++++++++++++++++++-
5 files changed, 573 insertions(+), 35 deletions(-)
diff --git a/integration-tests/elasticsearch-rest/pom.xml
b/integration-tests/elasticsearch-rest/pom.xml
index e14527f..d080f75 100644
--- a/integration-tests/elasticsearch-rest/pom.xml
+++ b/integration-tests/elasticsearch-rest/pom.xml
@@ -59,6 +59,11 @@
<artifactId>testcontainers</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.awaitility</groupId>
+ <artifactId>awaitility</artifactId>
+ <scope>test</scope>
+ </dependency>
<!-- The following dependencies guarantee that this module is built
after them. You can update them by running `mvn process-resources -Pformat -N`
from the source tree root directory -->
<dependency>
diff --git
a/integration-tests/elasticsearch-rest/src/main/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestResource.java
b/integration-tests/elasticsearch-rest/src/main/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestResource.java
index a88976e..f235b99 100644
---
a/integration-tests/elasticsearch-rest/src/main/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestResource.java
+++
b/integration-tests/elasticsearch-rest/src/main/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestResource.java
@@ -17,8 +17,11 @@
package org.apache.camel.quarkus.component.elasticsearch.rest.it;
import java.net.URI;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
@@ -32,35 +35,66 @@ import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import org.apache.camel.ProducerTemplate;
+import org.apache.camel.FluentProducerTemplate;
import org.apache.camel.component.elasticsearch.ElasticsearchConstants;
+import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
+import org.elasticsearch.action.bulk.BulkItemResponse;
+import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.get.GetResponse;
+import org.elasticsearch.action.index.IndexRequest;
+import org.elasticsearch.action.search.MultiSearchRequest;
+import org.elasticsearch.action.search.MultiSearchResponse.Item;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.SearchHits;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
@Path("/elasticsearch-rest")
@ApplicationScoped
public class ElasticsearchRestResource {
+ private static final String HEADER_COMPONENT = "component";
+
@Inject
- ProducerTemplate producerTemplate;
+ FluentProducerTemplate fluentProducerTemplate;
@Path("/get")
@GET
@Produces(MediaType.TEXT_PLAIN)
- public Response getData(@QueryParam("component") String component,
@QueryParam("indexId") String indexId) {
- GetResponse response =
producerTemplate.requestBodyAndHeader("direct:get", indexId, "component",
component,
- GetResponse.class);
+ public Response getData(
+ @QueryParam("component") String component,
+ @QueryParam("indexName") String indexName,
+ @QueryParam("indexId") String indexId,
+ @QueryParam("indexKey") String indexKey) {
+
+ GetResponse response = fluentProducerTemplate.to("direct:get")
+ .withBody(indexId)
+ .withHeader(ElasticsearchConstants.PARAM_INDEX_NAME, indexName)
+ .withHeader(HEADER_COMPONENT, component)
+ .request(GetResponse.class);
+
if (response.getSource() == null) {
return Response.status(404).build();
}
- return
Response.ok().entity(response.getSource().get("test-key")).build();
+
+ return
Response.ok().entity(response.getSource().get(indexKey)).build();
}
@Path("/index")
@POST
@Produces(MediaType.TEXT_PLAIN)
- public Response indexData(@QueryParam("component") String component,
String indexValue) throws Exception {
- Map<String, String> data = createIndexedData(indexValue);
- String indexId = producerTemplate.requestBodyAndHeader("direct:index",
data, "component", component, String.class);
+ public Response indexData(
+ @QueryParam("component") String component,
+ @QueryParam("indexName") String indexName,
+ @QueryParam("indexKey") String indexKey,
+ String indexValue) throws Exception {
+
+ String indexId = fluentProducerTemplate.to("direct:index")
+ .withBody(createIndexedData(indexKey, indexValue))
+ .withHeader(ElasticsearchConstants.PARAM_INDEX_NAME, indexName)
+ .withHeader(HEADER_COMPONENT, component)
+ .request(String.class);
+
return Response
.created(new URI("https://camel.apache.org/"))
.entity(indexId)
@@ -70,28 +104,216 @@ public class ElasticsearchRestResource {
@Path("/update")
@PATCH
@Produces(MediaType.TEXT_PLAIN)
- public Response updateData(@QueryParam("component") String component,
@QueryParam("indexId") String indexId,
+ public Response updateData(
+ @QueryParam("component") String component,
+ @QueryParam("indexName") String indexName,
+ @QueryParam("indexId") String indexId,
+ @QueryParam("indexKey") String indexKey,
String indexValue) {
- Map<String, String> data = createIndexedData(indexValue);
- Map<String, Object> headers = new HashMap<>();
- headers.put(ElasticsearchConstants.PARAM_INDEX_ID, indexId);
- headers.put("component", component);
- producerTemplate.requestBodyAndHeaders("direct:update", data, headers);
+ fluentProducerTemplate.to("direct:update")
+ .withBody(createIndexedData(indexKey, indexValue))
+ .withHeader(ElasticsearchConstants.PARAM_INDEX_NAME, indexName)
+ .withHeader(ElasticsearchConstants.PARAM_INDEX_ID, indexId)
+ .withHeader(HEADER_COMPONENT, component)
+ .request();
+
return Response.ok().build();
}
@Path("/delete")
@DELETE
@Produces(MediaType.TEXT_PLAIN)
- public Response deleteData(@QueryParam("component") String component,
@QueryParam("indexId") String indexId) {
- producerTemplate.requestBodyAndHeader("direct:delete", indexId,
"component", component);
+ public Response deleteData(
+ @QueryParam("component") String component,
+ @QueryParam("indexName") String indexName,
+ @QueryParam("indexId") String indexId) {
+
+ fluentProducerTemplate.to("direct:delete")
+ .withBody(indexId)
+ .withHeader(ElasticsearchConstants.PARAM_INDEX_NAME, indexName)
+ .withHeader(HEADER_COMPONENT, component)
+ .request();
+
return Response.noContent().build();
}
- private Map<String, String> createIndexedData(String indexValue) {
+ @Path("/delete/index")
+ @DELETE
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response deleteIndexData(
+ @QueryParam("component") String component,
+ @QueryParam("indexName") String indexName) {
+
+ DeleteIndexRequest request = new DeleteIndexRequest(indexName);
+
+ Boolean result = fluentProducerTemplate.to("direct:deleteIndex")
+ .withBody(request)
+ .withHeader(HEADER_COMPONENT, component)
+ .request(Boolean.class);
+
+ return Response.ok(result).build();
+ }
+
+ @Path("/ping")
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response ping(@QueryParam("component") String component) {
+ Boolean result = fluentProducerTemplate.to("direct:ping")
+ .withHeader(HEADER_COMPONENT, component)
+ .request(Boolean.class);
+
+ return Response.ok(result).build();
+ }
+
+ @Path("/exists")
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response exists(
+ @QueryParam("component") String component,
+ @QueryParam("indexName") String indexName) {
+
+ Boolean result = fluentProducerTemplate.to("direct:exists")
+ .withHeader(ElasticsearchConstants.PARAM_INDEX_NAME, indexName)
+ .withHeader(HEADER_COMPONENT, component)
+ .request(Boolean.class);
+
+ return Response.ok(result).build();
+ }
+
+ @Path("/bulk")
+ @POST
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response bulk(
+ @QueryParam("component") String component,
+ @QueryParam("indexName") String indexName) {
+
+ BulkRequest request = new BulkRequest();
+ request.add(new IndexRequest(indexName).source("camel", "quarkus"));
+
+ BulkItemResponse[] result = fluentProducerTemplate.to("direct:bulk")
+ .withBody(request)
+ .withHeader(HEADER_COMPONENT, component)
+ .request(BulkItemResponse[].class);
+
+ return Response.ok(result[0].getResponse().getId()).build();
+ }
+
+ @Path("/bulk/index")
+ @POST
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response bulkIndex(
+ @QueryParam("component") String component,
+ @QueryParam("indexName") String indexName) {
+
+ List<Map<String, String>> documents = new ArrayList<>();
+ documents.add(createIndexedData("foo", "bar"));
+ documents.add(createIndexedData("cheese", "wine"));
+
+ List<BulkItemResponse> result =
fluentProducerTemplate.to("direct:bulkIndex")
+ .withBody(documents)
+ .withHeader(ElasticsearchConstants.PARAM_INDEX_NAME, indexName)
+ .withHeader(HEADER_COMPONENT, component)
+ .request(List.class);
+
+ String ids = result.stream().map(bulkItem ->
bulkItem.getResponse().getId()).collect(Collectors.joining(","));
+
+ return Response.ok(ids).build();
+ }
+
+ @Path("/search")
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response searchByMap(
+ @QueryParam("component") String component,
+ @QueryParam("indexKey") String indexKey,
+ String searchString) {
+
+ Map<String, Object> actualQuery = new HashMap<>();
+ actualQuery.put(indexKey, searchString);
+
+ Map<String, Object> match = new HashMap<>();
+ match.put("match", actualQuery);
+
+ Map<String, Object> query = new HashMap<>();
+ query.put("query", match);
+
+ SearchHits result = fluentProducerTemplate.to("direct:search")
+ .withBody(query)
+ .withHeader(HEADER_COMPONENT, component)
+ .request(SearchHits.class);
+
+ if (result.getHits().length > 0) {
+ Map<String, Object> source = result.getAt(0).getSourceAsMap();
+ return Response.ok(source.get(indexKey)).build();
+ }
+ return Response.ok().build();
+ }
+
+ @Path("/search/json")
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response searchByJSON(
+ @QueryParam("component") String component,
+ @QueryParam("indexKey") String indexKey,
+ String searchString) {
+
+ String query = "{\"query\":{\"match\":{\"%s\":\"%s\"}}}";
+
+ SearchHits result = fluentProducerTemplate.to("direct:search")
+ .withBody(String.format(query, indexKey, searchString))
+ .withHeader(HEADER_COMPONENT, component)
+ .request(SearchHits.class);
+
+ if (result.getHits().length > 0) {
+ Map<String, Object> source = result.getAt(0).getSourceAsMap();
+ return Response.ok(source.get(indexKey)).build();
+ }
+ return Response.ok().build();
+ }
+
+ @Path("/search/multi")
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response searchMulti(
+ @QueryParam("component") String component,
+ @QueryParam("indexName") String indexName,
+ @QueryParam("indexKey") String indexKey,
+ String searchStrings) {
+
+ String[] searchTerms = searchStrings.split(",");
+
+ MultiSearchRequest request = new MultiSearchRequest();
+ SearchRequest searchA = new SearchRequest(indexName);
+ SearchSourceBuilder builderA = new SearchSourceBuilder();
+ builderA.query(QueryBuilders.matchPhraseQuery(indexKey,
searchTerms[0]));
+ searchA.source(builderA);
+ request.add(searchA);
+
+ SearchRequest searchB = new SearchRequest(indexName);
+ SearchSourceBuilder builderB = new SearchSourceBuilder();
+ builderB.query(QueryBuilders.matchPhraseQuery(indexKey,
searchTerms[1]));
+ searchB.source(builderB);
+ request.add(searchB);
+
+ Item[] result = fluentProducerTemplate.to("direct:multiSearch")
+ .withBody(request)
+ .withHeader(HEADER_COMPONENT, component)
+ .request(Item[].class);
+
+ if (result.length > 0) {
+ int totalHits = 0;
+ for (Item item : result) {
+ totalHits += item.getResponse().getHits().getHits().length;
+ }
+ return Response.ok(totalHits).build();
+ }
+ return Response.ok().build();
+ }
+
+ private Map<String, String> createIndexedData(String indexKey, String
indexValue) {
Map<String, String> map = new HashMap<>();
- map.put("test-key", indexValue);
+ map.put(indexKey, indexValue);
return map;
}
diff --git
a/integration-tests/elasticsearch-rest/src/main/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestRoutes.java
b/integration-tests/elasticsearch-rest/src/main/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestRoutes.java
index bd2fcc2..222bb05 100644
---
a/integration-tests/elasticsearch-rest/src/main/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestRoutes.java
+++
b/integration-tests/elasticsearch-rest/src/main/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestRoutes.java
@@ -26,17 +26,41 @@ public class ElasticsearchRestRoutes extends RouteBuilder {
@Override
public void configure() {
- from("direct:index")
-
.toD("${header.component}://elasticsearch?operation=Index&indexName=test");
+ from("direct:bulk")
+ .toD("${header.component}://elasticsearch?operation=Bulk");
+
+ from("direct:bulkIndex")
+
.toD("${header.component}://elasticsearch?operation=BulkIndex");
+
+ from("direct:delete")
+ .toD("${header.component}://elasticsearch?operation=Delete");
+
+ from("direct:deleteIndex")
+
.to("elasticsearch-rest://elasticsearch?operation=DeleteIndex");
+
+ from("direct:exists")
+ .toD("${header.component}://elasticsearch?operation=Exists");
from("direct:get")
-
.toD("${header.component}://elasticsearch?operation=GetById&indexName=test");
+ .toD("${header.component}://elasticsearch?operation=GetById");
- from("direct:update")
-
.toD("${header.component}://elasticsearch?operation=Update&indexName=test");
+ from("direct:index")
+ .toD("${header.component}://elasticsearch?operation=Index");
- from("direct:delete")
-
.toD("${header.component}://elasticsearch?operation=Delete&indexName=test");
+ from("direct:multiGet")
+ .toD("${header.component}://elasticsearch?operation=MultiGet");
+
+ from("direct:multiSearch")
+
.toD("${header.component}://elasticsearch?operation=MultiSearch");
+
+ from("direct:ping")
+ .toD("${header.component}://elasticsearch?operation=Ping");
+
+ from("direct:search")
+ .toD("${header.component}://elasticsearch?operation=Search");
+
+ from("direct:update")
+ .toD("${header.component}://elasticsearch?operation=Update");
}
@Named("elasticsearch-rest-quarkus")
diff --git
a/integration-tests/elasticsearch-rest/src/test/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticSearchTestResource.java
b/integration-tests/elasticsearch-rest/src/test/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticSearchTestResource.java
index 6c05588..6bf5b31 100644
---
a/integration-tests/elasticsearch-rest/src/test/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticSearchTestResource.java
+++
b/integration-tests/elasticsearch-rest/src/test/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticSearchTestResource.java
@@ -30,7 +30,9 @@ import org.testcontainers.utility.TestcontainersConfiguration;
public class ElasticSearchTestResource implements
QuarkusTestResourceLifecycleManager {
private static final Logger LOGGER =
LoggerFactory.getLogger(ElasticSearchTestResource.class);
- private static final String ELASTICSEARCH_IMAGE = "elasticsearch:7.8.0";
+ private static final String ELASTICSEARCH_IMAGE = "elasticsearch:7.10.1";
+ private static final String ELASTICSEARCH_USERNAME = "elastic";
+ private static final String ELASTICSEARCH_PASSWORD = "changeme";
private static final int ELASTICSEARCH_PORT = 9200;
private GenericContainer container;
@@ -44,6 +46,9 @@ public class ElasticSearchTestResource implements
QuarkusTestResourceLifecycleMa
.withExposedPorts(ELASTICSEARCH_PORT)
.withLogConsumer(new Slf4jLogConsumer(LOGGER))
.withEnv("discovery.type", "single-node")
+ .withEnv("xpack.security.enabled", "true")
+ .withEnv("ELASTIC_USERNAME", ELASTICSEARCH_USERNAME)
+ .withEnv("ELASTIC_PASSWORD", ELASTICSEARCH_PASSWORD)
.waitingFor(Wait.forListeningPort());
container.start();
@@ -56,9 +61,13 @@ public class ElasticSearchTestResource implements
QuarkusTestResourceLifecycleMa
return CollectionHelper.mapOf(
// quarkus
"quarkus.elasticsearch.hosts", hostAddresses,
+ "quarkus.elasticsearch.username", ELASTICSEARCH_USERNAME,
+ "quarkus.elasticsearch.password", ELASTICSEARCH_PASSWORD,
// camel
"camel.component.elasticsearch-rest.autowired-enabled",
"false",
- "camel.component.elasticsearch-rest.host-addresses",
hostAddresses);
+ "camel.component.elasticsearch-rest.host-addresses",
hostAddresses,
+ "camel.component.elasticsearch-rest.user",
ELASTICSEARCH_USERNAME,
+ "camel.component.elasticsearch-rest.password",
ELASTICSEARCH_PASSWORD);
} catch (Exception e) {
throw new RuntimeException(e);
diff --git
a/integration-tests/elasticsearch-rest/src/test/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestTest.java
b/integration-tests/elasticsearch-rest/src/test/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestTest.java
index 23cdd64..a1d2e4d 100644
---
a/integration-tests/elasticsearch-rest/src/test/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestTest.java
+++
b/integration-tests/elasticsearch-rest/src/test/java/org/apache/camel/quarkus/component/elasticsearch/rest/it/ElasticsearchRestTest.java
@@ -16,29 +16,59 @@
*/
package org.apache.camel.quarkus.component.elasticsearch.rest.it;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
+import org.awaitility.Awaitility;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertEquals;
@QuarkusTest
@QuarkusTestResource(ElasticSearchTestResource.class)
class ElasticsearchRestTest {
+ @AfterEach
+ public void afterEach() {
+ // Clean up all indexed data
+ RestAssured.given()
+ .queryParam("component", "elasticsearch-rest")
+ .queryParam("indexName", "_all")
+ .delete("/elasticsearch-rest/delete/index")
+ .then()
+ .statusCode(200)
+ .body(is("true"));
+ }
+
@ParameterizedTest
@MethodSource("componentNames")
- public void testElasticsearchRestComponent(String component) {
- String message = "Hello Camel Quarkus Elasticsearch";
+ public void testElasticsearchBasicOperations(String component) {
+ String indexName = UUID.randomUUID().toString();
+ String indexKey = "test-key";
+ String indexValue = "Hello Camel Quarkus ElasticSearch REST";
+
+ // Verify the ElasticSearch server is available
+ RestAssured.given()
+ .queryParam("component", component)
+ .get("/elasticsearch-rest/ping")
+ .then()
+ .statusCode(200)
+ .body(is("true"));
// Index data
String indexId = RestAssured.given()
.queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .queryParam("indexKey", indexKey)
.contentType(ContentType.TEXT)
- .body(message)
+ .body(indexValue)
.post("/elasticsearch-rest/index")
.then()
.statusCode(201)
@@ -46,22 +76,35 @@ class ElasticsearchRestTest {
.body()
.asString();
+ // Verify index exists
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .get("/elasticsearch-rest/exists")
+ .then()
+ .statusCode(200)
+ .body(is("true"));
+
// Retrieve indexed data
RestAssured.given()
.queryParam("component", component)
+ .queryParam("indexName", indexName)
.queryParam("indexId", indexId)
+ .queryParam("indexKey", indexKey)
.get("/elasticsearch-rest/get")
.then()
.statusCode(200)
- .body(is(message));
+ .body(is(indexValue));
// Update indexed data
- String updatedMessage = message + " Updated";
+ String updatedIndexValue = indexValue + " Updated";
RestAssured.given()
.contentType(ContentType.TEXT)
.queryParam("component", component)
.queryParam("indexId", indexId)
- .body(updatedMessage)
+ .queryParam("indexName", indexName)
+ .queryParam("indexKey", indexKey)
+ .body(updatedIndexValue)
.patch("/elasticsearch-rest/update")
.then()
.statusCode(200);
@@ -69,15 +112,18 @@ class ElasticsearchRestTest {
// Verify updated data
RestAssured.given()
.queryParam("component", component)
+ .queryParam("indexName", indexName)
.queryParam("indexId", indexId)
+ .queryParam("indexKey", indexKey)
.get("/elasticsearch-rest/get")
.then()
.statusCode(200)
- .body(is(updatedMessage));
+ .body(is(updatedIndexValue));
// Delete indexed data
RestAssured.given()
.queryParam("component", component)
+ .queryParam("indexName", indexName)
.queryParam("indexId", indexId)
.delete("/elasticsearch-rest/delete")
.then()
@@ -86,12 +132,244 @@ class ElasticsearchRestTest {
// Verify data deleted
RestAssured.given()
.queryParam("component", component)
+ .queryParam("indexName", indexName)
.queryParam("indexId", indexId)
+ .queryParam("indexKey", indexKey)
.get("/elasticsearch-rest/get")
.then()
.statusCode(404);
}
+ @ParameterizedTest
+ @MethodSource("componentNames")
+ public void testElasticsearchBulk(String component) {
+ String indexName = UUID.randomUUID().toString();
+
+ String indexId = RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .post("/elasticsearch-rest/bulk")
+ .then()
+ .statusCode(200)
+ .extract()
+ .body()
+ .asString();
+
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .get("/elasticsearch-rest/exists")
+ .then()
+ .statusCode(200)
+ .body(is("true"));
+
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .queryParam("indexId", indexId)
+ .queryParam("indexKey", "camel")
+ .get("/elasticsearch-rest/get")
+ .then()
+ .statusCode(200)
+ .body(is("quarkus"));
+ }
+
+ @ParameterizedTest
+ @MethodSource("componentNames")
+ public void testElasticsearchBulkIndex(String component) {
+ String indexName = UUID.randomUUID().toString();
+ String indexId = RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .post("/elasticsearch-rest/bulk/index")
+ .then()
+ .statusCode(200)
+ .extract()
+ .body()
+ .asString();
+ assertEquals(2, indexId.split(",").length);
+ }
+
+ @ParameterizedTest
+ @MethodSource("componentNames")
+ public void testElasticsearchDeleteIndex(String component) {
+ String indexName = UUID.randomUUID().toString();
+ String indexKey = "test-key";
+ String indexValue = "Hello Camel Quarkus ElasticSearch REST";
+
+ // Index data
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .queryParam("indexKey", indexKey)
+ .contentType(ContentType.TEXT)
+ .body(indexValue)
+ .post("/elasticsearch-rest/index")
+ .then()
+ .statusCode(201)
+ .extract()
+ .body()
+ .asString();
+
+ // Verify index exists
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .get("/elasticsearch-rest/exists")
+ .then()
+ .statusCode(200)
+ .body(is("true"));
+
+ // Delete indexed data
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .delete("/elasticsearch-rest/delete/index")
+ .then()
+ .statusCode(200)
+ .body(is("true"));
+ }
+
+ @ParameterizedTest
+ @MethodSource("componentNames")
+ public void testElasticsearchSearch(String component) {
+ String indexName = UUID.randomUUID().toString();
+ String indexKey = "camel-quarkus";
+ String indexValue = "Sub Atomic, Super Fast Camel Quarkus";
+
+ // Index data
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .queryParam("indexKey", indexKey)
+ .contentType(ContentType.TEXT)
+ .body(indexValue)
+ .post("/elasticsearch-rest/index")
+ .then()
+ .statusCode(201)
+ .extract()
+ .body()
+ .asString();
+
+ // Verify index exists
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .get("/elasticsearch-rest/exists")
+ .then()
+ .statusCode(200)
+ .body(is("true"));
+
+ // Search data
+ Awaitility.await().pollInterval(50, TimeUnit.MILLISECONDS).atMost(10,
TimeUnit.SECONDS).until(() -> {
+ String searchResult = RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexKey", indexKey)
+ .body("Super Fast")
+ .get("/elasticsearch-rest/search")
+ .then()
+ .statusCode(200)
+ .extract()
+ .body()
+ .asString();
+ return searchResult.equals(indexValue);
+ });
+ }
+
+ @ParameterizedTest
+ @MethodSource("componentNames")
+ public void testElasticsearchSearchJSON(String component) {
+ String indexName = UUID.randomUUID().toString();
+ String indexKey = "camel-quarkus";
+ String indexValue = "Sub Atomic, Super Fast Camel Quarkus";
+
+ // Index data
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .queryParam("indexKey", indexKey)
+ .contentType(ContentType.TEXT)
+ .body(indexValue)
+ .post("/elasticsearch-rest/index")
+ .then()
+ .statusCode(201)
+ .extract()
+ .body()
+ .asString();
+
+ // Verify index exists
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .get("/elasticsearch-rest/exists")
+ .then()
+ .statusCode(200)
+ .body(is("true"));
+
+ // Search data
+ Awaitility.await().pollInterval(50, TimeUnit.MILLISECONDS).atMost(10,
TimeUnit.SECONDS).until(() -> {
+ String searchResult = RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexKey", indexKey)
+ .body("Super Fast")
+ .get("/elasticsearch-rest/search/json")
+ .then()
+ .statusCode(200)
+ .extract()
+ .body()
+ .asString();
+ return searchResult.equals(indexValue);
+ });
+ }
+
+ @ParameterizedTest
+ @MethodSource("componentNames")
+ public void testElasticsearchMultiSearch(String component) {
+ String indexName = UUID.randomUUID().toString();
+ String indexKey = "camel-quarkus";
+ String indexValue = "Sub Atomic, Super Fast Camel Quarkus";
+
+ // Index data
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .queryParam("indexKey", indexKey)
+ .contentType(ContentType.TEXT)
+ .body(indexValue)
+ .post("/elasticsearch-rest/index")
+ .then()
+ .statusCode(201)
+ .extract()
+ .body()
+ .asString();
+
+ // Verify index exists
+ RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .get("/elasticsearch-rest/exists")
+ .then()
+ .statusCode(200)
+ .body(is("true"));
+
+ // Search data
+ Awaitility.await().pollInterval(50, TimeUnit.MILLISECONDS).atMost(10,
TimeUnit.SECONDS).until(() -> {
+ String hits = RestAssured.given()
+ .queryParam("component", component)
+ .queryParam("indexName", indexName)
+ .queryParam("indexKey", indexKey)
+ .body("Sub Atomic,Super Fast")
+ .get("/elasticsearch-rest/search/multi")
+ .then()
+ .statusCode(200)
+ .extract()
+ .body()
+ .asString();
+ return hits.equals("2");
+ });
+ }
+
+ @SuppressWarnings("unused")
private static String[] componentNames() {
return new String[] { "elasticsearch-rest",
"elasticsearch-rest-quarkus" };
}