Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#3028] Increase test coverage of a binding mode of camel-rest component #3052

Merged
merged 1 commit into from
Aug 31, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,15 @@
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {

public Person() {
}

public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}

@XmlAttribute
private String firstName;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,26 @@ public String restProducer(@QueryParam("port") int port) {
return producerTemplate.requestBodyAndHeaders(
"rest:get:/rest/template/{messageStart}/{messageEnd}?host=localhost:" + port, null, headers, String.class);
}

@Path("/producer/binding/mode/json")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Person restProducerBindingModeJson(@QueryParam("port") int port) {
String query = "rest:get:/rest/binding/json/producer" +
"?bindingMode=json" +
"&outType=org.apache.camel.quarkus.component.rest.it.Person" +
"&host=localhost:" + port;
Comment on lines +76 to +79
Copy link
Contributor

@ppalaga ppalaga Aug 30, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking at this, I am wondering why we need a JAX-RS endpoint to test the rest component? This is perhaps a way to pass bindingMode=json, but it it can also be passed via REST DSL, which we already did before this PR, see https://github.com/apache/camel-quarkus/pull/3052/files#diff-58cbc36531a538cc13ef975a1889ac4ec3b28c54786b5896118916846558a592R64-R71 for JSON and https://github.com/apache/camel-quarkus/pull/3052/files#diff-58cbc36531a538cc13ef975a1889ac4ec3b28c54786b5896118916846558a592R78-R85 for XML.
Is this PR adding anything new given the above two exist?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello @ppalaga,
the above two test only Consumer while addition in this PR covers Producer. As you can see within this test coverage result https://fuse-next-jenkins-csb-fuse-qe.apps.ocp4.prod.psi.redhat.com/job/Integration.next/job/camel-quarkus/job/code-coverage/43/Camel_20JaCoCo_20report/org.apache.camel.component.rest/RestProducer.java.html#L272
method createBindingProcessor() is almost entirely untested. With those changes the coverage increase greatly.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for explaining, @vhais!

return producerTemplate.requestBody(query, null, Person.class);
}

@Path("/producer/binding/mode/xml")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Person restProducerBindingModeXml(@QueryParam("port") int port) {
String query = "rest:get:/rest/binding/xml/producer" +
"?bindingMode=xml" +
"&outType=org.apache.camel.quarkus.component.rest.it.Person" +
"&host=localhost:" + port;
return producerTemplate.requestBody(query, null, Person.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public class RestRoutes extends RouteBuilder {

@Override
public void configure() {
final String personJson = "{\"firstName\": \"John\", \"lastName\": \"Doe\", \"age\": 64}";
final String personXml = "<person firstName=\"John\" lastName=\"Doe\" age=\"64\"/>";
restConfiguration()
.enableCORS(true)
.corsAllowCredentials(true)
Expand Down Expand Up @@ -68,6 +70,11 @@ public void configure() {
.setHeader(Exchange.CONTENT_TYPE, constant("text/plain"))
.endRest()

.get("/binding/json/producer")
.route()
.setBody(constant(personJson))
.endRest()

.post("/pojo/binding/xml")
.bindingMode(RestBindingMode.xml)
.type(Person.class)
Expand All @@ -77,6 +84,11 @@ public void configure() {
.setHeader(Exchange.CONTENT_TYPE, constant("text/plain"))
.endRest()

.get("/binding/xml/producer")
.route()
.setBody(constant(personXml))
.endRest()

.post("/log")
.route()
.log("Hello ${body}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.matchesPattern;
import static org.junit.jupiter.api.Assertions.assertEquals;

@QuarkusTest
class RestTest {
private static final Person person = new Person("John", "Doe", 64);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it a requirement to use the same object for json/xml consumer/producer binding ? Otherwise, I would use distinct objects, and maybe with different value.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's definitely not a requirement. I just thought it would be a little better to create the object only once. I'll change it as you suggest.


@Test
public void inspectConfiguration() {
Expand Down Expand Up @@ -107,11 +109,6 @@ public void requestValidation() {

@Test
public void jsonBinding() {
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
person.setAge(64);

String result = String.format(
"Name: %s %s, Age: %d",
person.getFirstName(),
Expand All @@ -128,12 +125,20 @@ public void jsonBinding() {
}

@Test
public void xmlBinding() {
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
person.setAge(64);
public void jsonBindingProducer() {
Person respondPerson = RestAssured.given()
.queryParam("port", RestAssured.port)
.get("/rest/producer/binding/mode/json")
.then()
.statusCode(200)
.extract()
.body()
.as(Person.class);
assertEquals(respondPerson, person);
}

@Test
public void xmlBinding() {
String result = String.format(
"Name: %s %s, Age: %d",
person.getFirstName(),
Expand All @@ -149,6 +154,19 @@ public void xmlBinding() {
.body(equalTo(result));
}

@Test
public void xmlBindingProducer() {
Person respondPerson = RestAssured.given()
.queryParam("port", RestAssured.port)
.get("/rest/producer/binding/mode/xml")
.then()
.statusCode(200)
.extract()
.body()
.as(Person.class);
assertEquals(respondPerson, person);
}

@Test
public void testRestProducer() {
RestAssured.given()
Expand Down