package org.camunda.bpm.extension.needle; import org.camunda.bpm.engine.AuthorizationService; import org.camunda.bpm.engine.CaseService; import org.camunda.bpm.engine.DecisionService; import org.camunda.bpm.engine.ExternalTaskService; import org.camunda.bpm.engine.FilterService; import org.camunda.bpm.engine.FormService; import org.camunda.bpm.engine.HistoryService; import org.camunda.bpm.engine.IdentityService; import org.camunda.bpm.engine.ManagementService; import org.camunda.bpm.engine.ProcessEngine; import org.camunda.bpm.engine.ProcessEngineConfiguration; import org.camunda.bpm.engine.RepositoryService; import org.camunda.bpm.engine.RuntimeService; import org.camunda.bpm.engine.TaskService; import org.camunda.bpm.engine.test.ChainedTestRule; import org.camunda.bpm.engine.test.ProcessEngineTestRule; import org.camunda.bpm.engine.test.ProcessEngineTestWatcher; import org.camunda.bpm.engine.test.assertions.ProcessEngineAssertions; import org.camunda.bpm.engine.test.function.GetProcessEngineConfiguration; import org.camunda.bpm.engine.test.needle.CamundaInstancesSupplier; import org.junit.rules.RuleChain; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.needle4j.injection.InjectionProvider; import org.needle4j.injection.InjectionProviderInstancesSupplier; import org.needle4j.injection.InjectionProviders; import org.needle4j.junit.testrule.NeedleTestRule; import javax.sql.DataSource; import java.util.Date; import java.util.Set; import static org.needle4j.junit.NeedleBuilders.needleMockitoTestRule; /** * Combines the {@link org.camunda.bpm.engine.test.ProcessEngineRule} and the * {@link org.needle4j.junit.testrule.NeedleTestRule}via {@link RuleChain}. * Camunda Services can be injected in test instances and @Deployment-annotated * test methods are interpreted. * * @author Jan Galinski, Holisticon AG (jan.galinski@holisticon.de) */ public class ProcessEngineNeedleRule extends ChainedTestRule<NeedleTestRule, ProcessEngineTestWatcher> implements ProcessEngineTestRule { /** * @param testInstance the test instance to inject to * @return builder to create the rule */ public static ProcessEngineNeedleRuleBuilder fluentNeedleRule(final Object testInstance) { return new ProcessEngineNeedleRuleBuilder(testInstance); } private final ProcessEngineTestWatcher innerRule; ProcessEngineNeedleRule(final Object testInstance, final ProcessEngine processEngine, final InjectionProviderInstancesSupplier additionalProvidersSupplier) { // @formatter:off super(needleMockitoTestRule(testInstance).addSupplier(new CamundaInstancesSupplier(processEngine)).addSupplier(additionalProvidersSupplier).build()); // @formatter:on this.innerRule = new ProcessEngineTestWatcher(processEngine); } ProcessEngineNeedleRule(final Object testInstance, final ProcessEngineConfiguration configuration, final Set<InjectionProvider<?>> injectionProviders) { this(testInstance, configuration.buildProcessEngine(), InjectionProviders.supplierForInjectionProviders(injectionProviders)); } @Override public Statement apply(Statement base, Description description) { ProcessEngineAssertions.init(getProcessEngine()); try { return super.apply(base, description); } finally { ProcessEngineAssertions.reset(); } } @Override protected ProcessEngineTestWatcher innerRule() { return innerRule; } @Override public void setCurrentTime(Date currentTime) { innerRule.setCurrentTime(currentTime); } @Override public String getDeploymentId() { return innerRule.getDeploymentId(); } @Override public ProcessEngine getProcessEngine() { return innerRule.getProcessEngine(); } @Override public RepositoryService getRepositoryService() { return innerRule.getRepositoryService(); } @Override public RuntimeService getRuntimeService() { return innerRule.getRuntimeService(); } @Override public FormService getFormService() { return innerRule.getFormService(); } @Override public TaskService getTaskService() { return innerRule.getTaskService(); } @Override public HistoryService getHistoryService() { return innerRule.getHistoryService(); } @Override public IdentityService getIdentityService() { return innerRule.getIdentityService(); } @Override public ManagementService getManagementService() { return innerRule.getManagementService(); } public ProcessEngineConfiguration getProcessEngineConfiguration() { return GetProcessEngineConfiguration.INSTANCE.apply(getProcessEngine()); } public DataSource getProcessEngineDataSource() { return getProcessEngineConfiguration().getDataSource(); } @Override public AuthorizationService getAuthorizationService() { return innerRule.getAuthorizationService(); } @Override public CaseService getCaseService() { return innerRule.getCaseService(); } @Override public FilterService getFilterService() { return innerRule.getFilterService(); } @Override public ExternalTaskService getExternalTaskService() { return innerRule.getExternalTaskService(); } @Override public DecisionService getDecisionService() { return innerRule.getDecisionService(); } }