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" };
     }

Reply via email to