package org.jentrata.ebms.as4.internal.routes; import org.apache.camel.EndpointInject; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.impl.DefaultExchange; import org.apache.camel.test.junit4.CamelTestSupport; import org.codehaus.jackson.map.ObjectMapper; import org.jentrata.ebms.EbmsConstants; import org.jentrata.ebms.MessageStatusType; import org.jentrata.ebms.utils.EbmsUtils; import org.junit.Test; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; import java.util.Map; import static org.hamcrest.Matchers.*; /** * Unit test for org.jentrata.ebms.as4.internal.routes.EventNotificationRouteBuilder * * @author aaronwalker */ @SuppressWarnings("unchecked") public class EventNotificationRouteBuilderTest extends CamelTestSupport { @EndpointInject(uri = "mock:mockNotification") protected MockEndpoint mockNotification; @EndpointInject(uri = "mock:mockOther") protected MockEndpoint mockOther; @Test public void testFireEvent() throws Exception { mockNotification.setExpectedMessageCount(1); Exchange request = createRequest(); context().createProducerTemplate().send(EventNotificationRouteBuilder.SEND_NOTIFICATION_ENDPOINT,request); assertMockEndpointsSatisfied(); assertEventNotification(mockNotification.getExchanges().get(0)); } @Test public void testFireEventMinimal() throws Exception { mockNotification.setExpectedMessageCount(1); Exchange request = createRequest(); request.getIn().removeHeader(EbmsConstants.MESSAGE_STATUS_DESCRIPTION); request.getIn().removeHeader(EbmsConstants.REF_TO_MESSAGE_ID); request.getIn().removeHeader(EbmsConstants.MESSAGE_DATE); request.getIn().removeHeader(EbmsConstants.MESSAGE_CONVERSATION_ID); request.getIn().removeHeader(EbmsConstants.CPA_ID); context().createProducerTemplate().send(EventNotificationRouteBuilder.SEND_NOTIFICATION_ENDPOINT,request); assertMockEndpointsSatisfied(); Exchange event = mockNotification.getExchanges().get(0); assertThat(event.getIn().getBody(),notNullValue()); System.out.println(event.getIn().getBody()); Map<String,Object> message = fromJson(event.getIn().getBody(String.class)); assertThat(message,notNullValue()); assertThat((String) message.get("messageId"),equalTo("orders123@buyer.jentrata.org")); assertThat((String) message.get("direction"),equalTo(EbmsConstants.MESSAGE_DIRECTION_INBOUND)); assertThat((String) message.get("cpaId"),equalTo("UNKNOWN")); assertThat((String) message.get("refMessageId"),equalTo("")); assertThat((String) message.get("conversationId"),equalTo("")); assertThat((String) message.get("status"),equalTo("RECEIVED")); assertThat((String) message.get("statusDescription"),equalTo("")); assertThat((String) message.get("messageDate"),equalTo("")); Map<String,Object> headers = (Map<String, Object>) message.get("headers"); assertThat((String) headers.get("JentrataFrom"),equalTo("123456789")); assertThat((String) headers.get("JentrataTo"),equalTo("192837465")); assertThat((String) headers.get("jentrataVersion"),equalTo("TEST")); } @Test public void testFireEventWithComplexHeader() throws Exception { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); mockNotification.setExpectedMessageCount(1); Exchange request = createRequest(); Date date = new Date(); request.getIn().setHeader("complexDate", date); request.getIn().setHeader("complexList", Collections.emptyList()); context().createProducerTemplate().send(EventNotificationRouteBuilder.SEND_NOTIFICATION_ENDPOINT,request); assertMockEndpointsSatisfied(); Map<String,Object> event = assertEventNotification(mockNotification.getExchanges().get(0)); Map<String,Object> headers = (Map<String, Object>) event.get("headers"); assertThat((String) headers.get("complexDate"),startsWith(df.format(date))); assertThat(headers.get("complexList"),nullValue()); } @Test public void testFireEventWithNullHeader() throws Exception { mockNotification.setExpectedMessageCount(1); Exchange request = createRequest(); request.getIn().setHeader("nullHeader", null); context().createProducerTemplate().send(EventNotificationRouteBuilder.SEND_NOTIFICATION_ENDPOINT,request); assertMockEndpointsSatisfied(); Map<String,Object> event = assertEventNotification(mockNotification.getExchanges().get(0)); Map<String,Object> headers = (Map<String, Object>) event.get("headers"); assertThat(headers.get("nullHeader"),nullValue()); } @Test public void testWireTrapEventNotification() throws Exception { mockNotification.setExpectedMessageCount(1); mockOther.setExpectedMessageCount(1); mockOther.expectedBodiesReceived(EbmsUtils.toStringFromClasspath("soapenv-user-message.xml")); Exchange request = createRequest(); context().createProducerTemplate().send("direct:testWireTap",request); assertMockEndpointsSatisfied(); assertEventNotification(mockNotification.getExchanges().get(0)); } @Test public void testWireTrapEventNotificationWithException() throws Exception { mockNotification.setExpectedMessageCount(1); mockOther.setExpectedMessageCount(1); String s = EbmsUtils.toStringFromClasspath("soapenv-user-message.xml"); mockOther.expectedBodiesReceived(s); Exchange request = createRequest(); request.getIn().setHeader(EbmsConstants.MESSAGE_STATUS_DESCRIPTION,"500 - " + s); context().createProducerTemplate().send("direct:testWireTap",request); assertMockEndpointsSatisfied(); assertEventNotification(mockNotification.getExchanges().get(0),"500 - " + s); } @Override protected RouteBuilder [] createRouteBuilders() throws Exception { System.setProperty("jentrataVersion","TEST"); EventNotificationRouteBuilder routeBuilder = new EventNotificationRouteBuilder(); routeBuilder.setNotificationEndpoint(mockNotification.getEndpointUri()); return new RouteBuilder[] { routeBuilder, new RouteBuilder() { @Override public void configure() throws Exception { from("direct:testWireTap") .wireTap(EventNotificationRouteBuilder.SEND_NOTIFICATION_ENDPOINT) .to(mockOther); } } }; } private Exchange createRequest() throws Exception { Exchange request = new DefaultExchange(context()); request.getIn().setHeader(EbmsConstants.MESSAGE_FROM,"123456789"); request.getIn().setHeader(EbmsConstants.MESSAGE_TO,"192837465"); request.getIn().setHeader(EbmsConstants.MESSAGE_ID,"orders123@buyer.jentrata.org"); request.getIn().setHeader(EbmsConstants.MESSAGE_DIRECTION,EbmsConstants.MESSAGE_DIRECTION_INBOUND); request.getIn().setHeader(EbmsConstants.CPA_ID,"testCPAId"); request.getIn().setHeader(EbmsConstants.MESSAGE_CONVERSATION_ID,"testConvId"); request.getIn().setHeader(EbmsConstants.MESSAGE_STATUS, MessageStatusType.RECEIVED); request.getIn().setHeader(EbmsConstants.MESSAGE_STATUS_DESCRIPTION,"All Good"); request.getIn().setHeader(EbmsConstants.MESSAGE_DATE,"2013-06-12T10:45:00.000Z"); request.getIn().setBody(EbmsUtils.toStringFromClasspath("soapenv-user-message.xml")); return request; } private Map<String,Object> assertEventNotification(Exchange event) throws IOException { return assertEventNotification(event,"All Good"); } private Map<String,Object> assertEventNotification(Exchange event, String statusDesc) throws IOException { assertThat(event.getIn().getBody(),notNullValue()); System.out.println(event.getIn().getBody()); Map<String,Object> message = fromJson(event.getIn().getBody(String.class)); assertThat(message,notNullValue()); assertThat((String) message.get("messageId"),equalTo("orders123@buyer.jentrata.org")); assertThat((String) message.get("direction"),equalTo(EbmsConstants.MESSAGE_DIRECTION_INBOUND)); assertThat((String) message.get("cpaId"),equalTo("testCPAId")); assertThat((String) message.get("refMessageId"),equalTo("")); assertThat((String) message.get("conversationId"),equalTo("testConvId")); assertThat((String) message.get("status"),equalTo("RECEIVED")); assertThat((String) message.get("statusDescription"),equalTo(statusDesc)); assertThat((String) message.get("messageDate"),equalTo("2013-06-12T10:45:00.000Z")); Map<String,Object> headers = (Map<String, Object>) message.get("headers"); assertThat((String) headers.get("JentrataFrom"),equalTo("123456789")); assertThat((String) headers.get("JentrataTo"),equalTo("192837465")); assertThat((String) headers.get("jentrataVersion"),equalTo("TEST")); return message; } @SuppressWarnings("unchecked") private Map<String,Object> fromJson(String json) throws IOException { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(json,Map.class); } }