package org.bonitasoft.web.rest.server.api.bpm.flownode.archive;
import static org.assertj.core.api.Assertions.assertThat;
import org.bonitasoft.engine.api.ProcessAPI;
import org.bonitasoft.engine.api.TenantAPIAccessor;
import org.bonitasoft.engine.bpm.flownode.ActivityInstanceCriterion;
import org.bonitasoft.engine.bpm.flownode.ArchivedActivityInstanceSearchDescriptor;
import org.bonitasoft.engine.bpm.flownode.HumanTaskInstance;
import org.bonitasoft.engine.bpm.process.ProcessInstance;
import org.bonitasoft.engine.search.SearchOptionsBuilder;
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.flownode.ArchivedActivityItem;
import org.bonitasoft.web.rest.server.AbstractConsoleTest;
import org.bonitasoft.web.rest.server.WaitUntil;
import org.bonitasoft.web.rest.server.framework.search.ItemSearchResult;
import org.junit.Assert;
import org.junit.Test;
public class APIArchivedActivityIT extends AbstractConsoleTest {
private APIArchivedActivity apiArchivedActivity;
@Override
public void consoleTestSetUp() throws Exception {
apiArchivedActivity = new APIArchivedActivity();
apiArchivedActivity.setCaller(getAPICaller(getInitiator().getSession(), "API/bpm/archivedActivity"));
}
@Override
protected TestUser getInitiator() {
return TestUserFactory.getJohnCarpenter();
}
private HumanTaskInstance initArchivedHumanTaskInstance() throws Exception {
final TestProcess defaultHumanTaskProcess = TestProcessFactory.getDefaultHumanTaskProcess();
defaultHumanTaskProcess.addActor(getInitiator());
final ProcessInstance processInstance = defaultHumanTaskProcess.startCase(getInitiator()).getProcessInstance();
waitPendingHumanTask();
// Retrieve a humanTaskInstance
final HumanTaskInstance humanTaskInstance = getProcessAPI().getPendingHumanTaskInstances(getInitiator().getId(), 0, 10, null).get(0);
getProcessAPI().assignUserTask(humanTaskInstance.getId(), getInitiator().getId());
waitAssignedHumanTask();
getProcessAPI().executeFlowNode(humanTaskInstance.getId());
waitArchivedActivityInstance(processInstance.getId());
return humanTaskInstance;
}
private ProcessAPI getProcessAPI() throws Exception {
return TenantAPIAccessor.getProcessAPI(getInitiator().getSession());
}
/**
* Wait the process contain PendingHumanTaskInstance
*/
private void waitPendingHumanTask() throws Exception {
Assert.assertTrue("no pending task instances are found", new WaitUntil(50, 3000) {
@Override
protected boolean check() throws Exception {
return getProcessAPI().getPendingHumanTaskInstances(getInitiator().getId(), 0, 10, null).size() >= 1;
}
}.waitUntil());
}
private void waitAssignedHumanTask() throws Exception {
Assert.assertTrue("Human task hasnt been assign", new WaitUntil(50, 3000) {
@Override
protected boolean check() throws Exception {
return getProcessAPI().getAssignedHumanTaskInstances(getInitiator().getId(), 0, 10,
ActivityInstanceCriterion.DEFAULT).size() >= 1;
}
}.waitUntil());
}
/**
* Wait the process contain ArchivedHumanTaskInstance
*/
private void waitArchivedActivityInstance(final long processInstanceId) throws Exception {
Assert.assertTrue("no archived task instances are found", new WaitUntil(50, 3000) {
@Override
protected boolean check() throws Exception {
final SearchOptionsBuilder searchOptionsBuilder = new SearchOptionsBuilder(0, 10);
searchOptionsBuilder.filter(ArchivedActivityInstanceSearchDescriptor.PARENT_PROCESS_INSTANCE_ID, processInstanceId);
return getProcessAPI().searchArchivedActivities(searchOptionsBuilder.done()).getCount() >= 1L;
}
}.waitUntil());
}
@Test
public void testSearchWithDefaultOrder() throws Exception {
verifySearhWithOrder(apiArchivedActivity.defineDefaultSearchOrder());
}
@Test
public void testSearchWithNoOrder() throws Exception {
verifySearhWithOrder(null);
}
private void verifySearhWithOrder(final String order) throws Exception {
//given
initArchivedHumanTaskInstance();
//when
final ItemSearchResult<ArchivedActivityItem> search = apiArchivedActivity.runSearch(0, 1, null, order, null, null, null);
//then
assertThat(search.getResults()).as("should get results").isNotEmpty();
}
}