package org.bonitasoft.web.rest.server.api.bpm.process;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bonitasoft.console.common.server.preferences.constants.WebBonitaConstantsUtils;
import org.bonitasoft.engine.api.ProcessAPI;
import org.bonitasoft.engine.api.TenantAPIAccessor;
import org.bonitasoft.engine.bpm.bar.BusinessArchive;
import org.bonitasoft.engine.bpm.bar.BusinessArchiveBuilder;
import org.bonitasoft.engine.bpm.bar.BusinessArchiveFactory;
import org.bonitasoft.engine.bpm.process.ProcessDeploymentInfo;
import org.bonitasoft.engine.bpm.process.ProcessDeploymentInfoCriterion;
import org.bonitasoft.engine.bpm.process.impl.ProcessDefinitionBuilder;
import org.bonitasoft.test.toolkit.bpm.TestProcess;
import org.bonitasoft.test.toolkit.bpm.TestProcessFactory;
import org.bonitasoft.test.toolkit.organization.TestUser;
import org.bonitasoft.test.toolkit.organization.TestUserFactory;
import org.bonitasoft.web.rest.model.bpm.process.ProcessItem;
import org.bonitasoft.web.rest.server.AbstractConsoleTest;
import org.bonitasoft.web.toolkit.client.data.APIID;
import org.junit.Test;
public class APIProcessIntegrationTest extends AbstractConsoleTest {
private APIProcess apiProcess;
@Override
protected TestUser getInitiator() {
return TestUserFactory.getJohnCarpenter();
}
@Override
public void consoleTestSetUp() throws Exception {
apiProcess = new APIProcess();
apiProcess.setCaller(getAPICaller(TestUserFactory.getJohnCarpenter().getSession(), "API/bpm/process"));
}
/**
* Add a process uploaded
*
* @throws Exception
*/
@Test
public void testAddProcessItem() throws Exception {
final ProcessAPI processAPI = TenantAPIAccessor.getProcessAPI(TestUserFactory.getJohnCarpenter().getSession());
final List<ProcessDeploymentInfo> before = processAPI.getProcessDeploymentInfos(0, 10, ProcessDeploymentInfoCriterion.DEFAULT);
//final upload process archive
final String targetDirPath = WebBonitaConstantsUtils.getInstance().getTenantsFolder().getPath() + File.separator
+ TestUserFactory.getJohnCarpenter().getSession().getTenantId();
final BusinessArchive businessArchive = new BusinessArchiveBuilder().createNewBusinessArchive()
.setProcessDefinition(new ProcessDefinitionBuilder().createNewInstance("Test process", "1.0").done()).done();
final File file = writeBarToFolder("addProcessTest", businessArchive, TestUserFactory.getJohnCarpenter().getSession().getTenantId());
// use api to deploy process uploaded
final ProcessItem item = new ProcessItem();
item.setAttribute("fileupload", file.getName());
apiProcess.add(item);
// check the process has been correctly uploaded
String assertMessage = "Can't add a ProcessItem to APIProcess. ";
int actualSize = -1;
final List<ProcessDeploymentInfo> processDeploymentInfos = processAPI.getProcessDeploymentInfos(0, 10, ProcessDeploymentInfoCriterion.DEFAULT);
if (processDeploymentInfos != null) {
actualSize = processDeploymentInfos.size();
for (ProcessDeploymentInfo processDeploymentInfo : processDeploymentInfos) {
assertMessage += "\nprocessDeploymentInfo=" + processDeploymentInfo;
}
} else {
assertMessage += "processDeploymentInfos is null.";
}
assertEquals(assertMessage, 1, actualSize - before.size());
}
/**
* Update state of an enabled process to disabled
*
* @throws Exception
*/
@Test
public void testUpdateProcessItem() throws Exception {
final APIID processDefinitionId = APIID.makeAPIID(TestProcessFactory.getDefaultHumanTaskProcess()
.addActor(getInitiator())
.setEnable(true)
.getId());
// assert process is well enabled
final ProcessAPI processAPI = TenantAPIAccessor.getProcessAPI(TestUserFactory.getJohnCarpenter().getSession());
final String expectedState = processAPI.getProcessDeploymentInfos(0, 1, ProcessDeploymentInfoCriterion.DEFAULT).get(0).getActivationState().name();
assertEquals("Process should start enabled", ProcessItem.VALUE_ACTIVATION_STATE_ENABLED, expectedState);
// use process api to update the state
final Map<String, String> attributes = new HashMap<String, String>();
attributes.put(ProcessItem.ATTRIBUTE_ACTIVATION_STATE, ProcessItem.VALUE_ACTIVATION_STATE_DISABLED);
final ProcessItem processItem = apiProcess.update(processDefinitionId, attributes);
// check the process is disabled (resolved)
assertEquals("Can't update a processItem with APIProcess <" + processItem.getActivationState() + " - " + ProcessItem.VALUE_ACTIVATION_STATE_DISABLED
+ ">",
processItem.getActivationState(), ProcessItem.VALUE_ACTIVATION_STATE_DISABLED);
}
/**
* Get a process
*
* @throws Exception
*/
@Test
public void testGetProcessItem() throws Exception {
final APIID processDefinitionId = APIID.makeAPIID(TestProcessFactory.getDefaultHumanTaskProcess()
.addActor(getInitiator())
.getId());
final ArrayList<String> deploys = new ArrayList<String>();
final ArrayList<String> counters = new ArrayList<String>();
assertEquals("Can't get a processItem with APIProcess", apiProcess.runGet(processDefinitionId, deploys, counters).getName(),
TestProcessFactory.getDefaultHumanTaskProcess().getProcessDefinition().getName());
assertEquals("Can't get a processItem with APIProcess", apiProcess.runGet(processDefinitionId, deploys, counters).getDescription(),
TestProcessFactory.getDefaultHumanTaskProcess().getProcessDefinition().getDescription());
}
/**
* Search process by its id
*
* @throws Exception
*/
@Test
public void testSearchProcessItemForUser() throws Exception {
final APIID processDefinitionId = APIID.makeAPIID(TestProcessFactory.getDefaultHumanTaskProcess()
.addActor(getInitiator())
.setEnable(true)
.getId());
// Set the filters
final HashMap<String, String> filters = new HashMap<String, String>();
filters.put(ProcessItem.FILTER_USER_ID, String.valueOf(TestUserFactory.getJohnCarpenter().getId()));
// Search the ProcessItem
final ArrayList<String> deploys = new ArrayList<String>();
final ArrayList<String> counters = new ArrayList<String>();
final ProcessItem processItem = apiProcess.runSearch(0, 10, null, ProcessItem.ATTRIBUTE_DISPLAY_NAME + " ASC", filters, deploys, counters)
.getResults().get(0);
assertEquals("Can't search a processItem with APIProcess <" + processDefinitionId + " - " + processItem.getId().toLong() + ">", processDefinitionId,
processItem.getId().toLong());
}
/*
* Create a temporary file, contain a businessArchive
* @return File
* the create temporary file
* @param String
* prefix path for the temporary file
* @param BusinessArchive
* businessArchive write in the temporary file
*/
private static File writeBarToFolder(final String barName, final BusinessArchive businessArchive, final Long tenantId) {
File tempFile = null;
try {
tempFile = File.createTempFile(barName, ".bar", WebBonitaConstantsUtils.getInstance(tenantId).getTempFolder());
tempFile.delete();
BusinessArchiveFactory.writeBusinessArchiveToFile(businessArchive, tempFile);
} catch (final IOException e) {
e.printStackTrace();
}
return tempFile;
}
/**
* Get the latest process version
*
* @throws Exception
*/
@Test
public void testGetLastProcessVersion() throws Exception {
// create 3 version of a process
final TestProcess p1 = new TestProcess(TestProcessFactory.getDefaultProcessDefinitionBuilder("multipleVersionsProcess", "aVersion"));
TestProcessFactory.getInstance().add(p1);
final TestProcess p2 = new TestProcess(TestProcessFactory.getDefaultProcessDefinitionBuilder("multipleVersionsProcess", "aVersion2"));
TestProcessFactory.getInstance().add(p2);
final TestProcess p3 = new TestProcess(TestProcessFactory.getDefaultProcessDefinitionBuilder("multipleVersionsProcess", "anOtherVersion"));
TestProcessFactory.getInstance().add(p3);
// map actor John Carpenter on the created processes, then set enable
p1.addActor(TestUserFactory.getJohnCarpenter()).setEnable(true);
p2.addActor(TestUserFactory.getJohnCarpenter()).setEnable(true);
p3.addActor(TestUserFactory.getJohnCarpenter()).setEnable(true);
// Set the filters
final HashMap<String, String> filters = new HashMap<String, String>();
filters.put(ProcessItem.FILTER_USER_ID, String.valueOf(TestUserFactory.getJohnCarpenter().getId()));
filters.put(ProcessItem.ATTRIBUTE_DISPLAY_NAME, "multipleVersionsProcess");
// search the last version of a process
final List<ProcessItem> resultList = apiProcess.runSearch(0, 1, null, ProcessItem.ATTRIBUTE_DEPLOYMENT_DATE + " DESC", filters, null, null)
.getResults();
// get the first element
final ProcessItem searchedProcessItem = resultList.get(0);
assertEquals("multipleVersionsProcess", searchedProcessItem.getDisplayName());
assertEquals("anOtherVersion", searchedProcessItem.getVersion());
//Because TestProcessFactory is based on names, at least 2 out of the three above processes should be cleaned manually.
// This could be improved later in TestProcessFactory
TestProcessFactory.getInstance().delete(p1);
TestProcessFactory.getInstance().delete(p2);
TestProcessFactory.getInstance().delete(p3);
}
}