Added Unit test to camel-undertow to verify type and outType behave as expected with arrays
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/1e49195d Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1e49195d Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1e49195d Branch: refs/heads/master Commit: 1e49195dad6bfbcbc6933eaf9de5cb5af6c5c82c Parents: fca73e0 Author: Scott Cranton <sc...@cranton.com> Authored: Thu Mar 9 21:33:48 2017 -0500 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Mar 10 09:21:26 2017 +0100 ---------------------------------------------------------------------- .../rest/RestUndertowHttpPojoTypeTest.java | 332 +++++++++++++++++++ 1 file changed, 332 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/1e49195d/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPojoTypeTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPojoTypeTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPojoTypeTest.java new file mode 100644 index 0000000..1752f54 --- /dev/null +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPojoTypeTest.java @@ -0,0 +1,332 @@ +/** + * 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.component.undertow.rest; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.component.undertow.BaseUndertowTest; +import org.apache.camel.model.rest.RestBindingMode; +import org.apache.camel.model.rest.RestDefinition; +import org.apache.camel.model.rest.VerbDefinition; +import org.junit.Test; + +import java.util.*; + +public class RestUndertowHttpPojoTypeTest extends BaseUndertowTest { + private final ObjectMapper mapper = new ObjectMapper(); + + @Test + public void testUndertowPojoTypeValidateModel() throws Exception { + // Wasn't clear if there's a way to put this test into camel-core just to test the model + // perhaps without starting the Camel Context? + + List<RestDefinition> restDefinitions = context().getRestDefinitions(); + assertNotNull(restDefinitions); + assertTrue(restDefinitions.size() > 0); + + RestDefinition restDefinition = restDefinitions.get(0); + List<VerbDefinition> verbs = restDefinition.getVerbs(); + assertNotNull(verbs); + + Map<String, VerbDefinition> mapVerb = new TreeMap<>(); + + verbs.forEach(verb -> mapVerb.put(verb.getId(), verb)); + + assertEquals(UserPojo[].class.getCanonicalName(), mapVerb.get("getUsers").getOutType()); + assertEquals(UserPojo[].class.getCanonicalName(), mapVerb.get("getUsersList").getOutType()); + assertEquals(UserPojo.class.getCanonicalName(), mapVerb.get("getUser").getOutType()); + + assertEquals(UserPojo.class.getCanonicalName(), mapVerb.get("putUser").getType()); + assertEquals(UserPojo[].class.getCanonicalName(), mapVerb.get("putUsers").getType()); + assertEquals(UserPojo[].class.getCanonicalName(), mapVerb.get("putUsersList").getType()); + } + + @Test + public void testUndertowPojoTypeGetUsers() throws Exception { + Exchange outExchange = template.request("undertow:http://localhost:{{port}}/users", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(Exchange.HTTP_METHOD, "GET"); + exchange.getIn().setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/json"); + } + }); + + assertNotNull(outExchange); + assertEquals("application/json", outExchange.getOut().getHeader(Exchange.CONTENT_TYPE)); + String out = outExchange.getOut().getBody(String.class); + assertNotNull(out); + + UserPojo[] users = mapper.readValue(out, UserPojo[].class); + assertEquals(2, users.length); + assertEquals("Scott", users[0].getName()); + assertEquals("Claus", users[1].getName()); + } + + @Test + public void testUndertowPojoTypePutUser() throws Exception { + Exchange outExchange = template.request("undertow:http://localhost:{{port}}/users/1", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(Exchange.HTTP_METHOD, "PUT"); + exchange.getIn().setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/json"); + exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json"); + + UserPojo user = new UserPojo(); + user.setId(1); + user.setName("Scott"); + + String body = mapper.writeValueAsString(user); + exchange.getIn().setBody(body); + } + }); + + assertNotNull(outExchange); + assertEquals(200, outExchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); + } + + @Test + public void testUndertowPojoTypePutUserFail() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:putUser"); + mock.expectedMessageCount(0); + + Exchange outExchange = template.request("undertow:http://localhost:{{port}}/users/1", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(Exchange.HTTP_METHOD, "PUT"); + exchange.getIn().setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/json"); + exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json"); + + CountryPojo country = new CountryPojo(); + country.setIso("US"); + country.setCountry("United States"); + + String body = mapper.writeValueAsString(country); + exchange.getIn().setBody(body); + } + }); + + assertNotNull(outExchange); + assertEquals(400, outExchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testUndertowPojoTypePutUsers() throws Exception { + UserPojo user1 = new UserPojo(); + user1.setId(1); + user1.setName("Scott"); + + UserPojo user2 = new UserPojo(); + user2.setId(2); + user2.setName("Claus"); + + final UserPojo[] users = new UserPojo[]{user1, user2}; + + MockEndpoint mock = getMockEndpoint("mock:putUsers"); + mock.expectedMessageCount(1); + mock.message(0).body(UserPojo[].class); + + Exchange outExchange = template.request("undertow:http://localhost:{{port}}/users", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(Exchange.HTTP_METHOD, "PUT"); + exchange.getIn().setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/json"); + exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json"); + + String body = mapper.writeValueAsString(users); + exchange.getIn().setBody(body); + } + }); + + assertNotNull(outExchange); + assertEquals(200, outExchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); + + assertMockEndpointsSatisfied(); + + Exchange exchange = mock.assertExchangeReceived(0); + UserPojo[] receivedUsers = exchange.getIn().getBody(UserPojo[].class); + assertEquals(2, receivedUsers.length); + assertEquals(user1.getName(), receivedUsers[0].getName()); + assertEquals(user2.getName(), receivedUsers[1].getName()); + } + + @Test + public void testUndertowPojoTypePutUsersFail() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:putUsers"); + mock.expectedMessageCount(0); + + Exchange outExchange = template.request("undertow:http://localhost:{{port}}/users", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(Exchange.HTTP_METHOD, "PUT"); + exchange.getIn().setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/json"); + exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json"); + + UserPojo user = new UserPojo(); + user.setId(1); + user.setName("Scott"); + + String body = mapper.writeValueAsString(user); + exchange.getIn().setBody(body); + } + }); + + assertNotNull(outExchange); + assertEquals(400, outExchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testUndertowPojoTypePutUsersList() throws Exception { + UserPojo user1 = new UserPojo(); + user1.setId(1); + user1.setName("Scott"); + + UserPojo user2 = new UserPojo(); + user2.setId(2); + user2.setName("Claus"); + + final UserPojo[] users = new UserPojo[]{user1, user2}; + + MockEndpoint mock = getMockEndpoint("mock:putUsersList"); + mock.expectedMessageCount(1); + mock.message(0).body(UserPojo[].class); + + Exchange outExchange = template.request("undertow:http://localhost:{{port}}/users/list", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(Exchange.HTTP_METHOD, "PUT"); + exchange.getIn().setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/json"); + exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json"); + + String body = mapper.writeValueAsString(users); + exchange.getIn().setBody(body); + } + }); + + assertNotNull(outExchange); + assertEquals(200, outExchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); + + assertMockEndpointsSatisfied(); + + Exchange exchange = mock.assertExchangeReceived(0); + UserPojo[] receivedUsers = exchange.getIn().getBody(UserPojo[].class); + assertEquals(2, receivedUsers.length); + assertEquals(user1.getName(), receivedUsers[0].getName()); + assertEquals(user2.getName(), receivedUsers[1].getName()); + } + + @Test + public void testUndertowPojoTypePutUsersListFail() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:putUsersList"); + mock.expectedMessageCount(0); + + Exchange outExchange = template.request("undertow:http://localhost:{{port}}/users/list", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(Exchange.HTTP_METHOD, "PUT"); + exchange.getIn().setHeader(Exchange.ACCEPT_CONTENT_TYPE, "application/json"); + exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json"); + + UserPojo user = new UserPojo(); + user.setId(1); + user.setName("Scott"); + + String body = mapper.writeValueAsString(user); + exchange.getIn().setBody(body); + } + }); + + assertNotNull(outExchange); + assertEquals(400, outExchange.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + onException(Exception.class) + .handled(true) + .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(400)) + .setHeader(Exchange.CONTENT_TYPE, constant("text/plain")) + .setBody().simple("${exchange.message}"); + + // configure to use undertow on localhost with the given port + restConfiguration().component("undertow").host("localhost").port(getPort()) + .bindingMode(RestBindingMode.json); + + // use the rest DSL to define the rest services + rest() + .get("/users").id("getUsers").outType(UserPojo[].class) + .route().process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + UserPojo user1 = new UserPojo(); + user1.setId(1); + user1.setName("Scott"); + + UserPojo user2 = new UserPojo(); + user2.setId(2); + user2.setName("Claus"); + + exchange.getOut().setBody(new UserPojo[] {user1, user2}); + } + }).endRest() + .get("/users/list").id("getUsersList").outTypeList(UserPojo.class) + .route().process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + UserPojo user1 = new UserPojo(); + user1.setId(1); + user1.setName("Scott"); + + UserPojo user2 = new UserPojo(); + user2.setId(2); + user2.setName("Claus"); + + exchange.getOut().setBody(new UserPojo[] {user1, user2}); + } + }).endRest() + .get("/users/{id}").id("getUser").outType(UserPojo.class) + .route().process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + UserPojo user1 = new UserPojo(); + user1.setId(exchange.getIn().getHeader("id", int.class)); + user1.setName("Scott"); + exchange.getOut().setBody(user1); + } + }).endRest() + .put("/users/{id}").id("putUser").type(UserPojo.class) + .to("mock:putUser") + .put("/users").id("putUsers").type(UserPojo[].class) + .to("mock:putUsers") + .put("/users/list").id("putUsersList").typeList(UserPojo.class) + .to("mock:putUsersList"); + } + }; + } + +}