This is an automated email from the ASF dual-hosted git repository. humbedooh pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit ddf4d9fd2d05ec302deb95354da4063f8138b50a Author: Zineb BENDHIBA <bendhiba.zi...@gmail.com> AuthorDate: Thu Apr 8 09:13:26 2021 +0200 couchbase JVM : add integration tests fixes #2326 (#2327) --- extensions-jvm/couchbase/integration-test/pom.xml | 15 +++ .../component/couchbase/it/CouchbaseResource.java | 71 ++++++++++-- ...CouchbaseTest.java => CouchbaseDeleteTest.java} | 29 ++++- .../{CouchbaseTest.java => CouchbasePollTest.java} | 25 +++-- .../couchbase/it/CouchbaseTestResource.java | 123 +++++++++++++++++++++ .../couchbase/it/CouchbaseUpdateTest.java | 55 +++++++++ poms/bom-test/pom.xml | 5 + 7 files changed, 299 insertions(+), 24 deletions(-) diff --git a/extensions-jvm/couchbase/integration-test/pom.xml b/extensions-jvm/couchbase/integration-test/pom.xml index f9bb400..67caa34 100644 --- a/extensions-jvm/couchbase/integration-test/pom.xml +++ b/extensions-jvm/couchbase/integration-test/pom.xml @@ -51,6 +51,21 @@ <artifactId>rest-assured</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-integration-testcontainers-support</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>couchbase</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/extensions-jvm/couchbase/integration-test/src/main/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseResource.java b/extensions-jvm/couchbase/integration-test/src/main/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseResource.java index 15fd254..118727e 100644 --- a/extensions-jvm/couchbase/integration-test/src/main/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseResource.java +++ b/extensions-jvm/couchbase/integration-test/src/main/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseResource.java @@ -18,34 +18,81 @@ package org.apache.camel.quarkus.component.couchbase.it; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.GET; +import javax.ws.rs.PUT; 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; -import org.apache.camel.CamelContext; +import com.couchbase.client.java.kv.GetResult; +import org.apache.camel.ConsumerTemplate; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.couchbase.CouchbaseConstants; +import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; +import static org.apache.camel.component.couchbase.CouchbaseConstants.COUCHBASE_DELETE; +import static org.apache.camel.component.couchbase.CouchbaseConstants.COUCHBASE_GET; + @Path("/couchbase") @ApplicationScoped +@Consumes(MediaType.TEXT_PLAIN) public class CouchbaseResource { private static final Logger LOG = Logger.getLogger(CouchbaseResource.class); - private static final String COMPONENT_COUCHBASE = "couchbase"; @Inject - CamelContext context; + ProducerTemplate producerTemplate; + @Inject + ConsumerTemplate consumerTemplate; + + @ConfigProperty(name = "couchbase.connection.uri") + String connectionUri; + @ConfigProperty(name = "couchbase.bucket.name") + String bucketName; + @ConfigProperty(name = "couchbase.timeout", defaultValue = "120000") + long timeout; + + @PUT + @Path("id/{id}") + @Produces(MediaType.TEXT_PLAIN) + public boolean insert(@PathParam("id") String id, String msg) { + LOG.infof("inserting message %s with id %s", msg, id); + String endpoint = String.format("%s&queryTimeout=%s", connectionUri, timeout); + return producerTemplate.requestBodyAndHeader(endpoint, msg, CouchbaseConstants.HEADER_ID, id, Boolean.class); + } + + @GET + @Path("{id}") + @Produces(MediaType.TEXT_PLAIN) + public String getById(@PathParam("id") String id) { + LOG.infof("Getting object with id : %s", id); + String endpoint = String.format("%s&operation=%s&queryTimeout=%s", connectionUri, COUCHBASE_GET, timeout); + GetResult result = producerTemplate.requestBodyAndHeader(endpoint, null, CouchbaseConstants.HEADER_ID, id, + GetResult.class); + return result != null ? result.contentAs(String.class) : null; + } + + @DELETE + @Path("{id}") + @Produces(MediaType.TEXT_PLAIN) + public boolean delete(@PathParam("id") String id) { + LOG.infof("Deleting object with id : %s", id); + String endpoint = String.format("%s&operation=%s&queryTimeout=%s", connectionUri, COUCHBASE_DELETE, timeout); + producerTemplate.sendBodyAndHeader(endpoint, null, CouchbaseConstants.HEADER_ID, id); + return true; + } - @Path("/load/component/couchbase") @GET + @Path("poll") @Produces(MediaType.TEXT_PLAIN) - public Response loadComponentCouchbase() throws Exception { - /* This is an autogenerated test */ - if (context.getComponent(COMPONENT_COUCHBASE) != null) { - return Response.ok().build(); - } - LOG.warnf("Could not load [%s] from the Camel context", COMPONENT_COUCHBASE); - return Response.status(500, COMPONENT_COUCHBASE + " could not be loaded from the Camel context").build(); + public String poll() { + LOG.infof("polling one document"); + String endpoint = String.format("%s&designDocumentName=%s&viewName=%s&limit=1", connectionUri, bucketName, bucketName); + GetResult result = consumerTemplate.receiveBody(endpoint, timeout, GetResult.class); + return result != null ? result.contentAs(String.class) : null; } } diff --git a/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseTest.java b/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseDeleteTest.java similarity index 56% copy from extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseTest.java copy to extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseDeleteTest.java index c98dadb..1c7c02f 100644 --- a/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseTest.java +++ b/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseDeleteTest.java @@ -16,19 +16,38 @@ */ package org.apache.camel.quarkus.component.couchbase.it; +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.common.http.TestHTTPEndpoint; import io.quarkus.test.junit.QuarkusTest; -import io.restassured.RestAssured; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.equalTo; @QuarkusTest -class CouchbaseTest { +@TestHTTPEndpoint(CouchbaseResource.class) +@QuarkusTestResource(CouchbaseTestResource.class) +@DisabledIfEnvironmentVariable(named = "CI", matches = "true") +class CouchbaseDeleteTest { @Test - public void loadComponentCouchbase() { - /* A simple autogenerated test */ - RestAssured.get("/couchbase/load/component/couchbase") + void testDelete() { + // getting the document + given() + .when() + .get("/DocumentID_1") + .then() + .statusCode(200) + .body(equalTo("hello1")); + + // deleting the document + given() + .when() + .delete("DocumentID_1") .then() .statusCode(200); + } } diff --git a/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseTest.java b/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbasePollTest.java similarity index 58% rename from extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseTest.java rename to extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbasePollTest.java index c98dadb..f9efba4 100644 --- a/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseTest.java +++ b/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbasePollTest.java @@ -16,19 +16,30 @@ */ package org.apache.camel.quarkus.component.couchbase.it; +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.common.http.TestHTTPEndpoint; import io.quarkus.test.junit.QuarkusTest; -import io.restassured.RestAssured; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.equalTo; @QuarkusTest -class CouchbaseTest { +@TestHTTPEndpoint(CouchbaseResource.class) +@QuarkusTestResource(CouchbaseTestResource.class) +@DisabledIfEnvironmentVariable(named = "CI", matches = "true") +public class CouchbasePollTest { @Test - public void loadComponentCouchbase() { - /* A simple autogenerated test */ - RestAssured.get("/couchbase/load/component/couchbase") + void testPoll() { + // poll the first document + String message = "hello0"; + given() + .when() + .get("/poll") .then() - .statusCode(200); + .statusCode(200) + .body(equalTo(message)); } - } diff --git a/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseTestResource.java b/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseTestResource.java new file mode 100644 index 0000000..bd3177d --- /dev/null +++ b/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseTestResource.java @@ -0,0 +1,123 @@ +/* + * 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.couchbase.it; + +import java.time.Duration; +import java.util.Collections; +import java.util.Map; + +import com.couchbase.client.java.Cluster; +import com.couchbase.client.java.manager.bucket.BucketSettings; +import com.couchbase.client.java.manager.bucket.BucketType; +import com.couchbase.client.java.manager.view.DesignDocument; +import com.couchbase.client.java.manager.view.View; +import com.couchbase.client.java.view.DesignDocumentNamespace; +import org.apache.camel.quarkus.testcontainers.ContainerResourceLifecycleManager; +import org.apache.camel.util.CollectionHelper; +import org.testcontainers.couchbase.CouchbaseContainer; +import org.testcontainers.utility.DockerImageName; + +public class CouchbaseTestResource implements ContainerResourceLifecycleManager { + private final static DockerImageName COUCHBASE_IMAGE = DockerImageName.parse("couchbase/server:6.5.1"); + public static final int KV_PORT = 11210; + public static final int MANAGEMENT_PORT = 8091; + public static final int VIEW_PORT = 8092; + public static final int QUERY_PORT = 8093; + public static final int SEARCH_PORT = 8094; + protected String bucketName = "testBucket"; + + private CustomCouchbaseContainer container; + protected Cluster cluster; + + private class CustomCouchbaseContainer extends CouchbaseContainer { + public CustomCouchbaseContainer() { + super(COUCHBASE_IMAGE); + + addFixedExposedPort(KV_PORT, KV_PORT); + addFixedExposedPort(MANAGEMENT_PORT, MANAGEMENT_PORT); + addFixedExposedPort(VIEW_PORT, VIEW_PORT); + addFixedExposedPort(QUERY_PORT, QUERY_PORT); + addFixedExposedPort(SEARCH_PORT, SEARCH_PORT); + } + } + + @Override + public Map<String, String> start() { + container = new CustomCouchbaseContainer(); + container.start(); + + initBucket(); + + return CollectionHelper.mapOf("couchbase.connection.uri", getConnectionUri(), + "couchbase.bucket.name", bucketName); + } + + @Override + public void stop() { + if (cluster != null) { + cluster.buckets().dropBucket(bucketName); + cluster.disconnect(); + } + if (container != null) { + container.stop(); + } + } + + public String getConnectionUri() { + return String.format("couchbase:http://%s:%d?bucket=%s&username=%s&password=%s", getHostname(), + getPort(), bucketName, getUsername(), getPassword()); + } + + public String getUsername() { + return container.getUsername(); + } + + public String getPassword() { + return container.getPassword(); + } + + public String getHostname() { + return container.getHost(); + } + + public int getPort() { + return container.getBootstrapHttpDirectPort(); + } + + private void initBucket() { + cluster = Cluster.connect(container.getConnectionString(), this.getUsername(), this.getPassword()); + + cluster.buckets().createBucket( + BucketSettings.create(bucketName).bucketType(BucketType.COUCHBASE).flushEnabled(true)); + + cluster.bucket(bucketName); + DesignDocument designDoc = new DesignDocument( + bucketName, + Collections.singletonMap(bucketName, new View("function (doc, meta) { emit(meta.id, doc);}"))); + cluster.bucket(bucketName).viewIndexes().upsertDesignDocument(designDoc, DesignDocumentNamespace.PRODUCTION); + // wait for cluster + cluster.bucket(bucketName).waitUntilReady(Duration.ofSeconds(30)); + + // insert some documents + for (int i = 0; i < 3; i++) { + cluster.bucket(bucketName).defaultCollection().upsert("DocumentID_" + i, "hello" + i); + } + + // wait for cluster + cluster.bucket(bucketName).waitUntilReady(Duration.ofSeconds(30)); + } +} diff --git a/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseUpdateTest.java b/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseUpdateTest.java new file mode 100644 index 0000000..d8ea416 --- /dev/null +++ b/extensions-jvm/couchbase/integration-test/src/test/java/org/apache/camel/quarkus/component/couchbase/it/CouchbaseUpdateTest.java @@ -0,0 +1,55 @@ +/* + * 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.couchbase.it; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.common.http.TestHTTPEndpoint; +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.http.ContentType; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.equalTo; + +@QuarkusTest +@TestHTTPEndpoint(CouchbaseResource.class) +@QuarkusTestResource(CouchbaseTestResource.class) +@DisabledIfEnvironmentVariable(named = "CI", matches = "true") +public class CouchbaseUpdateTest { + + @Test + void testUpdate() { + // updating the document + given() + .contentType(ContentType.TEXT) + .body("updating hello2") + .when() + .put("/id/DocumentID_2") + .then() + .statusCode(200) + .body(equalTo("true")); + + // check the result of update + given() + .when() + .get("/DocumentID_2") + .then() + .statusCode(200) + .body(equalTo("updating hello2")); + } +} diff --git a/poms/bom-test/pom.xml b/poms/bom-test/pom.xml index 9dd6e36..f7c94f7 100644 --- a/poms/bom-test/pom.xml +++ b/poms/bom-test/pom.xml @@ -169,6 +169,11 @@ </dependency> <dependency> <groupId>org.testcontainers</groupId> + <artifactId>couchbase</artifactId> + <version>${testcontainers.version}</version> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> <artifactId>localstack</artifactId> <version>${testcontainers.version}</version> </dependency>