package org.jentrata.ebms.messaging;
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.jentrata.ebms.EbmsConstants;
import org.junit.Test;
import javax.activation.DataHandler;
import java.io.ByteArrayInputStream;
import java.util.List;
/**
* Unit test for org.jentrata.ebms.messaging.SplitAttachmentsToBody
*
* @author aaronwalker
*/
public class SplitAttachmentsToBodyTest extends CamelTestSupport {
@EndpointInject(uri = "mock:mockSplitter")
protected MockEndpoint mockSplitter;
@Test
public void testDefaultSplitter() throws Exception {
mockSplitter.setExpectedMessageCount(2);
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_ID, "attachment1", "attachment2");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_TYPE, "text/plain", "text/plain");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder("originalHeader", "originalHeader", "originalHeader");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(SplitAttachmentsToBody.ORIGINAL_MESSAGE_BODY, "test", "test");
mockSplitter.expectedBodiesReceivedInAnyOrder("attachment1", "attachment2");
Exchange request = getExchange("test","attachment1","attachment2");
context().createProducerTemplate().send("direct:testDefaultSplitter",request);
assertMockEndpointsSatisfied();
}
@Test
public void testDontCopyMessageSplitter() throws Exception {
mockSplitter.setExpectedMessageCount(2);
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_ID, "attachment1", "attachment2");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_TYPE, "text/plain", "text/plain");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder("originalHeader", "originalHeader", "originalHeader");
mockSplitter.expectedBodiesReceivedInAnyOrder("attachment1", "attachment2");
Exchange request = getExchange("test","attachment1","attachment2");
context().createProducerTemplate().send("direct:testDontCopyMessageSplitter",request);
assertMockEndpointsSatisfied();
failIfHeaderExists(SplitAttachmentsToBody.ORIGINAL_MESSAGE_BODY,mockSplitter.getExchanges());
}
@Test
public void testDontCopyHeadersSplitter() throws Exception {
mockSplitter.setExpectedMessageCount(2);
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_ID, "attachment1", "attachment2");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_TYPE, "text/plain", "text/plain");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(SplitAttachmentsToBody.ORIGINAL_MESSAGE_BODY, "test", "test");
mockSplitter.expectedBodiesReceivedInAnyOrder("attachment1", "attachment2");
Exchange request = getExchange("test","attachment1","attachment2");
context().createProducerTemplate().send("direct:testDontCopyHeadersSplitter",request);
assertMockEndpointsSatisfied();
failIfHeaderExists("originalHeader",mockSplitter.getExchanges());
}
@Test
public void testCopyCustomHeadersSplitter() throws Exception {
mockSplitter.setExpectedMessageCount(2);
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_ID, "attachment1", "attachment2");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_TYPE, "text/plain", "text/plain");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(SplitAttachmentsToBody.ORIGINAL_MESSAGE_BODY, "test", "test");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder("header1", "value1", "value1");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder("header2", "value2", "value2");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder("header3", "value3", "value3");
mockSplitter.expectedBodiesReceivedInAnyOrder("attachment1", "attachment2");
Exchange request = getExchange("test","attachment1","attachment2");
request.getIn().setHeader("header1","value1");
request.getIn().setHeader("header2","value2");
request.getIn().setHeader("header3","value3");
request.getIn().setHeader("header4","value4");
context().createProducerTemplate().send("direct:testCopyCustomHeadersSplitter",request);
assertMockEndpointsSatisfied();
failIfHeaderExists("originalHeader",mockSplitter.getExchanges());
failIfHeaderExists("header4",mockSplitter.getExchanges());
}
@Test
public void testIncludeOriginalMessageSplitter() throws Exception {
mockSplitter.setExpectedMessageCount(3);
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_ID, "attachment1", "attachment2",EbmsConstants.SOAP_BODY_PAYLOAD_ID);
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_TYPE, "text/plain", "text/plain",EbmsConstants.TEXT_XML_CONTENT_TYPE);
mockSplitter.expectedBodiesReceivedInAnyOrder("test","attachment1", "attachment2");
Exchange request = getExchange("test","attachment1","attachment2");
context().createProducerTemplate().send("direct:testIncludeOriginalMessageSplitter",request);
assertMockEndpointsSatisfied();
failIfHeaderExists("originalHeader",mockSplitter.getExchanges());
failIfHeaderExists(SplitAttachmentsToBody.ORIGINAL_MESSAGE_BODY,mockSplitter.getExchanges());
}
@Test
public void testIncludeOriginalMessageSplitterWithContentIDAndType() throws Exception {
mockSplitter.setExpectedMessageCount(3);
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_ID, "attachment1", "attachment2","testCID");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_TYPE, "text/plain", "text/plain","text/plain");
mockSplitter.expectedBodiesReceivedInAnyOrder("test","attachment1", "attachment2");
Exchange request = getExchange("test","attachment1","attachment2");
request.getIn().setHeader(EbmsConstants.CONTENT_ID,"testCID");
request.getIn().setHeader(EbmsConstants.CONTENT_TYPE,"text/plain");
context().createProducerTemplate().send("direct:testIncludeOriginalMessageSplitter",request);
assertMockEndpointsSatisfied();
failIfHeaderExists("originalHeader",mockSplitter.getExchanges());
failIfHeaderExists(SplitAttachmentsToBody.ORIGINAL_MESSAGE_BODY,mockSplitter.getExchanges());
}
@Test
public void testWithBodyOnly() throws Exception {
mockSplitter.setExpectedMessageCount(1);
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_ID, EbmsConstants.SOAP_BODY_PAYLOAD_ID);
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(EbmsConstants.CONTENT_TYPE, "text/xml");
mockSplitter.expectedHeaderValuesReceivedInAnyOrder(SplitAttachmentsToBody.ORIGINAL_MESSAGE_BODY, "test");
mockSplitter.expectedBodiesReceivedInAnyOrder("<test/>");
Exchange request = getExchange("<test/>");
request.getIn().setHeader(SplitAttachmentsToBody.ORIGINAL_MESSAGE_BODY,"test");
context().createProducerTemplate().send("direct:testWithBodyOnly",request);
assertMockEndpointsSatisfied();
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:testDefaultSplitter")
.split(new SplitAttachmentsToBody())
.to(mockSplitter);
from("direct:testDontCopyMessageSplitter")
.split(new SplitAttachmentsToBody(false))
.to(mockSplitter);
from("direct:testDontCopyHeadersSplitter")
.split(new SplitAttachmentsToBody(true, false))
.to(mockSplitter);
from("direct:testCopyCustomHeadersSplitter")
.split(new SplitAttachmentsToBody(true, false, "header1", "header2", "header3"))
.to(mockSplitter);
from("direct:testIncludeOriginalMessageSplitter")
.split(new SplitAttachmentsToBody(false, false, true))
.to(mockSplitter);
from("direct:testWithBodyOnly")
.split(new SplitAttachmentsToBody(true, false, true))
.to(mockSplitter);
}
};
}
private void failIfHeaderExists(String header, List<Exchange> exchanges) {
for(Exchange exchange : exchanges) {
if(exchange.getIn().getHeader(header) != null) {
fail("message shouldn't contain header " + header + " but it does");
}
}
}
private Exchange getExchange(String body,String...attachments) {
Exchange request = new DefaultExchange(context());
request.getIn().setBody(body);
for(String attachment : attachments) {
request.getIn().addAttachment(attachment,getAttachment(attachment));
}
request.getIn().setHeader("originalHeader","originalHeader");
return request;
}
private DataHandler getAttachment(String id) {
return new DataHandler(new InputStreamDataSource(new ByteArrayInputStream(id.getBytes()),"text/plain"));
}
}