This is an automated email from the ASF dual-hosted git repository. zhfeng pushed a commit to branch 2.13.x in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 8c368fa7d6d7fabef7841b1c2c31be2b811b7515 Author: Zheng Feng <zh.f...@gmail.com> AuthorDate: Wed Apr 12 22:26:46 2023 +0800 Fix #4717 to expand camel-quarkus-mybatis test coverage --- integration-tests/mybatis/pom.xml | 4 +- .../quarkus/component/mybatis/it/MyBatisRoute.java | 36 +++++- .../component/mybatis/it/MybatisResource.java | 67 ++++++++++ .../src/main/resources/application.properties | 2 + .../mybatis/src/main/resources/insert.sql | 7 +- .../component/mybatis/it/MyBatisConsumerTest.java | 47 +++++++ .../quarkus/component/mybatis/it/MyBatisTest.java | 141 ++++++++++++++++++++- 7 files changed, 292 insertions(+), 12 deletions(-) diff --git a/integration-tests/mybatis/pom.xml b/integration-tests/mybatis/pom.xml index e45bc4f85e..9243f2d594 100644 --- a/integration-tests/mybatis/pom.xml +++ b/integration-tests/mybatis/pom.xml @@ -37,11 +37,11 @@ </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-mock</artifactId> + <artifactId>camel-quarkus-jta</artifactId> </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-jta</artifactId> + <artifactId>camel-quarkus-mock</artifactId> </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> diff --git a/integration-tests/mybatis/src/main/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisRoute.java b/integration-tests/mybatis/src/main/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisRoute.java index 6747a88939..1c2833b246 100644 --- a/integration-tests/mybatis/src/main/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisRoute.java +++ b/integration-tests/mybatis/src/main/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisRoute.java @@ -20,23 +20,49 @@ package org.apache.camel.quarkus.component.mybatis.it; import javax.enterprise.context.ApplicationScoped; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.quarkus.component.mybatis.it.entity.Account; @ApplicationScoped public class MyBatisRoute extends RouteBuilder { @Override public void configure() throws Exception { from("direct:selectOne") - .to("mybatis:selectAccountById?statementType=SelectOne") - .to("mock:result"); + .to("mybatis:selectAccountById?statementType=SelectOne"); + + from("direct:selectList") + .to("mybatis:selectAllAccounts?statementType=SelectList"); from("direct:insertOne") .transacted() .to("mybatis:insertAccount?statementType=Insert") - .to("mock:result"); + .process(exchange -> { + Account account = exchange.getIn().getBody(Account.class); + if (account.getFirstName().equals("Rollback")) { + throw new RuntimeException("Rollback"); + } + }); + + from("direct:insertList") + .transacted() + .to("mybatis:batchInsertAccount?statementType=InsertList"); from("direct:deleteOne") .transacted() - .to("mybatis:deleteAccountById?statementType=Delete") - .to("mock:result"); + .to("mybatis:deleteAccountById?statementType=Delete"); + + from("direct:deleteList") + .transacted() + .to("mybatis:batchDeleteAccountById?statementType=DeleteList"); + + from("direct:updateOne") + .transacted() + .to("mybatis:updateAccount?statementType=Update"); + + from("direct:updateList") + .transacted() + .to("mybatis:batchUpdateAccount?statementType=UpdateList"); + + from("mybatis:selectUnprocessedAccounts?onConsume=consumeAccount").routeId("mybatis-consumer").autoStartup(false) + .to("mock:results"); } } diff --git a/integration-tests/mybatis/src/main/java/org/apache/camel/quarkus/component/mybatis/it/MybatisResource.java b/integration-tests/mybatis/src/main/java/org/apache/camel/quarkus/component/mybatis/it/MybatisResource.java index 27924c7f08..550b982144 100644 --- a/integration-tests/mybatis/src/main/java/org/apache/camel/quarkus/component/mybatis/it/MybatisResource.java +++ b/integration-tests/mybatis/src/main/java/org/apache/camel/quarkus/component/mybatis/it/MybatisResource.java @@ -16,6 +16,9 @@ */ package org.apache.camel.quarkus.component.mybatis.it; +import java.util.List; +import java.util.Map; + import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.transaction.Transactional; @@ -23,18 +26,23 @@ import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.NotFoundException; +import javax.ws.rs.PATCH; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; +import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.quarkus.component.mybatis.it.entity.Account; @Path("/mybatis") @ApplicationScoped public class MybatisResource { + @Inject + CamelContext context; @Inject ProducerTemplate template; @@ -50,6 +58,13 @@ public class MybatisResource { return account; } + @Path("/selectList") + @GET + @Produces(MediaType.APPLICATION_JSON) + public List selectList() { + return template.requestBody("direct:selectList", null, List.class); + } + @Path("/insertOne") @POST @Consumes(MediaType.APPLICATION_JSON) @@ -60,6 +75,16 @@ public class MybatisResource { return getCounts(); } + @Path("/insertList") + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.TEXT_PLAIN) + @Transactional + public Integer insertList(List<Account> accounts) { + template.sendBody("direct:insertList", accounts); + return getCounts(); + } + @Path("/deleteOne") @DELETE @Produces(MediaType.TEXT_PLAIN) @@ -69,7 +94,49 @@ public class MybatisResource { return getCounts(); } + @Path("/deleteList") + @DELETE + @Produces(MediaType.TEXT_PLAIN) + @Transactional + public Integer deleteList(List<Integer> ids) { + template.sendBody("direct:deleteList", ids); + return getCounts(); + } + + @Path("/updateOne") + @PATCH + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.TEXT_PLAIN) + @Transactional + public Integer updateOne(Account account) { + template.sendBody("direct:updateOne", account); + return getCounts(); + } + + @Path("/updateList") + @PATCH + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.TEXT_PLAIN) + @Transactional + public Integer updateList(Map<String, Object> params) { + template.sendBody("direct:updateList", params); + return getCounts(); + } + private Integer getCounts() { return template.requestBody("mybatis:count?statementType=SelectOne", null, Integer.class); } + + @Path("/consumer") + @GET + @Produces(MediaType.APPLICATION_JSON) + public List consumer() throws Exception { + MockEndpoint results = context.getEndpoint("mock:results", MockEndpoint.class); + results.expectedMessageCount(2); + + context.getRouteController().startRoute("mybatis-consumer"); + MockEndpoint.assertIsSatisfied(context); + + return template.requestBody("mybatis:selectProcessedAccounts?statementType=SelectList", null, List.class); + } } diff --git a/integration-tests/mybatis/src/main/resources/application.properties b/integration-tests/mybatis/src/main/resources/application.properties index 6f32aa9595..a513710e03 100644 --- a/integration-tests/mybatis/src/main/resources/application.properties +++ b/integration-tests/mybatis/src/main/resources/application.properties @@ -20,6 +20,8 @@ quarkus.datasource.username=username-default quarkus.datasource.jdbc.url=jdbc:h2:tcp://localhost/mem:default quarkus.datasource.jdbc.transactions=xa +quarkus.transaction-manager.enable-recovery=true + quarkus.mybatis.environment=development quarkus.mybatis.xmlconfig.enable=true quarkus.mybatis.xmlconfig.path=SqlMapConfig.xml diff --git a/integration-tests/mybatis/src/main/resources/insert.sql b/integration-tests/mybatis/src/main/resources/insert.sql index c0a668569f..6c4759bd36 100644 --- a/integration-tests/mybatis/src/main/resources/insert.sql +++ b/integration-tests/mybatis/src/main/resources/insert.sql @@ -21,9 +21,10 @@ CREATE TABLE ACCOUNT ( ACC_ID INTEGER, ACC_FIRST_NAME VARCHAR(255), ACC_LAST_NAME VARCHAR(255), - ACC_EMAIL VARCHAR(255) + ACC_EMAIL VARCHAR(255), + PROCESSED BOOLEAN DEFAULT false ); -INSERT INTO ACCOUNT VALUES (123, 'James', 'Strachan', 'tryguess...@gmail.com'); -INSERT INTO ACCOUNT VALUES (456, 'Claus', 'Ibsen', 'non...@gmail.com'); +INSERT INTO ACCOUNT VALUES (123, 'James', 'Strachan', 'tryguess...@gmail.com', false); +INSERT INTO ACCOUNT VALUES (456, 'Claus', 'Ibsen', 'non...@gmail.com', false); diff --git a/integration-tests/mybatis/src/test/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisConsumerTest.java b/integration-tests/mybatis/src/test/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisConsumerTest.java new file mode 100644 index 0000000000..fd138b29f0 --- /dev/null +++ b/integration-tests/mybatis/src/test/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisConsumerTest.java @@ -0,0 +1,47 @@ +/* + * 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.mybatis.it; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.h2.H2DatabaseTestResource; +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.RestAssured; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.Matchers.equalTo; + +@QuarkusTest +@QuarkusTestResource(H2DatabaseTestResource.class) +public class MyBatisConsumerTest { + + @Test + public void testSelectList() { + RestAssured.get("/mybatis/consumer") + .then() + .statusCode(200) + .body("size()", equalTo(2)) + .body("[0].id", equalTo(123)) + .body("[0].firstName", equalTo("James")) + .body("[0].lastName", equalTo("Strachan")) + .body("[0].emailAddress", equalTo("tryguess...@gmail.com")) + .body("[1].id", equalTo(456)) + .body("[1].firstName", equalTo("Claus")) + .body("[1].lastName", equalTo("Ibsen")) + .body("[1].emailAddress", equalTo("non...@gmail.com")); + } +} diff --git a/integration-tests/mybatis/src/test/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisTest.java b/integration-tests/mybatis/src/test/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisTest.java index 0d72ad6d9b..e9f9bcc457 100644 --- a/integration-tests/mybatis/src/test/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisTest.java +++ b/integration-tests/mybatis/src/test/java/org/apache/camel/quarkus/component/mybatis/it/MyBatisTest.java @@ -16,6 +16,12 @@ */ package org.apache.camel.quarkus.component.mybatis.it; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.h2.H2DatabaseTestResource; import io.quarkus.test.junit.QuarkusTest; @@ -33,9 +39,16 @@ public class MyBatisTest { public void tests() { testSelectOne(); testSelectOneNotFound(); + testSelectList(); + testUpdateOne(); + testUpdateList(); testInsert(); + testInsertList(); + testInsertRollback(); + testSelectOneNotFound(); testDelete(); testDeleteNotFound(); + testDeleteList(); } public void testSelectOne() { @@ -54,6 +67,21 @@ public class MyBatisTest { .statusCode(404); } + public void testSelectList() { + RestAssured.get("/mybatis/selectList") + .then() + .statusCode(200) + .body("size()", equalTo(2)) + .body("[0].id", equalTo(123)) + .body("[0].firstName", equalTo("James")) + .body("[0].lastName", equalTo("Strachan")) + .body("[0].emailAddress", equalTo("tryguess...@gmail.com")) + .body("[1].id", equalTo(456)) + .body("[1].firstName", equalTo("Claus")) + .body("[1].lastName", equalTo("Ibsen")) + .body("[1].emailAddress", equalTo("non...@gmail.com")); + } + public void testInsert() { Account account = new Account(); account.setId(444); @@ -70,17 +98,126 @@ public class MyBatisTest { .body(equalTo("3")); } + public void testInsertRollback() { + Account account = new Account(); + account.setId(999); + account.setFirstName("Rollback"); + account.setLastName("Rollback"); + account.setEmailAddress("rollb...@gmail.com"); + + RestAssured.given() + .contentType(ContentType.JSON) + .body(account) + .post("/mybatis/insertOne") + .then() + .statusCode(500); + } + + public void testInsertList() { + Account account1 = new Account(); + account1.setId(555); + account1.setFirstName("Aaron"); + account1.setLastName("Daubman"); + account1.setEmailAddress("readthedevl...@gmail.com"); + + Account account2 = new Account(); + account2.setId(666); + account2.setFirstName("Amos"); + account2.setLastName("Feng"); + account2.setEmailAddress("zh...@gmail.com"); + + List<Account> accountList = new ArrayList<>(2); + + accountList.add(account1); + accountList.add(account2); + + RestAssured.given() + .contentType(ContentType.JSON) + .body(accountList) + .post("/mybatis/insertList") + .then() + .statusCode(200) + .body(equalTo("5")); + } + + public void testUpdateOne() { + Account account = new Account(); + account.setId(456); + account.setFirstName("Claus"); + account.setLastName("Ibsen"); + account.setEmailAddress("ot...@gmail.com"); + + RestAssured.given() + .contentType(ContentType.JSON) + .body(account) + .patch("/mybatis/updateOne") + .then() + .statusCode(200) + .body(equalTo("2")); + + RestAssured.get("/mybatis/selectOne?id=456") + .then() + .statusCode(200) + .body("id", equalTo(456)) + .body("firstName", equalTo("Claus")) + .body("lastName", equalTo("Ibsen")) + .body("emailAddress", equalTo("ot...@gmail.com")); + } + + public void testUpdateList() { + Account account1 = new Account(); + account1.setId(123); + + Account account2 = new Account(); + account2.setId(456); + + Map<String, Object> params = new HashMap<>(); + params.put("list", Arrays.asList(account1, account2)); + params.put("emailAddress", "upd...@gmail.com"); + + RestAssured.given() + .contentType(ContentType.JSON) + .body(params) + .patch("/mybatis/updateList") + .then() + .statusCode(200) + .body(equalTo("2")); + + RestAssured.get("/mybatis/selectList") + .then() + .statusCode(200) + .body("size()", equalTo(2)) + .body("[0].id", equalTo(123)) + .body("[0].firstName", equalTo("James")) + .body("[0].lastName", equalTo("Strachan")) + .body("[0].emailAddress", equalTo("upd...@gmail.com")) + .body("[1].id", equalTo(456)) + .body("[1].firstName", equalTo("Claus")) + .body("[1].lastName", equalTo("Ibsen")) + .body("[1].emailAddress", equalTo("upd...@gmail.com")); + } + public void testDelete() { RestAssured.delete("/mybatis/deleteOne?id=456") .then() .statusCode(200) - .body(equalTo("2")); + .body(equalTo("4")); } public void testDeleteNotFound() { RestAssured.delete("/mybatis/deleteOne?id=999") .then() .statusCode(200) - .body(equalTo("2")); + .body(equalTo("4")); + } + + public void testDeleteList() { + RestAssured.given() + .contentType(ContentType.JSON) + .body(Arrays.asList(444, 555, 666)) + .delete("/mybatis/deleteList") + .then() + .statusCode(200) + .body(equalTo("1")); } }