You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pp...@apache.org on 2022/04/18 20:58:27 UTC

[camel-quarkus] 05/11: Azure Storage Queue : increase Producer test coverage Fixes #3577

This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a commit to branch 2.7.x
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 6f38bca4a6d95dd5beb773507f5741647f3f5b09
Author: Zineb Bendhiba <be...@gmail.com>
AuthorDate: Fri Apr 8 17:24:48 2022 +0200

    Azure Storage Queue : increase Producer test coverage
    Fixes #3577
---
 .../azure/azure-storage-queue/pom.xml              |   2 +-
 .../queue/it/AzureStorageQueueResource.java        |  91 ++++++++++++++-
 .../storage/queue/it/model/ExampleMessage.java     |  53 +++++++++
 .../storage/queue/it/AzureStorageQueueTest.java    | 128 ++++++++++++++++++---
 integration-tests/azure-grouped/pom.xml            |   4 +
 5 files changed, 255 insertions(+), 23 deletions(-)

diff --git a/integration-test-groups/azure/azure-storage-queue/pom.xml b/integration-test-groups/azure/azure-storage-queue/pom.xml
index d2fd847bd6..3ee7ab0158 100644
--- a/integration-test-groups/azure/azure-storage-queue/pom.xml
+++ b/integration-test-groups/azure/azure-storage-queue/pom.xml
@@ -37,7 +37,7 @@
         </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy</artifactId>
+            <artifactId>quarkus-resteasy-jackson</artifactId>
         </dependency>
 
         <!-- test dependencies -->
diff --git a/integration-test-groups/azure/azure-storage-queue/src/main/java/org/apache/camel/quarkus/component/azure/storage/queue/it/AzureStorageQueueResource.java b/integration-test-groups/azure/azure-storage-queue/src/main/java/org/apache/camel/quarkus/component/azure/storage/queue/it/AzureStorageQueueResource.java
index cb32979d27..204aebeef2 100644
--- a/integration-test-groups/azure/azure-storage-queue/src/main/java/org/apache/camel/quarkus/component/azure/storage/queue/it/AzureStorageQueueResource.java
+++ b/integration-test-groups/azure/azure-storage-queue/src/main/java/org/apache/camel/quarkus/component/azure/storage/queue/it/AzureStorageQueueResource.java
@@ -17,6 +17,8 @@
 package org.apache.camel.quarkus.component.azure.storage.queue.it;
 
 import java.net.URI;
+import java.time.Duration;
+import java.util.HashMap;
 import java.util.List;
 import java.util.UUID;
 import java.util.stream.Collectors;
@@ -28,6 +30,7 @@ import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
@@ -38,9 +41,14 @@ import com.azure.core.util.BinaryData;
 import com.azure.storage.common.StorageSharedKeyCredential;
 import com.azure.storage.queue.QueueServiceClient;
 import com.azure.storage.queue.QueueServiceClientBuilder;
+import com.azure.storage.queue.models.PeekedMessageItem;
+import com.azure.storage.queue.models.QueueItem;
 import com.azure.storage.queue.models.QueueMessageItem;
+import com.azure.storage.queue.models.QueuesSegmentOptions;
 import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.azure.storage.queue.QueueConstants;
 import org.apache.camel.component.azure.storage.queue.QueueOperationDefinition;
+import org.apache.camel.quarkus.component.azure.storage.queue.it.model.ExampleMessage;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 
 @Path("/azure-storage-queue")
@@ -83,14 +91,28 @@ public class AzureStorageQueueResource {
 
     @Path("/queue/read")
     @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public String retrieveMessage() throws Exception {
+    @Produces(MediaType.APPLICATION_JSON)
+    public List<ExampleMessage> retrieveMessage() throws Exception {
         @SuppressWarnings("unchecked")
         List<QueueMessageItem> messages = producerTemplate.requestBody(
                 componentUri(QueueOperationDefinition.receiveMessages),
                 null, List.class);
         return messages.stream()
-                .map(QueueMessageItem::getBody)
+                .map(this::createMessage)
+                .collect(Collectors.toList());
+    }
+
+    @Path("/queue/peek")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public String peekOneMessage() throws Exception {
+        @SuppressWarnings("unchecked")
+        List<PeekedMessageItem> messages = producerTemplate.requestBodyAndHeader(
+                componentUri(QueueOperationDefinition.peekMessages),
+                null, QueueConstants.MAX_MESSAGES, 1,
+                List.class);
+        return messages.stream()
+                .map(PeekedMessageItem::getBody)
                 .map(BinaryData::toString)
                 .collect(Collectors.joining("\n"));
     }
@@ -105,6 +127,21 @@ public class AzureStorageQueueResource {
         return Response.created(new URI("https://camel.apache.org/")).build();
     }
 
+    @Path("/queue/list")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public String listQueues() throws Exception {
+        QueuesSegmentOptions queuesSegmentOptions = new QueuesSegmentOptions();
+        queuesSegmentOptions.setIncludeMetadata(true);
+        @SuppressWarnings("unchecked")
+        List<QueueItem> messages = producerTemplate.requestBodyAndHeader(
+                componentUri(QueueOperationDefinition.listQueues),
+                null, QueueConstants.QUEUES_SEGMENT_OPTIONS, queuesSegmentOptions, List.class);
+        return messages.stream()
+                .map(QueueItem::getName)
+                .collect(Collectors.joining("\n"));
+    }
+
     @Path("/queue/delete")
     @DELETE
     public Response deleteQueue() throws Exception {
@@ -114,10 +151,58 @@ public class AzureStorageQueueResource {
         return Response.noContent().build();
     }
 
+    @Path("/queue/delete/{id}/{popReceipt}")
+    @DELETE
+    public Response deleteMessageById(@PathParam("id") String id, @PathParam("popReceipt") String popReceipt) throws Exception {
+        var headers = new HashMap<String, Object>();
+        headers.put(QueueConstants.MESSAGE_ID, id);
+        headers.put(QueueConstants.POP_RECEIPT, popReceipt);
+        headers.put(QueueConstants.VISIBILITY_TIMEOUT, Duration.ofMillis(10));
+        producerTemplate.sendBodyAndHeaders(
+                componentUri(QueueOperationDefinition.deleteMessage),
+                null, headers);
+        return Response.noContent().build();
+    }
+
+    @Path("/queue/update/{id}/{popReceipt}")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    public Response addMessage(@PathParam("id") String id, @PathParam("popReceipt") String popReceipt, String message)
+            throws Exception {
+        var headers = new HashMap<String, Object>();
+        headers.put(QueueConstants.MESSAGE_ID, id);
+        headers.put(QueueConstants.POP_RECEIPT, popReceipt);
+        headers.put(QueueConstants.VISIBILITY_TIMEOUT, Duration.ofMillis(10));
+
+        producerTemplate.sendBodyAndHeaders(
+                componentUri(QueueOperationDefinition.updateMessage),
+                message,
+                headers);
+        return Response.created(new URI("https://camel.apache.org/")).build();
+    }
+
+    @Path("/queue/clear")
+    @GET
+    public Response clearQueue() throws Exception {
+        producerTemplate.sendBody(
+                componentUri(QueueOperationDefinition.clearQueue),
+                null);
+        return Response.noContent().build();
+    }
+
     private String componentUri(final QueueOperationDefinition operation) {
         return String.format("azure-storage-queue://%s/%s?operation=%s",
                 azureStorageAccountName, QUEUE_NAME,
                 operation.name());
     }
 
+    private ExampleMessage createMessage(final QueueMessageItem messageItem) {
+        var message = new ExampleMessage();
+        var binaryData = messageItem.getBody();
+        message.setBody(binaryData == null ? null : binaryData.toString());
+        message.setId(messageItem.getMessageId());
+        message.setPopReceipt(messageItem.getPopReceipt());
+        return message;
+    }
+
 }
diff --git a/integration-test-groups/azure/azure-storage-queue/src/main/java/org/apache/camel/quarkus/component/azure/storage/queue/it/model/ExampleMessage.java b/integration-test-groups/azure/azure-storage-queue/src/main/java/org/apache/camel/quarkus/component/azure/storage/queue/it/model/ExampleMessage.java
new file mode 100644
index 0000000000..b5c50e740f
--- /dev/null
+++ b/integration-test-groups/azure/azure-storage-queue/src/main/java/org/apache/camel/quarkus/component/azure/storage/queue/it/model/ExampleMessage.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.azure.storage.queue.it.model;
+
+import io.quarkus.runtime.annotations.RegisterForReflection;
+
+@RegisterForReflection
+public class ExampleMessage {
+    private String id;
+    private String body;
+    private String popReceipt;
+
+    public ExampleMessage() {
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+
+    public String getPopReceipt() {
+        return popReceipt;
+    }
+
+    public void setPopReceipt(String popReceipt) {
+        this.popReceipt = popReceipt;
+    }
+}
diff --git a/integration-test-groups/azure/azure-storage-queue/src/test/java/org/apache/camel/quarkus/component/azure/storage/queue/it/AzureStorageQueueTest.java b/integration-test-groups/azure/azure-storage-queue/src/test/java/org/apache/camel/quarkus/component/azure/storage/queue/it/AzureStorageQueueTest.java
index 7e7bd0bbb5..260c3df7e1 100644
--- a/integration-test-groups/azure/azure-storage-queue/src/test/java/org/apache/camel/quarkus/component/azure/storage/queue/it/AzureStorageQueueTest.java
+++ b/integration-test-groups/azure/azure-storage-queue/src/test/java/org/apache/camel/quarkus/component/azure/storage/queue/it/AzureStorageQueueTest.java
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.quarkus.component.azure.storage.queue.it;
 
+import java.util.LinkedHashMap;
+import java.util.List;
+
 import io.quarkus.test.common.QuarkusTestResource;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
@@ -23,7 +26,11 @@ import io.restassured.http.ContentType;
 import org.apache.camel.quarkus.test.support.azure.AzureStorageTestResource;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.core.Is.is;
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 @QuarkusTest
 @QuarkusTestResource(AzureStorageTestResource.class)
@@ -31,32 +38,115 @@ class AzureStorageQueueTest {
 
     @Test
     public void crud() {
-        String message = "Hello Camel Quarkus Azure Queue";
+        try {
+            String message = "Hello Camel Quarkus Azure Queue ";
 
-        // Create
-        RestAssured.given()
-                .contentType(ContentType.TEXT)
-                .post("/azure-storage-queue/queue/create")
-                .then()
-                .statusCode(201);
+            // Create
+            given()
+                    .contentType(ContentType.TEXT)
+                    .post("/azure-storage-queue/queue/create")
+                    .then()
+                    .statusCode(201);
+
+            // create 2 messages
+            for (int i = 1; i < 2; i++) {
+                addMessage(message + i);
+            }
+
+            // peek one message
+            RestAssured.get("/azure-storage-queue/queue/peek")
+                    .then()
+                    .statusCode(200)
+                    .body(is(message + "1"));
+
+            // Read 2 messages
+            List<LinkedHashMap<String, String>> response = null;
+            for (int i = 1; i < 2; i++) {
+                response = readMessage();
+                assertNotNull(response);
+                assertEquals(1, response.size());
+                assertNotNull(response.get(0));
+                assertEquals(message + i, response.get(0).get("body"));
+            }
+
+            // updating message
+            // get needed informations from last message
+            var id = response.get(0).get("id");
+            var popReceipt = response.get(0).get("popReceipt");
+
+            message = "Update Camel Quarkus example message";
+            given()
+                    .contentType(ContentType.TEXT)
+                    .body(message)
+                    .post(String.format("/azure-storage-queue/queue/update/%s/%s", id, popReceipt))
+                    .then()
+                    .statusCode(201);
+
+            // reading update message
+            response = readMessage();
+            assertNotNull(response);
+            assertNotNull(response.get(0));
+            assertEquals(message, response.get(0).get("body"));
+
+            // list queues
+            RestAssured.given()
+                    .contentType(ContentType.TEXT)
+                    .get("/azure-storage-queue/queue/list")
+                    .then()
+                    .statusCode(200)
+                    .body(containsString("camel-quarkus"));
+
+            // adding another message to the queue
+            addMessage(message);
 
-        RestAssured.given()
+            // clear queue
+            given()
+                    .get("/azure-storage-queue/queue/clear")
+                    .then()
+                    .statusCode(204);
+
+            // Read and make sure the queue was cleared
+            response = readMessage();
+            assertNotNull(response);
+            assertEquals(0, response.size());
+
+            // adding new message
+            addMessage(message);
+
+            // peek latest message
+            response = readMessage();
+            id = response.get(0).get("id");
+            popReceipt = response.get(0).get("popReceipt");
+
+            // delete message by id
+            RestAssured.delete("/azure-storage-queue/queue/delete/" + id + "/" + popReceipt)
+                    .then()
+                    .statusCode(204);
+
+        } finally {
+            // Delete
+            RestAssured.delete("/azure-storage-queue/queue/delete")
+                    .then()
+                    .statusCode(204);
+        }
+    }
+
+    private void addMessage(String message) {
+        given()
                 .contentType(ContentType.TEXT)
                 .body(message)
                 .post("/azure-storage-queue/queue/message")
                 .then()
                 .statusCode(201);
+    }
 
-        // Read
-        RestAssured.get("/azure-storage-queue/queue/read")
-                .then()
-                .statusCode(200)
-                .body(is(message));
-
-        // Delete
-        RestAssured.delete("/azure-storage-queue/queue/delete")
-                .then()
-                .statusCode(204);
+    @SuppressWarnings("unchecked")
+    private List<LinkedHashMap<String, String>> readMessage() {
+        return (List<LinkedHashMap<String, String>>) given()
+                .contentType(ContentType.JSON)
+                .when()
+                .get("/azure-storage-queue/queue/read")
+                .as(List.class);
     }
 
 }
diff --git a/integration-tests/azure-grouped/pom.xml b/integration-tests/azure-grouped/pom.xml
index 4ac8967205..202af91f98 100644
--- a/integration-tests/azure-grouped/pom.xml
+++ b/integration-tests/azure-grouped/pom.xml
@@ -40,6 +40,10 @@
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-resteasy</artifactId>
         </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-resteasy-jackson</artifactId>
+        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-resteasy-jsonb</artifactId>