package org.jentrata.ebms.as4.internal.routes;
import com.google.common.collect.ImmutableList;
import org.apache.camel.Exchange;
import org.apache.camel.Header;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.jentrata.ebms.EbmsConstants;
import org.jentrata.ebms.EbmsError;
import org.jentrata.ebms.MessageType;
import org.jentrata.ebms.cpa.*;
import org.jentrata.ebms.cpa.pmode.BusinessInfo;
import org.jentrata.ebms.cpa.pmode.Protocol;
import org.jentrata.ebms.cpa.pmode.Service;
import org.jentrata.ebms.messaging.Message;
import org.jentrata.ebms.messaging.MessageStore;
import org.jentrata.ebms.utils.EbmsUtils;
import org.junit.Test;
import org.w3c.dom.Document;
import javax.xml.xpath.XPathExpressionException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static org.hamcrest.Matchers.*;
import static org.mockito.Mockito.*;
/**
* Unit test for org.jentrata.ebms.as4.internal.routes.ValidatePartnerAgreementRouteBuilder
*
* @author aaronwalker
*/
public class ValidatePartnerAgreementRouteBuilderTest extends CamelTestSupport {
private CPARepository cpaRepository;
@Test
public void testHasValidPartnerAgreement() throws Exception {
Exchange request = new DefaultExchange(context());
request.getIn().setBody(loadEbmsMessage());
request.getIn().setHeader(EbmsConstants.MESSAGE_ID, "testMsgID");
request.getIn().setHeader(EbmsConstants.MESSAGE_SERVICE, "service1");
request.getIn().setHeader(EbmsConstants.MESSAGE_ACTION,"action1");
Exchange response = context().createProducerTemplate().send("direct:validatePartner",request);
assertThat(response.getIn().getHeader(EbmsConstants.VALID_PARTNER_AGREEMENT,Boolean.class),is(true));
}
@Test
public void testHasInvalidPartnerAgreement() throws Exception {
Exchange request = new DefaultExchange(context());
request.getIn().setBody(loadEbmsMessage());
request.getIn().setHeader(EbmsConstants.MESSAGE_ID, "testMsgID");
request.getIn().setHeader(EbmsConstants.MESSAGE_SERVICE, "testServiceInvalid");
request.getIn().setHeader(EbmsConstants.MESSAGE_ACTION, "testAction");
Exchange response = context().createProducerTemplate().send("direct:validatePartner",request);
assertThat(request.isFailed(),equalTo(true));
assertThat(request.getException(),instanceOf(InvalidPartnerAgreementException.class));
assertThat(response.getIn().getHeader(EbmsConstants.VALID_PARTNER_AGREEMENT, Boolean.class),is(false));
}
@Test
public void testNullServiceAndAction() throws Exception {
Exchange request = new DefaultExchange(context());
request.getIn().setBody(loadEbmsMessage());
Exchange response = context().createProducerTemplate().send("direct:validatePartner",request);
assertThat(request.isFailed(), equalTo(true));
assertThat(request.getException(),instanceOf(InvalidPartnerAgreementException.class));
assertThat(response.getIn().getHeader(EbmsConstants.VALID_PARTNER_AGREEMENT,Boolean.class),is(false));
}
@Test
public void testLookupCPAId() throws Exception {
Exchange request = new DefaultExchange(context());
request.getIn().setBody(loadEbmsMessage());
request.getIn().setHeader(EbmsConstants.MESSAGE_ID, "testMsgID");
request.getIn().setHeader(EbmsConstants.MESSAGE_SERVICE, "testService");
request.getIn().setHeader(EbmsConstants.MESSAGE_ACTION,"testAction");
request.getIn().setHeader(EbmsConstants.MESSAGE_TYPE, MessageType.USER_MESSAGE);
Exchange response = context().createProducerTemplate().send("direct:lookupCpaId",request);
assertThat(response.getIn().getHeader(EbmsConstants.CPA, PartnerAgreement.class),is(notNullValue()));
assertThat(response.getIn().getHeader(EbmsConstants.CPA_ID, String.class),equalTo("testCPAId"));
}
@Test
public void testLookupCPAIdForSignalMessage() throws Exception {
Exchange request = new DefaultExchange(context());
request.getIn().setBody(loadEbmsMessage());
request.getIn().setHeader(EbmsConstants.MESSAGE_ID, "testMsgID");
request.getIn().setHeader(EbmsConstants.MESSAGE_TYPE, MessageType.SIGNAL_MESSAGE);
Exchange response = context().createProducerTemplate().send("direct:lookupCpaId",request);
assertThat(response.getIn().getHeader(EbmsConstants.CPA, PartnerAgreement.class),is(notNullValue()));
assertThat(response.getIn().getHeader(EbmsConstants.CPA_ID, String.class),equalTo("testCPAId"));
}
@Test
public void testLookupCPAIdForSignalMessageWithUserMessage() throws Exception {
Exchange request = new DefaultExchange(context());
request.getIn().setBody(loadEbmsMessage("simple-as4-receipt.xml"));
request.getIn().setHeader(EbmsConstants.MESSAGE_ID, "testMsgID");
request.getIn().setHeader(EbmsConstants.MESSAGE_TYPE, MessageType.SIGNAL_MESSAGE_WITH_USER_MESSAGE);
Exchange response = context().createProducerTemplate().send("direct:lookupCpaId",request);
assertThat(response.getIn().getHeader(EbmsConstants.CPA, PartnerAgreement.class),is(notNullValue()));
assertThat(response.getIn().getHeader(EbmsConstants.CPA_ID, String.class),equalTo("testCPAId"));
}
@Test
public void testInvalidLookupCPAId() throws Exception {
Exchange request = new DefaultExchange(context());
request.getIn().setBody(loadEbmsMessage());
request.getIn().setHeader(EbmsConstants.MESSAGE_ID, "testMsgID");
request.getIn().setHeader(EbmsConstants.MESSAGE_SERVICE, "testService");
request.getIn().setHeader(EbmsConstants.MESSAGE_ACTION,"testAction2");
Exchange response = context().createProducerTemplate().send("direct:lookupCpaId",request);
assertThat(response.getIn().getHeader(EbmsConstants.CPA, PartnerAgreement.class),is(nullValue()));
assertThat(response.getIn().getHeader(EbmsConstants.CPA_ID, String.class),equalTo(EbmsConstants.CPA_ID_UNKNOWN));
}
@Test
public void testDefaultLookupCPAId() throws Exception {
Exchange request = new DefaultExchange(context());
request.getIn().setBody(loadEbmsMessage());
request.getIn().setHeader(EbmsConstants.MESSAGE_ID, "testMsgID");
request.getIn().setHeader(EbmsConstants.MESSAGE_SERVICE, "testService");
request.getIn().setHeader(EbmsConstants.MESSAGE_ACTION,"testAction2");
request.getIn().setHeader(EbmsConstants.DEFAULT_CPA_ID,"testCPAId");
Exchange response = context().createProducerTemplate().send("direct:lookupCpaId",request);
assertThat(response.getIn().getHeader(EbmsConstants.CPA, PartnerAgreement.class),is(notNullValue()));
assertThat(response.getIn().getHeader(EbmsConstants.CPA_ID, String.class),equalTo("testCPAId"));
}
@Test
public void testValidationErrors() throws Exception {
Exchange request = new DefaultExchange(context());
request.getIn().setBody(loadEbmsMessage());
request.getIn().setHeader(EbmsConstants.MESSAGE_ID, "testMsgID");
request.getIn().setHeader(EbmsConstants.REF_TO_MESSAGE_ID, "testRefMsgID");
request.getIn().setHeader(EbmsConstants.MESSAGE_SERVICE, "testServiceValidation");
request.getIn().setHeader(EbmsConstants.MESSAGE_ACTION,"testActionValidation");
request.getIn().setHeader(EbmsConstants.MESSAGE_TYPE, MessageType.USER_MESSAGE);
request.getIn().setHeader(EbmsConstants.CPA,createPartnerAgreement());
Exchange response = context().createProducerTemplate().send("direct:validatePartner",request);
assertThat(response.isFailed(),is(true));
assertThat(response.getException(),instanceOf(InvalidPartnerAgreementException.class));
InvalidPartnerAgreementException exception = response.getException(InvalidPartnerAgreementException.class);
assertThat(exception.getValidationErrors(),hasSize(1));
assertThat(exception.getValidationErrors().get(0).getError(),equalTo(EbmsError.EBMS_0003));
}
private PartnerAgreement createPartnerAgreement() {
PartnerAgreement agreement = new PartnerAgreement();
agreement.setCpaId("validationErrors");
BusinessInfo businessInfo = new BusinessInfo();
agreement.setBusinessInfo(businessInfo);
Service service = new Service("testServiceValidation","testActionValidation");
ValidationPredicate predicate = new ValidationPredicate() {
@Override
public boolean matches(Exchange exchange) {
exchange.getIn().setHeader(EbmsConstants.VALIDATION_ERROR_DESC,"message invalid....just because I don't like you");
return false;
}
};
service.setValidations(Arrays.asList(predicate));
agreement.getBusinessInfo().setServices(Arrays.asList(service));
return agreement;
}
private InputStream loadEbmsMessage() throws IOException {
return loadEbmsMessage("sample-ebms-user-message.xml");
}
private InputStream loadEbmsMessage(String filename) throws IOException {
return new ByteArrayInputStream(EbmsUtils.toStringFromClasspath(filename).getBytes());
}
@Override
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry registry = super.createRegistry();
cpaRepository = new MockCpaRepository();
registry.bind("cpaRepository", cpaRepository);
registry.bind("messageStore", mockMessageStore());
return registry;
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
ValidatePartnerAgreementRouteBuilder routeBuilder = new ValidatePartnerAgreementRouteBuilder();
return routeBuilder;
}
private class MockCpaRepository implements CPARepository {
@Override
public List<PartnerAgreement> getPartnerAgreements() {
return null;
}
@Override
public List<PartnerAgreement> getActivePartnerAgreements() {
return null;
}
@Override
public PartnerAgreement findByCPAId(@Header(EbmsConstants.CPA_ID) String cpaId) {
PartnerAgreement partnerAgreement = new PartnerAgreement();
partnerAgreement.setCpaId("testCPAId");
Protocol protocol = new Protocol();
protocol.setAddress("http://example.jentrata.com");
partnerAgreement.setProtocol(protocol);
BusinessInfo businessInfo = new BusinessInfo();
businessInfo.setServices(new ImmutableList.Builder<Service>()
.add(new Service("service", "action"))
.build()
);
partnerAgreement.setBusinessInfo(businessInfo);
return partnerAgreement;
}
@Override
public PartnerAgreement findByServiceAndAction(String service, String action) {
switch (service + "|" + action) {
case "service1|action1":
PartnerAgreement partnerAgreement = new PartnerAgreement();
partnerAgreement.setCpaId("testCPAId");
Protocol protocol = new Protocol();
protocol.setAddress("http://example.jentrata.com");
partnerAgreement.setProtocol(protocol);
BusinessInfo businessInfo = new BusinessInfo();
partnerAgreement.setBusinessInfo(businessInfo);
businessInfo.setServices(new ImmutableList.Builder<Service>()
.add(new Service(service, action))
.build()
);
return partnerAgreement;
case "testServiceValidation|testActionValidation":
return createPartnerAgreement();
default:
return null;
}
}
@Override
public PartnerAgreement findByMessage(Document message, String ebmsVersion) {
try {
String serviceValue = EbmsUtils.ebmsXpathValue(message.getDocumentElement(), "//eb3:CollaborationInfo/eb3:Service/text()");
String actionValue = EbmsUtils.ebmsXpathValue(message.getDocumentElement(),"//eb3:CollaborationInfo/eb3:Action/text()");
return findByServiceAndAction(serviceValue,actionValue);
} catch (XPathExpressionException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean isValidPartnerAgreement(Map<String, Object> fields) {
String service = (String) fields.get(EbmsConstants.MESSAGE_SERVICE);
String action = (String) fields.get(EbmsConstants.MESSAGE_ACTION);
PartnerAgreement agreement = findByServiceAndAction(service,action);
return agreement != null;
}
}
private MessageStore mockMessageStore() {
MessageStore mock = mock(MessageStore.class);
Message message = mock(Message.class);
doReturn("testCPAId").when(message).getCpaId();
doReturn(message).when(mock).findByMessageId(anyString(),anyString());
return mock;
}
}