/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.rest.service.api.runtime; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.impl.cmd.ChangeDeploymentTenantIdCmd; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.test.Deployment; import org.activiti.rest.service.BaseSpringRestTestCase; import org.activiti.rest.service.api.RestUrls; import org.apache.http.HttpStatus; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; /** * Test for all REST-operations related to a single Process instance resource. * * @author Frederik Heremans * @author Saeid Mirzaei */ public class ProcessInstanceCollectionResourceTest extends BaseSpringRestTestCase { // check if process instance query with business key with and without includeProcess Variables // related to https://activiti.atlassian.net/browse/ACT-1992 @Deployment(resources = {"org/activiti/rest/service/api/runtime/ProcessInstanceResourceTest.process-one.bpmn20.xml"}) public void testGetProcessInstancesByBusinessKeyAndIncludeVariables() throws Exception { HashMap<String, Object> variables = new HashMap<String, Object>(); variables.put("myVar1", "myVar1"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processOne", "myBusinessKey", variables); String processId = processInstance.getId(); // check that the right process is returned with no variables String url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?businessKey=myBusinessKey"; CloseableHttpResponse response = executeRequest(new HttpGet(SERVER_URL_PREFIX + url), HttpStatus.SC_OK); JsonNode rootNode = objectMapper.readTree(response.getEntity().getContent()); closeResponse(response); assertTrue(rootNode.size() > 0 ); assertEquals(1, rootNode.get("data").size()); JsonNode dataNode = rootNode.get("data").get(0); assertEquals(processId, dataNode.get("id").asText()); assertEquals(processInstance.getProcessDefinitionId(), dataNode.get("processDefinitionId").asText()); assertTrue(dataNode.get("processDefinitionUrl").asText().contains(processInstance.getProcessDefinitionId())); JsonNode variableNodes = dataNode.get("variables"); assertEquals(0, variableNodes.size()); // check that the right process is returned along with the variables when includeProcessvariable is set url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?businessKey=myBusinessKey&includeProcessVariables=true"; response = executeRequest(new HttpGet(SERVER_URL_PREFIX + url), HttpStatus.SC_OK); rootNode = objectMapper.readTree(response.getEntity().getContent()); closeResponse(response); assertTrue(rootNode.size() > 0 ); assertEquals(1, rootNode.get("data").size()); dataNode = rootNode.get("data").get(0); assertEquals(processId, dataNode.get("id").textValue()); assertEquals(processInstance.getProcessDefinitionId(), dataNode.get("processDefinitionId").asText()); assertTrue(dataNode.get("processDefinitionUrl").asText().contains(processInstance.getProcessDefinitionId())); variableNodes = dataNode.get("variables"); assertEquals(1, variableNodes.size()); variableNodes = dataNode.get("variables"); assertEquals(1, variableNodes.size()); assertNotNull(variableNodes.get(0).get("name")); assertNotNull(variableNodes.get(0).get("value")); assertEquals("myVar1", variableNodes.get(0).get("name").asText()); assertEquals("myVar1", variableNodes.get(0).get("value").asText()); } /** * Test getting a list of process instance, using all possible filters. */ @Deployment(resources = {"org/activiti/rest/service/api/runtime/ProcessInstanceResourceTest.process-one.bpmn20.xml"}) public void testGetProcessInstances() throws Exception { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processOne", "myBusinessKey"); String id = processInstance.getId(); runtimeService.addUserIdentityLink(id, "kermit", "whatever"); // Test without any parameters String url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION); assertResultsPresentInDataResponse(url, id); // Process instance id url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?id=" + id; assertResultsPresentInDataResponse(url, id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?id=anotherId"; assertResultsPresentInDataResponse(url); // Process instance business key url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?businessKey=myBusinessKey"; assertResultsPresentInDataResponse(url, id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?businessKey=anotherBusinessKey"; assertResultsPresentInDataResponse(url); // Process definition key url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?processDefinitionKey=processOne"; assertResultsPresentInDataResponse(url, id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?processDefinitionKey=processTwo"; assertResultsPresentInDataResponse(url); // Process definition id url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?processDefinitionId=" + processInstance.getProcessDefinitionId(); assertResultsPresentInDataResponse(url, id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?processDefinitionId=anotherId"; assertResultsPresentInDataResponse(url); // Involved user url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?involvedUser=kermit"; assertResultsPresentInDataResponse(url, id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?involvedUser=gonzo"; assertResultsPresentInDataResponse(url); // Active process url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?suspended=false"; assertResultsPresentInDataResponse(url, id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?suspended=true"; assertResultsPresentInDataResponse(url); // Suspended process runtimeService.suspendProcessInstanceById(id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?suspended=true"; assertResultsPresentInDataResponse(url, id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?suspended=false"; assertResultsPresentInDataResponse(url); runtimeService.activateProcessInstanceById(id); // Complete first task in the process to have a subprocess created taskService.complete(taskService.createTaskQuery().processInstanceId(id).singleResult().getId()); ProcessInstance subProcess = runtimeService.createProcessInstanceQuery().superProcessInstanceId(id).singleResult(); assertNotNull(subProcess); // Super-process instance id url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?superProcessInstanceId=" + id; assertResultsPresentInDataResponse(url, subProcess.getId()); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?superProcessInstanceId=anotherId"; assertResultsPresentInDataResponse(url); // Sub-process instance id url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?subProcessInstanceId=" + subProcess.getId(); assertResultsPresentInDataResponse(url, id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?subProcessInstanceId=anotherId"; assertResultsPresentInDataResponse(url); } /** * Test getting a list of process instance, using all tenant filters. */ @Deployment(resources = {"org/activiti/rest/service/api/runtime/ProcessInstanceResourceTest.process-one.bpmn20.xml"}) public void testGetProcessInstancesTenant() throws Exception { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processOne", "myBusinessKey"); String id = processInstance.getId(); // Test without tenant id String url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?withoutTenantId=true"; assertResultsPresentInDataResponse(url, id); // Update the tenant for the deployment managementService.executeCommand(new ChangeDeploymentTenantIdCmd(deploymentId, "myTenant")); // Test tenant id url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?tenantId=myTenant"; assertResultsPresentInDataResponse(url, id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?tenantId=anotherTenant"; assertResultsPresentInDataResponse(url); // Test tenant id like url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?tenantIdLike=" + encode("%enant"); assertResultsPresentInDataResponse(url, id); url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?tenantIdLike=" + encode("%what"); assertResultsPresentInDataResponse(url); // Test without tenant id url = RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION) + "?withoutTenantId=true"; assertResultsPresentInDataResponse(url); } /** * Test starting a process instance using procDefinitionId, key procDefinitionKey business-key. */ @Deployment(resources = {"org/activiti/rest/service/api/runtime/ProcessInstanceResourceTest.process-one.bpmn20.xml"}) public void testStartProcess() throws Exception { ObjectNode requestNode = objectMapper.createObjectNode(); // Start using process definition key requestNode.put("processDefinitionKey", "processOne"); HttpPost httpPost = new HttpPost(SERVER_URL_PREFIX + RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION)); httpPost.setEntity(new StringEntity(requestNode.toString())); CloseableHttpResponse response = executeRequest(httpPost, HttpStatus.SC_CREATED); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().singleResult(); assertNotNull(processInstance); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult(); assertNotNull(historicProcessInstance); assertEquals("kermit", historicProcessInstance.getStartUserId()); JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent()); closeResponse(response); assertNotNull(responseNode); assertEquals(processInstance.getId(), responseNode.get("id").textValue()); assertTrue(responseNode.get("businessKey").isNull()); assertEquals("processTask", responseNode.get("activityId").textValue()); assertFalse(responseNode.get("suspended").booleanValue()); assertTrue(responseNode.get("url").asText().endsWith( RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE, processInstance.getId()))); assertTrue(responseNode.get("processDefinitionUrl").asText().endsWith( RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_DEFINITION, processInstance.getProcessDefinitionId()))); runtimeService.deleteProcessInstance(processInstance.getId(), "testing"); // Start using process definition id requestNode = objectMapper.createObjectNode(); requestNode.put("processDefinitionId", repositoryService.createProcessDefinitionQuery() .processDefinitionKey("processOne").singleResult().getId()); httpPost.setEntity(new StringEntity(requestNode.toString())); response = executeRequest(httpPost, HttpStatus.SC_CREATED); processInstance = runtimeService.createProcessInstanceQuery().singleResult(); assertNotNull(processInstance); responseNode = objectMapper.readTree(response.getEntity().getContent()); closeResponse(response); assertNotNull(responseNode); assertEquals(processInstance.getId(), responseNode.get("id").textValue()); assertTrue(responseNode.get("businessKey").isNull()); assertEquals("processTask", responseNode.get("activityId").textValue()); assertFalse(responseNode.get("suspended").booleanValue()); assertTrue(responseNode.get("url").asText().endsWith( RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE, processInstance.getId()))); assertTrue(responseNode.get("processDefinitionUrl").asText().endsWith( RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_DEFINITION, processInstance.getProcessDefinitionId()))); runtimeService.deleteProcessInstance(processInstance.getId(), "testing"); // Start using message requestNode = objectMapper.createObjectNode(); requestNode.put("message", "newInvoiceMessage"); httpPost.setEntity(new StringEntity(requestNode.toString())); response = executeRequest(httpPost, HttpStatus.SC_CREATED); processInstance = runtimeService.createProcessInstanceQuery().singleResult(); assertNotNull(processInstance); responseNode = objectMapper.readTree(response.getEntity().getContent()); closeResponse(response); assertNotNull(responseNode); assertEquals(processInstance.getId(), responseNode.get("id").textValue()); assertTrue(responseNode.get("businessKey").isNull()); assertEquals("processTask", responseNode.get("activityId").textValue()); assertFalse(responseNode.get("suspended").booleanValue()); assertTrue(responseNode.get("url").asText().endsWith( RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE, processInstance.getId()))); assertTrue(responseNode.get("processDefinitionUrl").asText().endsWith( RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_DEFINITION, processInstance.getProcessDefinitionId()))); // Start using process definition id and business key requestNode = objectMapper.createObjectNode(); requestNode.put("processDefinitionId", repositoryService.createProcessDefinitionQuery() .processDefinitionKey("processOne").singleResult().getId()); requestNode.put("businessKey", "myBusinessKey"); httpPost.setEntity(new StringEntity(requestNode.toString())); response = executeRequest(httpPost, HttpStatus.SC_CREATED); responseNode = objectMapper.readTree(response.getEntity().getContent()); closeResponse(response); assertNotNull(responseNode); assertEquals("myBusinessKey", responseNode.get("businessKey").textValue()); } /** * Test starting a process instance passing in variables to set. */ @Deployment(resources = {"org/activiti/rest/service/api/runtime/ProcessInstanceResourceTest.process-one.bpmn20.xml"}) public void testStartProcessWithVariables() throws Exception { ArrayNode variablesNode = objectMapper.createArrayNode(); // String variable ObjectNode stringVarNode = variablesNode.addObject(); stringVarNode.put("name", "stringVariable"); stringVarNode.put("value", "simple string value"); stringVarNode.put("type", "string"); ObjectNode integerVarNode = variablesNode.addObject(); integerVarNode.put("name", "integerVariable"); integerVarNode.put("value", 1234); integerVarNode.put("type", "integer"); ObjectNode shortVarNode = variablesNode.addObject(); shortVarNode.put("name", "shortVariable"); shortVarNode.put("value", 123); shortVarNode.put("type", "short"); ObjectNode longVarNode = variablesNode.addObject(); longVarNode.put("name", "longVariable"); longVarNode.put("value", 4567890L); longVarNode.put("type", "long"); ObjectNode doubleVarNode = variablesNode.addObject(); doubleVarNode.put("name", "doubleVariable"); doubleVarNode.put("value", 123.456); doubleVarNode.put("type", "double"); ObjectNode booleanVarNode = variablesNode.addObject(); booleanVarNode.put("name", "booleanVariable"); booleanVarNode.put("value", Boolean.TRUE); booleanVarNode.put("type", "boolean"); // Date Calendar varCal = Calendar.getInstance(); String isoString = getISODateString(varCal.getTime()); ObjectNode dateVarNode = variablesNode.addObject(); dateVarNode.put("name", "dateVariable"); dateVarNode.put("value", isoString); dateVarNode.put("type", "date"); ObjectNode requestNode = objectMapper.createObjectNode(); // Start using process definition key, passing in variables requestNode.put("processDefinitionKey", "processOne"); requestNode.put("variables", variablesNode); HttpPost httpPost = new HttpPost(SERVER_URL_PREFIX + RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION)); httpPost.setEntity(new StringEntity(requestNode.toString())); CloseableHttpResponse response = executeRequest(httpPost, HttpStatus.SC_CREATED); JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent()); closeResponse(response); assertEquals("processTask", responseNode.get("activityId").asText()); assertEquals(false, responseNode.get("ended").asBoolean()); JsonNode variablesArrayNode = responseNode.get("variables"); assertEquals(0, variablesArrayNode.size()); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().singleResult(); assertNotNull(processInstance); // Check if engine has correct variables set Map<String, Object> processVariables = runtimeService.getVariables(processInstance.getId()); assertEquals(7, processVariables.size()); assertEquals("simple string value", processVariables.get("stringVariable")); assertEquals(1234, processVariables.get("integerVariable")); assertEquals((short)123, processVariables.get("shortVariable")); assertEquals(4567890L, processVariables.get("longVariable")); assertEquals(123.456, processVariables.get("doubleVariable")); assertEquals(Boolean.TRUE, processVariables.get("booleanVariable")); assertEquals(dateFormat.parse(isoString), processVariables.get("dateVariable")); } /** * Test starting a process instance passing in variables to set. */ @Deployment(resources = {"org/activiti/rest/service/api/runtime/ProcessInstanceResourceTest.process-one.bpmn20.xml"}) public void testStartProcessWithVariablesAndReturnVariables() throws Exception { ArrayNode variablesNode = objectMapper.createArrayNode(); // String variable ObjectNode stringVarNode = variablesNode.addObject(); stringVarNode.put("name", "stringVariable"); stringVarNode.put("value", "simple string value"); stringVarNode.put("type", "string"); ObjectNode integerVarNode = variablesNode.addObject(); integerVarNode.put("name", "integerVariable"); integerVarNode.put("value", 1234); integerVarNode.put("type", "integer"); ObjectNode requestNode = objectMapper.createObjectNode(); // Start using process definition key, passing in variables requestNode.put("processDefinitionKey", "processOne"); requestNode.put("returnVariables", true); requestNode.put("variables", variablesNode); HttpPost httpPost = new HttpPost(SERVER_URL_PREFIX + RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION)); httpPost.setEntity(new StringEntity(requestNode.toString())); CloseableHttpResponse response = executeRequest(httpPost, HttpStatus.SC_CREATED); JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent()); closeResponse(response); assertEquals("processTask", responseNode.get("activityId").asText()); assertEquals(false, responseNode.get("ended").asBoolean()); JsonNode variablesArrayNode = responseNode.get("variables"); assertEquals(2, variablesArrayNode.size()); for (JsonNode variableNode : variablesArrayNode) { if ("stringVariable".equals(variableNode.get("name").asText())) { assertEquals("simple string value", variableNode.get("value").asText()); assertEquals("string", variableNode.get("type").asText()); } else if ("integerVariable".equals(variableNode.get("name").asText())) { assertEquals(1234, variableNode.get("value").asInt()); assertEquals("integer", variableNode.get("type").asText()); } else { fail("Unexpected variable " + variableNode.get("name").asText()); } } ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().singleResult(); assertNotNull(processInstance); // Check if engine has correct variables set Map<String, Object> processVariables = runtimeService.getVariables(processInstance.getId()); assertEquals(2, processVariables.size()); assertEquals("simple string value", processVariables.get("stringVariable")); assertEquals(1234, processVariables.get("integerVariable")); } @Deployment(resources = {"org/activiti/rest/service/api/oneTaskProcess.bpmn20.xml"}) public void testStartProcessUsingKeyAndTenantId() throws Exception { org.activiti.engine.repository.Deployment tenantDeployment = null; try { // Deploy the same process, in another tenant tenantDeployment = repositoryService.createDeployment() .addClasspathResource("org/activiti/rest/service/api/oneTaskProcess.bpmn20.xml") .tenantId("tenant1") .deploy(); ObjectNode requestNode = objectMapper.createObjectNode(); // Start using process definition key, in tenant 1 requestNode.put("processDefinitionKey", "oneTaskProcess"); requestNode.put("tenantId", "tenant1"); HttpPost httpPost = new HttpPost(SERVER_URL_PREFIX + RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION)); httpPost.setEntity(new StringEntity(requestNode.toString())); CloseableHttpResponse response = executeRequest(httpPost, HttpStatus.SC_CREATED); closeResponse(response); // Only one process should have been started ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().singleResult(); assertNotNull(processInstance); assertEquals("tenant1", processInstance.getTenantId()); // Start using an unexisting tenant requestNode.put("processDefinitionKey", "oneTaskProcess"); requestNode.put("tenantId", "tenantThatDoesntExist"); httpPost.setEntity(new StringEntity(requestNode.toString())); response = executeRequest(httpPost, HttpStatus.SC_BAD_REQUEST); closeResponse(response); } finally { // Cleanup deployment in tenant if(tenantDeployment != null) { repositoryService.deleteDeployment(tenantDeployment.getId(), true); } } } /** * Test starting a process instance, covering all edge-cases. */ public void testStartProcessExceptions() throws Exception { ObjectNode requestNode = objectMapper.createObjectNode(); // Try starting without id and key HttpPost httpPost = new HttpPost(SERVER_URL_PREFIX + RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION)); httpPost.setEntity(new StringEntity(requestNode.toString())); closeResponse(executeRequest(httpPost, HttpStatus.SC_BAD_REQUEST)); // Try starting with both id and key requestNode = objectMapper.createObjectNode(); requestNode.put("processDefinitionId", "123"); requestNode.put("processDefinitionKey", "456"); httpPost.setEntity(new StringEntity(requestNode.toString())); closeResponse(executeRequest(httpPost, HttpStatus.SC_BAD_REQUEST)); // Try starting with both message and key requestNode = objectMapper.createObjectNode(); requestNode.put("processDefinitionId", "123"); requestNode.put("message", "456"); httpPost.setEntity(new StringEntity(requestNode.toString())); closeResponse(executeRequest(httpPost, HttpStatus.SC_BAD_REQUEST)); // Try starting with unexisting process definition key requestNode = objectMapper.createObjectNode(); requestNode.put("processDefinitionKey", "123"); httpPost.setEntity(new StringEntity(requestNode.toString())); closeResponse(executeRequest(httpPost, HttpStatus.SC_BAD_REQUEST)); // Try starting with unexisting process definition id requestNode = objectMapper.createObjectNode(); requestNode.put("processDefinitionId", "123"); httpPost.setEntity(new StringEntity(requestNode.toString())); closeResponse(executeRequest(httpPost, HttpStatus.SC_BAD_REQUEST)); // Try starting with unexisting message requestNode = objectMapper.createObjectNode(); requestNode.put("message", "unexistingmessage"); httpPost.setEntity(new StringEntity(requestNode.toString())); closeResponse(executeRequest(httpPost, HttpStatus.SC_BAD_REQUEST)); } /** * Explicitly testing the statelessness of the Rest API. */ @Deployment(resources = {"org/activiti/rest/service/api/runtime/ProcessInstanceResourceTest.process-one.bpmn20.xml"}) public void testStartProcessWithSameHttpClient() throws Exception { ObjectNode requestNode = objectMapper.createObjectNode(); // Start using process definition key requestNode.put("processDefinitionKey", "processOne"); HttpPost httpPost = new HttpPost(SERVER_URL_PREFIX + RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_COLLECTION)); httpPost.setEntity(new StringEntity(requestNode.toString())); // First call closeResponse(executeRequest(httpPost, HttpStatus.SC_CREATED)); // Second call closeResponse(executeRequest(httpPost, HttpStatus.SC_CREATED)); List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().list(); assertEquals(2, processInstances.size()); for (ProcessInstance processInstance : processInstances) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult(); assertNotNull(historicProcessInstance); assertEquals("kermit", historicProcessInstance.getStartUserId()); } } }