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>