package org.camunda.bpm.extension.osgi.blueprint; import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.isA; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Collections; import java.util.List; import org.camunda.bpm.engine.impl.cfg.StandaloneProcessEngineConfiguration; import org.camunda.bpm.engine.impl.javax.el.CompositeELResolver; import org.camunda.bpm.engine.impl.javax.el.ELResolver; import org.camunda.bpm.engine.impl.scripting.engine.BeansResolverFactory; import org.camunda.bpm.engine.impl.scripting.engine.ResolverFactory; import org.camunda.bpm.engine.impl.scripting.engine.VariableScopeResolverFactory; import org.camunda.bpm.extension.osgi.engine.ProcessEngineFactoryWithELResolver; import org.camunda.bpm.extension.osgi.scripting.impl.OsgiScriptingEngines; import org.hamcrest.Matcher; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; public class ProcessEngineFactoryWithELResolverTest { private ProcessEngineFactoryWithELResolver factory; @Before public void setUp() { factory = new ProcessEngineFactoryWithELResolver(); } @Test public void initWithBlueprintELResolverAndWithoutResolverFactories() throws Exception { StandaloneProcessEngineConfiguration config = mock(StandaloneProcessEngineConfiguration.class); when(config.getResolverFactories()).thenReturn(null); factory.setProcessEngineConfiguration(config); factory.setExpressionManager(new BlueprintExpressionManager()); factory.init(); // captures ArgumentCaptor<BlueprintExpressionManager> elManagerCaptor = ArgumentCaptor .forClass(BlueprintExpressionManager.class); verify(config).setExpressionManager(elManagerCaptor.capture()); ArgumentCaptor<OsgiScriptingEngines> scriptCaptor = ArgumentCaptor .forClass(OsgiScriptingEngines.class); verify(config).setScriptingEngines(scriptCaptor.capture()); // checks checkScriptingEngine(scriptCaptor.getValue()); checkExpressionManager(elManagerCaptor.getValue()); } private void checkScriptingEngine(OsgiScriptingEngines scriptingEngine) { assertThat(scriptingEngine, isA(OsgiScriptingEngines.class)); List<ResolverFactory> resolverFactories = scriptingEngine .getScriptBindingsFactory().getResolverFactories(); assertThat(resolverFactories.size(), is(2)); Matcher<Iterable<? super VariableScopeResolverFactory>> hasItem = hasItem(isA(VariableScopeResolverFactory.class)); assertThat(resolverFactories, hasItem); Matcher<Iterable<? super BeansResolverFactory>> hasItem2 = hasItem(isA(BeansResolverFactory.class)); assertThat(resolverFactories, hasItem2); } private void checkExpressionManager(BlueprintExpressionManager exprManager) { exprManager.setBlueprintELResolver(new BlueprintELResolver()); ELResolver elResolver = exprManager.createElResolver(); assertThat(elResolver, is(instanceOf(CompositeELResolver.class))); // FIXME gotta find a way to get hold of Resolvers inside // compositeResolver to check that the expected ones are set } @Test(expected = NullPointerException.class) public void initWithoutBlueprintELResolverCausesNPEInBlueprintExpressionManager() throws Exception { StandaloneProcessEngineConfiguration config = mock(StandaloneProcessEngineConfiguration.class); factory.setProcessEngineConfiguration(config); factory.init(); // captures ArgumentCaptor<BlueprintExpressionManager> elManagerCaptor = ArgumentCaptor .forClass(BlueprintExpressionManager.class); verify(config).setExpressionManager(elManagerCaptor.capture()); elManagerCaptor.getValue().createElResolver(); } @Test public void initWithResolverFactories() throws Exception { StandaloneProcessEngineConfiguration config = mock(StandaloneProcessEngineConfiguration.class); ResolverFactory resolverFactory = mock(ResolverFactory.class); when(config.getResolverFactories()).thenReturn( Collections.singletonList(resolverFactory)); factory.setProcessEngineConfiguration(config); factory.init(); // captures ArgumentCaptor<OsgiScriptingEngines> scriptCaptor = ArgumentCaptor .forClass(OsgiScriptingEngines.class); verify(config).setScriptingEngines(scriptCaptor.capture()); // checks assertThat(scriptCaptor.getValue().getScriptBindingsFactory() .getResolverFactories(), hasItem(resolverFactory)); } }