You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2023/04/06 12:34:07 UTC
[camel-quarkus] 01/06: Ref #4596: Expand JDBC tests - named parameters and samples (#4655)
This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch 2.13.x
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit ad9c3b1f255c7e2acd214b29fb5f5ab800c60a6c
Author: Lucia Drozdová <89...@users.noreply.github.com>
AuthorDate: Fri Mar 24 14:27:02 2023 +0100
Ref #4596: Expand JDBC tests - named parameters and samples (#4655)
* Ref #4596: Expand JDBC tests - named parameters and samples
* Fix imports
---
integration-tests/jdbc/pom.xml | 80 ++++++++++++++-
.../quarkus/component/jdbc/CamelResource.java | 78 ++++++++++++++-
.../camel/quarkus/component/jdbc/JdbcRoutes.java | 67 +++++++++++++
.../quarkus/component/jdbc/CamelJdbcTest.java | 111 +++++++++++++++++++++
4 files changed, 333 insertions(+), 3 deletions(-)
diff --git a/integration-tests/jdbc/pom.xml b/integration-tests/jdbc/pom.xml
index 11f753b626..c9fc80fb88 100644
--- a/integration-tests/jdbc/pom.xml
+++ b/integration-tests/jdbc/pom.xml
@@ -17,7 +17,8 @@
limitations under the License.
-->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.camel.quarkus</groupId>
@@ -39,6 +40,14 @@
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-log</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-timer</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-bean</artifactId>
+ </dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
@@ -47,6 +56,18 @@
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-h2</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-direct</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.quarkus</groupId>
+ <artifactId>quarkus-resteasy-jsonb</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-mock</artifactId>
+ </dependency>
<!-- test dependencies -->
<dependency>
@@ -64,6 +85,11 @@
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.awaitility</groupId>
+ <artifactId>awaitility</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
@@ -104,6 +130,19 @@
</activation>
<dependencies>
<!-- 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>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-direct-deployment</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>*</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-jdbc-deployment</artifactId>
@@ -130,6 +169,45 @@
</exclusion>
</exclusions>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-mock-deployment</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>*</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-timer-deployment</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>*</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-bean-deployment</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>*</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
</dependencies>
</profile>
</profiles>
diff --git a/integration-tests/jdbc/src/main/java/org/apache/camel/quarkus/component/jdbc/CamelResource.java b/integration-tests/jdbc/src/main/java/org/apache/camel/quarkus/component/jdbc/CamelResource.java
index 90312e8767..6bdc09f67f 100644
--- a/integration-tests/jdbc/src/main/java/org/apache/camel/quarkus/component/jdbc/CamelResource.java
+++ b/integration-tests/jdbc/src/main/java/org/apache/camel/quarkus/component/jdbc/CamelResource.java
@@ -17,10 +17,11 @@
package org.apache.camel.quarkus.component.jdbc;
import java.sql.Connection;
-import java.sql.SQLException;
import java.sql.Statement;
+import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
@@ -35,7 +36,9 @@ import javax.ws.rs.core.MediaType;
import io.agroal.api.AgroalDataSource;
import io.quarkus.agroal.DataSource;
+import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.quarkus.component.jdbc.model.Camel;
@Path("/test")
@@ -48,18 +51,27 @@ public class CamelResource {
@Inject
ProducerTemplate template;
+ @Inject
+ CamelContext context;
+
@PostConstruct
- void postConstruct() throws SQLException {
+ void postConstruct() throws Exception {
try (Connection con = dataSource.getConnection()) {
try (Statement statement = con.createStatement()) {
try {
statement.execute("drop table camels");
+ statement.execute("drop table camelsGenerated");
} catch (Exception ignored) {
}
statement.execute("create table camels (id int primary key, species varchar(255))");
+ statement.execute("create table camelsGenerated (id int primary key auto_increment, species varchar(255))");
+ statement.execute("create table camelsProcessed (id int primary key auto_increment, species varchar(255))");
+ statement.execute("insert into camelsGenerated (species) values ('Camelus status'), ('Camelus linus')");
statement.execute("insert into camels (id, species) values (1, 'Camelus dromedarius')");
statement.execute("insert into camels (id, species) values (2, 'Camelus bactrianus')");
statement.execute("insert into camels (id, species) values (3, 'Camelus ferus')");
+
+ context.getRouteController().startRoute("jdbc-poll");
}
}
}
@@ -110,4 +122,66 @@ public class CamelResource {
public String executeStatement(String statement) throws Exception {
return template.requestBody("jdbc:camel-ds", statement, String.class);
}
+
+ @Path("/generated-keys/rows")
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public List generatedKeysRows() throws Exception {
+ return template.requestBodyAndHeader("direct://get-generated-keys",
+ "insert into camelsGenerated (species) values ('Camelus testus'), ('Camelus legendarius')",
+ "CamelRetrieveGeneratedKeys", "true", ArrayList.class);
+ }
+
+ @Path("/headers/insert")
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public String headersFromInsertOrUpdate() throws Exception {
+ return template.requestBodyAndHeader("direct://get-headers",
+ "insert into camelsGenerated (species) values ('Camelus status'), ('Camelus linus')",
+ "CamelRetrieveGeneratedKeys", "true", String.class);
+ }
+
+ @Path("/headers/select")
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public String headersFromSelect() throws Exception {
+ return template.requestBody("direct://get-headers", "select * from camelsGenerated", String.class);
+ }
+
+ @Path("/named-parameters/headers-as-parameters")
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public String headersAsParameters() throws Exception {
+ return template.requestBodyAndHeader("direct://headers-as-parameters",
+ "select * from camels where id < :?idmax order by id",
+ "idmax", "3", String.class);
+ }
+
+ @Path("/named-parameters/headers-as-parameters-map")
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public String headersAsParametersMap() throws Exception {
+ Map<String, String> headersMap = Map.of("idmax", "3", "specs", "Camelus bactrianus");
+ return template.requestBodyAndHeader("direct://headers-as-parameters",
+ "select * from camels where id < :?idmax and species = :?specs order by id",
+ "CamelJdbcParameters", headersMap, String.class);
+ }
+
+ @Path("/interval-polling")
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public void intervalPolling(String selectResult) throws Exception {
+ MockEndpoint mockEndpoint = context.getEndpoint("mock:interval-polling", MockEndpoint.class);
+ mockEndpoint.expectedBodiesReceived(selectResult);
+
+ mockEndpoint.assertIsSatisfied();
+ }
+
+ @Path("/move-between-datasources")
+ @POST
+ @Produces(MediaType.APPLICATION_JSON)
+ public String moveBetweenDatasources() throws Exception {
+ return template.requestBody("direct://move-between-datasources", null, String.class);
+ }
+
}
diff --git a/integration-tests/jdbc/src/main/java/org/apache/camel/quarkus/component/jdbc/JdbcRoutes.java b/integration-tests/jdbc/src/main/java/org/apache/camel/quarkus/component/jdbc/JdbcRoutes.java
new file mode 100644
index 0000000000..ad47740886
--- /dev/null
+++ b/integration-tests/jdbc/src/main/java/org/apache/camel/quarkus/component/jdbc/JdbcRoutes.java
@@ -0,0 +1,67 @@
+/*
+ * 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.jdbc;
+
+import javax.enterprise.context.ApplicationScoped;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.jboss.logging.Logger;
+
+@ApplicationScoped
+public class JdbcRoutes extends RouteBuilder {
+ private static final Logger LOG = Logger.getLogger(JdbcRoutes.class);
+
+ @Override
+ public void configure() {
+ from("direct://get-generated-keys")
+ .to("jdbc:camel-ds")
+ .process(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ Object in = exchange.getIn().getHeader("CamelGeneratedKeysRows");
+ exchange.getIn().setBody(in);
+ }
+ });
+
+ from("direct://get-headers")
+ .to("jdbc:camel-ds")
+ .process(new Processor() {
+ @Override
+ public void process(Exchange exchange) throws Exception {
+ Object in = exchange.getIn().getHeaders();
+ exchange.getIn().setBody(in);
+ }
+ });
+
+ from("direct://headers-as-parameters")
+ .to("jdbc:camel-ds?useHeadersAsParameters=true");
+
+ from("timer://interval-polling?delay=2000&repeatCount=1").routeId("jdbc-poll").autoStartup(false)
+ .setBody(constant("select * from camelsGenerated order by id desc"))
+ .to("jdbc:camel-ds")
+ .to("mock:interval-polling");
+
+ from("direct://move-between-datasources")
+ .setBody(constant("select * from camels"))
+ .to("jdbc:camel-ds")
+ .split(body())
+ .setBody(simple("insert into camelsProcessed values('${body[ID]}','${body[SPECIES]}')"))
+ .to("jdbc:camel-ds");
+ }
+}
diff --git a/integration-tests/jdbc/src/test/java/org/apache/camel/quarkus/component/jdbc/CamelJdbcTest.java b/integration-tests/jdbc/src/test/java/org/apache/camel/quarkus/component/jdbc/CamelJdbcTest.java
index f29fefe0f4..9fe7dad4af 100644
--- a/integration-tests/jdbc/src/test/java/org/apache/camel/quarkus/component/jdbc/CamelJdbcTest.java
+++ b/integration-tests/jdbc/src/test/java/org/apache/camel/quarkus/component/jdbc/CamelJdbcTest.java
@@ -16,6 +16,8 @@
*/
package org.apache.camel.quarkus.component.jdbc;
+import java.util.List;
+
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.h2.H2DatabaseTestResource;
import io.quarkus.test.junit.QuarkusTest;
@@ -23,7 +25,11 @@ import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.Test;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.jupiter.api.Assertions.assertTrue;
@QuarkusTest
@QuarkusTestResource(H2DatabaseTestResource.class)
@@ -53,4 +59,109 @@ public class CamelJdbcTest {
.post("/test/execute")
.then().body(is("[{ID=3}, {ID=2}, {ID=1}]"));
}
+
+ @Test
+ void testCamelRetrieveGeneratedKeysHeader() {
+ List generatedIDs = RestAssured.given()
+ .get("test/generated-keys/rows")
+ .then().extract().body()
+ .jsonPath().getList("ID");
+
+ String selectResult = RestAssured.given()
+ .contentType(ContentType.TEXT).body("select id from camelsGenerated")
+ .post("/test/execute")
+ .then().extract().body().asString();
+
+ generatedIDs.forEach(generatedID -> assertTrue(selectResult.contains(generatedID.toString())));
+ }
+
+ @Test
+ void testHeadersFromInsertOrUpdateQuery() {
+ RestAssured.given()
+ .get("test/headers/insert")
+ .then()
+ .body(containsString("CamelGeneratedKeysRowCount=2"))
+ .and()
+ .body(containsString("CamelJdbcUpdateCount=2"))
+ .and()
+ .body(containsString("CamelRetrieveGeneratedKeys=true"))
+ .and()
+ .body(not(containsString("CamelJdbcRowCount")))
+ .and()
+ .body(not(containsString("CamelJdbcColumnNames")))
+ .and()
+ .body(not(containsString("CamelJdbcParameters")))
+ .and()
+ .body(not(containsString("CamelGeneratedColumns")));
+ }
+
+ @Test
+ void testHeadersFromSelectQuery() {
+ RestAssured.given()
+ .get("test/headers/select")
+ .then()
+ .body(not(containsString("CamelGeneratedKeysRowCount")))
+ .and()
+ .body(not(containsString("CamelJdbcUpdateCount")))
+ .and()
+ .body(not(containsString("CamelRetrieveGeneratedKeys")))
+ .and()
+ .body(not(containsString("CamelJdbcParameters")))
+ .and()
+ .body(not(containsString("CamelGeneratedColumns")))
+ .and()
+ .body(containsString("CamelJdbcRowCount"))
+ .and()
+ .body(containsString("CamelJdbcColumnNames=[ID, SPECIES]"));
+ }
+
+ @Test
+ void testNamedParameters() {
+ RestAssured.given()
+ .get("test/named-parameters/headers-as-parameters")
+ .then()
+ .body(containsString("{ID=1, SPECIES=Camelus dromedarius}"))
+ .and()
+ .body(containsString("{ID=2, SPECIES=Camelus bactrianus}"));
+ }
+
+ @Test
+ void testCamelJdbcParametersHeader() {
+ RestAssured.given()
+ .get("test/named-parameters/headers-as-parameters-map")
+ .then()
+ .body(containsString("{ID=2, SPECIES=Camelus bactrianus}"));
+ }
+
+ @Test
+ void testTimeIntervalDatabasePolling() {
+ String selectResult = RestAssured.given()
+ .contentType(ContentType.TEXT).body("select * from camelsGenerated order by id desc")
+ .post("/test/execute")
+ .then().extract().body().asString();
+
+ RestAssured.given()
+ .body(selectResult)
+ .get("/test/interval-polling")
+ .then()
+ .statusCode(204);
+ }
+
+ @Test
+ void testMoveDataBetweenDatasources() {
+ String camelsDbResult = RestAssured.given()
+ .contentType(ContentType.TEXT).body("select * from camels order by id desc")
+ .post("/test/execute")
+ .then().extract().body().asString();
+
+ RestAssured.given()
+ .post("test/move-between-datasources");
+
+ RestAssured.given()
+ .contentType(ContentType.TEXT).body("select * from camelsProcessed order by id desc")
+ .post("/test/execute")
+ .then()
+ .body(equalTo(camelsDbResult));
+ }
+
}