package org.camunda.bpm.camel.component.producer;
import static org.camunda.bpm.camel.component.CamundaBpmConstants.ACTIVITY_ID_PARAMETER;
import static org.camunda.bpm.camel.component.CamundaBpmConstants.EXCHANGE_HEADER_BUSINESS_KEY;
import static org.camunda.bpm.camel.component.CamundaBpmConstants.EXCHANGE_HEADER_CORRELATION_KEY;
import static org.camunda.bpm.camel.component.CamundaBpmConstants.EXCHANGE_HEADER_CORRELATION_KEY_TYPE;
import static org.camunda.bpm.camel.component.CamundaBpmConstants.EXCHANGE_HEADER_PROCESS_INSTANCE_ID;
import static org.camunda.bpm.camel.component.CamundaBpmConstants.CORRELATION_KEY_NAME_PARAMETER;
import static org.camunda.bpm.camel.component.CamundaBpmConstants.MESSAGE_NAME_PARAMETER;
import static org.camunda.bpm.camel.component.CamundaBpmConstants.COPY_MESSAGE_BODY_AS_PROCESS_VARIABLE_PARAMETER;
import static org.camunda.bpm.camel.component.CamundaBpmConstants.camundaBpmUri;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyMap;
import static org.mockito.Matchers.anyMapOf;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Map;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Producer;
import org.camunda.bpm.camel.BaseCamelTest;
import org.camunda.bpm.camel.component.CamundaBpmEndpoint;
import org.camunda.bpm.engine.runtime.Execution;
import org.camunda.bpm.engine.runtime.ExecutionQuery;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.camunda.bpm.engine.runtime.ProcessInstanceQuery;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
public class MessageProducerTest extends BaseCamelTest {
@Test
public void getSignalProcessProducerFromUri() throws Exception {
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(
camundaBpmUri("message?" + ACTIVITY_ID_PARAMETER + "=" + "anActivityId"));
Producer producer = endpoint.createProducer();
assertThat(producer).isInstanceOf(MessageProducer.class);
}
@SuppressWarnings("unchecked")
@Test
public void messageIsDeliveredCalled() throws Exception {
ProcessInstance processInstance = mock(ProcessInstance.class);
when(processInstance.getProcessInstanceId()).thenReturn("theProcessInstanceId");
when(processInstance.getProcessDefinitionId()).thenReturn("theProcessDefinitionId");
when(runtimeService.startProcessInstanceByKey(eq("aProcessDefinitionKey"), anyMap())).thenReturn(
processInstance);
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(
camundaBpmUri("message?" + ACTIVITY_ID_PARAMETER + "=" + "anActivityId"));
Producer producer = endpoint.createProducer();
assertThat(producer).isInstanceOf(MessageProducer.class);
}
@SuppressWarnings("unchecked")
@Test
public void signalCalled() throws Exception {
Exchange exchange = mock(Exchange.class);
Message message = mock(Message.class);
ExecutionQuery query = mock(ExecutionQuery.class);
Execution execution = mock(Execution.class);
when(exchange.getIn()).thenReturn(message);
when(exchange.getProperty(eq(EXCHANGE_HEADER_PROCESS_INSTANCE_ID), eq(String.class))).thenReturn(
"theProcessInstanceId");
when(runtimeService.createExecutionQuery()).thenReturn(query);
when(query.processInstanceId(anyString())).thenReturn(query);
when(query.activityId(anyString())).thenReturn(query);
when(query.singleResult()).thenReturn(execution);
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(
camundaBpmUri("message?" + ACTIVITY_ID_PARAMETER + "=" + "anActivityId"));
Producer producer = endpoint.createProducer();
producer.process(exchange);
verify(runtimeService).signal(anyString(), anyMap());
}
@Test
public void signalTransformBusinesskey() throws Exception {
Exchange exchange = mock(Exchange.class);
Message message = mock(Message.class);
ExecutionQuery query = mock(ExecutionQuery.class);
Execution execution = mock(Execution.class);
ProcessInstanceQuery piQuery = mock(ProcessInstanceQuery.class);
ProcessInstance processInstance = mock(ProcessInstance.class);
when(exchange.getIn()).thenReturn(message);
when(exchange.getProperty(eq(EXCHANGE_HEADER_BUSINESS_KEY), eq(String.class))).thenReturn("theBusinessKey");
when(runtimeService.createProcessInstanceQuery()).thenReturn(piQuery);
when(runtimeService.createExecutionQuery()).thenReturn(query);
when(piQuery.processInstanceBusinessKey(anyString())).thenReturn(piQuery);
when(piQuery.singleResult()).thenReturn(processInstance);
when(processInstance.getId()).thenReturn("theProcessInstanceId");
when(query.processInstanceId(anyString())).thenReturn(query);
when(query.activityId(anyString())).thenReturn(query);
when(query.singleResult()).thenReturn(execution);
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(
camundaBpmUri("message?" + ACTIVITY_ID_PARAMETER + "=" + "anActivityId"));
Producer producer = endpoint.createProducer();
producer.process(exchange);
verify(piQuery).processInstanceBusinessKey("theBusinessKey");
verify(query).processInstanceId("theProcessInstanceId");
}
@SuppressWarnings("unchecked")
@Test
public void messageProcessInstanceId() throws Exception {
Exchange exchange = mock(Exchange.class);
Message message = mock(Message.class);
ExecutionQuery query = mock(ExecutionQuery.class);
Execution execution = mock(Execution.class);
when(exchange.getIn()).thenReturn(message);
when(exchange.getProperty(eq(EXCHANGE_HEADER_PROCESS_INSTANCE_ID), eq(String.class))).thenReturn(
"theProcessInstanceId");
when(runtimeService.createExecutionQuery()).thenReturn(query);
when(query.processInstanceId(anyString())).thenReturn(query);
when(query.messageEventSubscriptionName(anyString())).thenReturn(query);
when(query.singleResult()).thenReturn(execution);
when(execution.getId()).thenReturn("theExecutionId");
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(
camundaBpmUri("message?" + MESSAGE_NAME_PARAMETER + "=" + "aMessageName"));
Producer producer = endpoint.createProducer();
producer.process(exchange);
verify(query).processInstanceId("theProcessInstanceId");
verify(query).messageEventSubscriptionName("aMessageName");
verify(runtimeService).messageEventReceived(eq("aMessageName"), eq("theExecutionId"), anyMap());
}
@SuppressWarnings("unchecked")
@Test
public void messageBusinessKey() throws Exception {
Exchange exchange = mock(Exchange.class);
Message message = mock(Message.class);
when(exchange.getIn()).thenReturn(message);
when(exchange.getProperty(eq(EXCHANGE_HEADER_BUSINESS_KEY), eq(String.class))).thenReturn("theBusinessKey");
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(
camundaBpmUri("message?" + MESSAGE_NAME_PARAMETER + "=" + "aMessageName"));
Producer producer = endpoint.createProducer();
producer.process(exchange);
@SuppressWarnings("rawtypes")
Class<Map<String, Object>> mapClass = (Class<Map<String, Object>>) (Class) Map.class;
ArgumentCaptor<Map<String, Object>> correlationCaptor = ArgumentCaptor.forClass(mapClass);
verify(runtimeService).correlateMessage(eq("aMessageName"),
eq("theBusinessKey"),
correlationCaptor.capture(),
anyMap());
assertThat(correlationCaptor.getValue().size()).isEqualTo(0);
}
@SuppressWarnings("unchecked")
@Test
public void messageBusinessKeyCorrelationKey() throws Exception {
Exchange exchange = mock(Exchange.class);
Message message = mock(Message.class);
final String BODY = "body";
when(message.getBody()).thenReturn(BODY);
when(exchange.getIn()).thenReturn(message);
when(exchange.getProperty(eq(EXCHANGE_HEADER_BUSINESS_KEY), eq(String.class))).thenReturn("theBusinessKey");
when(exchange.getProperty(eq(EXCHANGE_HEADER_CORRELATION_KEY), eq(String.class))).thenReturn("theCorrelationKey");
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(camundaBpmUri(
"message?" + MESSAGE_NAME_PARAMETER + "=" + "aMessageName" + "&" + CORRELATION_KEY_NAME_PARAMETER + "="
+ "aCorrelationKeyName" + "&" + COPY_MESSAGE_BODY_AS_PROCESS_VARIABLE_PARAMETER + "=test"));
Producer producer = endpoint.createProducer();
producer.process(exchange);
@SuppressWarnings("rawtypes")
Class<Map<String, Object>> mapClass = (Class<Map<String, Object>>) (Class) Map.class;
ArgumentCaptor<Map<String, Object>> correlationCaptor = ArgumentCaptor.forClass(mapClass);
ArgumentCaptor<Map<String, Object>> variablesCaptor = ArgumentCaptor.forClass(mapClass);
verify(runtimeService).correlateMessage(eq("aMessageName"),
eq("theBusinessKey"),
correlationCaptor.capture(),
variablesCaptor.capture());
assertThat(correlationCaptor.getValue().size()).isEqualTo(1);
assertTrue(correlationCaptor.getValue().keySet().contains("aCorrelationKeyName"));
assertTrue(correlationCaptor.getValue().values().contains("theCorrelationKey"));
assertThat(variablesCaptor.getValue().size()).isEqualTo(1);
assertTrue(variablesCaptor.getValue().containsKey("test"));
assertTrue(variablesCaptor.getValue().containsValue(BODY));
}
@SuppressWarnings("unchecked")
@Test
public void messageBusinessKeyCorrelationKeyType() throws Exception {
Exchange exchange = mock(Exchange.class);
Message message = mock(Message.class);
when(exchange.getIn()).thenReturn(message);
when(exchange.getProperty(eq(EXCHANGE_HEADER_BUSINESS_KEY), eq(String.class))).thenReturn("theBusinessKey");
when(exchange.getProperty(eq(EXCHANGE_HEADER_CORRELATION_KEY), eq(java.lang.Integer.class))).thenReturn(15);
when(exchange.getProperty(eq(EXCHANGE_HEADER_CORRELATION_KEY_TYPE), eq(String.class))).thenReturn(
"java.lang.Integer");
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(camundaBpmUri(
"message?" + MESSAGE_NAME_PARAMETER + "=" + "aMessageName" + "&" + CORRELATION_KEY_NAME_PARAMETER + "="
+ "aCorrelationKeyName" + "&" + EXCHANGE_HEADER_CORRELATION_KEY_TYPE + "=java.lang.Integer"));
Producer producer = endpoint.createProducer();
producer.process(exchange);
@SuppressWarnings("rawtypes")
Class<Map<String, Object>> mapClass = (Class<Map<String, Object>>) (Class) Map.class;
ArgumentCaptor<Map<String, Object>> correlationCaptor = ArgumentCaptor.forClass(mapClass);
verify(runtimeService).correlateMessage(eq("aMessageName"),
eq("theBusinessKey"),
correlationCaptor.capture(),
anyMap());
assertThat(correlationCaptor.getValue().size()).isEqualTo(1);
assertTrue(correlationCaptor.getValue().keySet().contains("aCorrelationKeyName"));
assertTrue(correlationCaptor.getValue().values().contains(15));
}
@SuppressWarnings("unchecked")
@Test
public void messageNoKey() throws Exception {
Exchange exchange = mock(Exchange.class);
Message message = mock(Message.class);
when(exchange.getIn()).thenReturn(message);
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(
camundaBpmUri("message?" + MESSAGE_NAME_PARAMETER + "=" + "aMessageName"));
Producer producer = endpoint.createProducer();
producer.process(exchange);
@SuppressWarnings("rawtypes")
Class<Map<String, Object>> mapClass = (Class<Map<String, Object>>) (Class) Map.class;
ArgumentCaptor<Map<String, Object>> correlationCaptor = ArgumentCaptor.forClass(mapClass);
verify(runtimeService).correlateMessage(eq("aMessageName"),
correlationCaptor.capture(),
anyMapOf(String.class, Object.class));
assertThat(correlationCaptor.getValue().size()).isEqualTo(0);
}
@SuppressWarnings("unchecked")
@Test
public void messageCorrelationKey() throws Exception {
Exchange exchange = mock(Exchange.class);
Message message = mock(Message.class);
when(exchange.getIn()).thenReturn(message);
when(exchange.getProperty(eq(EXCHANGE_HEADER_CORRELATION_KEY), eq(String.class))).thenReturn("theCorrelationKey");
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(
camundaBpmUri("message?" + MESSAGE_NAME_PARAMETER + "=" + "aMessageName" + "&"
+ CORRELATION_KEY_NAME_PARAMETER + "=" + "aCorrelationKeyName"));
Producer producer = endpoint.createProducer();
producer.process(exchange);
@SuppressWarnings("rawtypes")
Class<Map<String, Object>> mapClass = (Class<Map<String, Object>>) (Class) Map.class;
ArgumentCaptor<Map<String, Object>> correlationCaptor = ArgumentCaptor.forClass(mapClass);
verify(runtimeService).correlateMessage(eq("aMessageName"),
correlationCaptor.capture(),
anyMapOf(String.class, Object.class));
assertThat(correlationCaptor.getValue().size()).isEqualTo(1);
assertTrue(correlationCaptor.getValue().keySet().contains("aCorrelationKeyName"));
assertTrue(correlationCaptor.getValue().values().contains("theCorrelationKey"));
}
@Test(expected = IllegalArgumentException.class)
public void shouldFailWithoutMessageActivityId() throws Exception {
CamundaBpmEndpoint endpoint = (CamundaBpmEndpoint) camelContext.getEndpoint(camundaBpmUri("message"));
endpoint.createProducer();
}
}