package org.jentrata.ebms.as4.internal.routes;
import org.apache.camel.EndpointInject;
import org.apache.camel.Exchange;
import org.apache.camel.LoggingLevel;
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.apache.commons.io.IOUtils;
import org.jentrata.ebms.EbmsConstants;
import org.jentrata.ebms.MessageType;
import org.jentrata.ebms.cpa.CPARepository;
import org.jentrata.ebms.cpa.PartnerAgreement;
import org.jentrata.ebms.cpa.pmode.Protocol;
import org.junit.Test;
import org.w3c.dom.Document;
import java.io.File;
import java.io.FileInputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static org.hamcrest.Matchers.hasSize;
/**
* Unit tests for org.jentrata.ebms.as4.internal.routes.EbmsOutboundRouteBuilder
*
* @author aaronwalker
*/
public class EbmsOutboundRouteBuilderTest extends CamelTestSupport {
@EndpointInject(uri = "mock:agreement1")
protected MockEndpoint mockAgreement1;
@EndpointInject(uri = "mock:agreement2")
protected MockEndpoint mockAgreement2;
@EndpointInject(uri = "mock:mockUpdateMessageStore")
protected MockEndpoint mockUpdateMessageStore;
@EndpointInject(uri = "mock:mockEbmsResponseInbound")
protected MockEndpoint mockEbmsResponseInbound;
@Test
public void testSendMessageToPartner() throws Exception {
mockAgreement1.setExpectedMessageCount(1);
mockAgreement2.setExpectedMessageCount(1);
mockUpdateMessageStore.setExpectedMessageCount(4);
mockEbmsResponseInbound.setExpectedMessageCount(1);
mockEbmsResponseInbound.expectedBodiesReceived(IOUtils.toString(new FileInputStream(fileFromClasspath("simple-as4-receipt.xml"))));
mockEbmsResponseInbound.expectedHeaderReceived(EbmsConstants.CONTENT_TYPE,EbmsConstants.SOAP_XML_CONTENT_TYPE);
mockEbmsResponseInbound.expectedHeaderReceived(Exchange.HTTP_METHOD,"POST");
sendMessage("agreement1",
"simple-as4-user-message.txt",
"Multipart/Related; boundary=\"----=_Part_7_10584188.1123489648993\"; type=\"application/soap+xml\"; start=\"<soapPart@jentrata.org>\"",
"2011-921@5209999001264.jentrata.org",
MessageType.USER_MESSAGE);
sendMessage("agreement2",
"simple-as4-receipt.xml",
EbmsConstants.SOAP_XML_CONTENT_TYPE,
"someuniqueid@receiver.jentrata.org",
MessageType.SIGNAL_MESSAGE_WITH_USER_MESSAGE);
assertMockEndpointsSatisfied();
Exchange e = mockEbmsResponseInbound.getExchanges().get(0);
assertThat(e.getIn().getHeaders().values(),hasSize(3));
}
private void sendMessage(String cpaId, String filename, String contentType, String msgId, MessageType type) throws Exception {
Exchange request = new DefaultExchange(context());
request.getIn().setHeader(EbmsConstants.CONTENT_TYPE,contentType);
request.getIn().setHeader(EbmsConstants.CPA_ID,cpaId);
request.getIn().setHeader(EbmsConstants.MESSAGE_ID,msgId);
request.getIn().setHeader(EbmsConstants.MESSAGE_TYPE, type);
request.getIn().setHeader(EbmsConstants.MESSAGE_DIRECTION,EbmsConstants.MESSAGE_DIRECTION_OUTBOUND);
request.getIn().setBody(new FileInputStream(fileFromClasspath("simple-as4-user-message.txt")));
Exchange response = context().createProducerTemplate().send("direct:testOutboundEbmsQueue",request);
}
@Override
protected RouteBuilder [] createRouteBuilders() throws Exception {
EbmsOutboundRouteBuilder routeBuilder = new EbmsOutboundRouteBuilder();
routeBuilder.setOutboundEbmsQueue("direct:testOutboundEbmsQueue");
routeBuilder.setEbmsResponseInbound(mockEbmsResponseInbound.getEndpointUri());
routeBuilder.setMessageUpdateEndpoint(mockUpdateMessageStore.getEndpointUri());
routeBuilder.setCpaRepository(new DummyCPARepository());
return new RouteBuilder[] {
routeBuilder,
new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:agreement1")
.to(mockAgreement1.getEndpointUri())
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(204))
.setBody(constant(null))
.routeId("mockAgreement1");
from("direct:agreement2")
.to(mockAgreement2.getEndpointUri())
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200))
.setBody(constant(IOUtils.toString(new FileInputStream(fileFromClasspath("simple-as4-receipt.xml")))))
.routeId("mockAgreement2");
from(EventNotificationRouteBuilder.SEND_NOTIFICATION_ENDPOINT)
.log(LoggingLevel.INFO, "mock event notification: ${headers}")
.routeId("mockEventNotification");
}
}
};
}
protected static File fileFromClasspath(String filename) {
File file = new File(Thread.currentThread().getContextClassLoader().getResource(filename).getFile());
return file;
}
private class DummyCPARepository implements CPARepository {
@Override
public List<PartnerAgreement> getPartnerAgreements() {
return Collections.emptyList();
}
@Override
public List<PartnerAgreement> getActivePartnerAgreements() {
PartnerAgreement agreement1 = new PartnerAgreement();
agreement1.setCpaId("agreement1");
Protocol protocol = new Protocol();
protocol.setAddress("direct:agreement1");
agreement1.setProtocol(protocol);
PartnerAgreement agreement2 = new PartnerAgreement();
agreement2.setCpaId("agreement2");
Protocol protocol2 = new Protocol();
protocol2.setAddress("direct:agreement2");
agreement2.setProtocol(protocol2);
return Arrays.asList(agreement1,agreement2);
}
@Override
public PartnerAgreement findByCPAId(String cpaId) {
return null;
}
@Override
public PartnerAgreement findByServiceAndAction(String service, String action) {
return null;
}
@Override
public PartnerAgreement findByMessage(Document message, String ebmsVersion) {
return null;
}
@Override
public boolean isValidPartnerAgreement(Map<String, Object> fields) {
return true;
}
}
}