package org.camunda.bpm.camel.common; 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_PROCESS_INSTANCE_ID; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.ProducerTemplate; import org.camunda.bpm.camel.BaseCamelTest; import org.camunda.bpm.engine.ProcessEngine; import org.camunda.bpm.engine.impl.context.BpmnExecutionContext; import org.camunda.bpm.engine.impl.context.Context; import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Context.class) public class CamelServiceTest extends BaseCamelTest { protected CamelServiceCommonImpl service; protected ProducerTemplate producerTemplate; protected ExecutionEntity execution; @Before public void setupService() { service = new CamelServiceCommonImpl() { @Override public void setProcessEngine(ProcessEngine processEngine) { this.processEngine = processEngine; } @Override public void setCamelContext(CamelContext camelContext) { this.camelContext = camelContext; } }; service.setProcessEngine(processEngine); CamelContext camelContext = mock(CamelContext.class); service.setCamelContext(camelContext); producerTemplate = mock(ProducerTemplate.class); when(camelContext.createProducerTemplate()).thenReturn(producerTemplate); BpmnExecutionContext executionContext = mock(BpmnExecutionContext.class); execution = mock(ExecutionEntity.class); when(executionContext.getExecution()).thenReturn(execution); when(execution.getProcessInstanceId()).thenReturn("theProcessInstanceId"); when(execution.getBusinessKey()).thenReturn("theBusinessKey"); when(execution.getVariable(anyString())).thenReturn("theVariable"); PowerMockito.mockStatic(Context.class); PowerMockito.when(Context.getBpmnExecutionContext()).thenReturn( executionContext); } @Test public void testSendToEndpoint() throws Exception { Exchange send = mock(Exchange.class); Message message = mock(Message.class); when(send.getIn()).thenReturn(message); when(producerTemplate.send(anyString(), any(Exchange.class))).thenReturn( send); ArgumentCaptor<Exchange> exchangeCaptor = ArgumentCaptor .forClass(Exchange.class); service.sendTo("what/ever"); verify(producerTemplate).send(anyString(), exchangeCaptor.capture()); verify(execution).getVariableNames(); assertThat(exchangeCaptor.getValue().getProperty(EXCHANGE_HEADER_BUSINESS_KEY)) .isEqualTo("theBusinessKey"); assertThat( exchangeCaptor.getValue().getProperty(EXCHANGE_HEADER_CORRELATION_KEY)) .isNull(); assertThat( exchangeCaptor.getValue().getProperty(EXCHANGE_HEADER_PROCESS_INSTANCE_ID)) .isEqualTo("theProcessInstanceId"); } @Test public void testSendToEndpointWithNoVariables() throws Exception { Exchange send = mock(Exchange.class); Message message = mock(Message.class); when(send.getIn()).thenReturn(message); when(producerTemplate.send(anyString(), any(Exchange.class))).thenReturn( send); ArgumentCaptor<Exchange> exchangeCaptor = ArgumentCaptor .forClass(Exchange.class); service.sendTo("what/ever", ""); verify(producerTemplate).send(anyString(), exchangeCaptor.capture()); verify(execution, never()).getVariableNames(); } @Test public void testSendToEndpointWithOneVariable() throws Exception { Exchange send = mock(Exchange.class); Message message = mock(Message.class); when(send.getIn()).thenReturn(message); when(producerTemplate.send(anyString(), any(Exchange.class))).thenReturn( send); ArgumentCaptor<Exchange> exchangeCaptor = ArgumentCaptor .forClass(Exchange.class); service.sendTo("what/ever", "varName"); verify(producerTemplate).send(anyString(), exchangeCaptor.capture()); verify(execution, never()).getVariableNames(); verify(execution).getVariable("varName"); } @Test public void testSendToEndpointWithAlleVariables() throws Exception { Exchange send = mock(Exchange.class); Message message = mock(Message.class); when(send.getIn()).thenReturn(message); when(producerTemplate.send(anyString(), any(Exchange.class))).thenReturn( send); ArgumentCaptor<Exchange> exchangeCaptor = ArgumentCaptor .forClass(Exchange.class); service.sendTo("what/ever", null); verify(producerTemplate).send(anyString(), exchangeCaptor.capture()); verify(execution).getVariableNames(); } @Test public void testSendToEndpointWithCorrelation() throws Exception { Exchange send = mock(Exchange.class); Message message = mock(Message.class); when(send.getIn()).thenReturn(message); when(producerTemplate.send(anyString(), any(Exchange.class))).thenReturn( send); ArgumentCaptor<Exchange> exchangeCaptor = ArgumentCaptor .forClass(Exchange.class); service.sendTo("what/ever", null, "theCorrelationKey"); verify(producerTemplate).send(anyString(), exchangeCaptor.capture()); assertThat( exchangeCaptor.getValue().getProperty(EXCHANGE_HEADER_CORRELATION_KEY)) .isEqualTo("theCorrelationKey"); } }