/* 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.engine.test.api.form;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.form.FormProperty;
import org.activiti.engine.form.StartFormData;
import org.activiti.engine.form.TaskFormData;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.impl.util.CollectionUtil;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
/**
* @author Joram Barrez
* @author Frederik Heremans
* @author Tom Baeyens
* @author Falko Menge (camunda)
*/
public class FormServiceTest extends PluggableActivitiTestCase {
@Deployment(resources = { "org/activiti/examples/taskforms/VacationRequest_deprecated_forms.bpmn20.xml",
"org/activiti/examples/taskforms/approve.form",
"org/activiti/examples/taskforms/request.form",
"org/activiti/examples/taskforms/adjustRequest.form" })
public void testGetStartFormByProcessDefinitionId() {
List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery().list();
assertEquals(1, processDefinitions.size());
ProcessDefinition processDefinition = processDefinitions.get(0);
Object startForm = formService.getRenderedStartForm(processDefinition.getId());
assertNotNull(startForm);
}
@Deployment(resources = { "org/activiti/engine/test/api/oneTaskProcess.bpmn20.xml" })
public void testGetStartFormByProcessDefinitionIdWithoutStartform() {
List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery().list();
assertEquals(1, processDefinitions.size());
ProcessDefinition processDefinition = processDefinitions.get(0);
Object startForm = formService.getRenderedStartForm(processDefinition.getId());
assertNull(startForm);
}
public void testGetStartFormByKeyNullKey() {
try {
formService.getRenderedStartForm(null);
fail("ActivitiException expected");
} catch (ActivitiException ae) {
// Exception expected
}
}
public void testGetStartFormByIdNullId() {
try {
formService.getRenderedStartForm(null);
fail("ActivitiException expected");
} catch (ActivitiException ae) {
// Exception expected
}
}
public void testGetStartFormByIdUnexistingProcessDefinitionId() {
try {
formService.getRenderedStartForm("unexistingId");
fail("ActivitiException expected");
} catch (ActivitiException ae) {
assertTextPresent("no deployed process definition found with id", ae.getMessage());
}
}
public void testGetTaskFormNullTaskId() {
try {
formService.getRenderedTaskForm(null);
fail("ActivitiException expected");
} catch (ActivitiException ae) {
// Expected Exception
}
}
public void testGetTaskFormUnexistingTaskId() {
try {
formService.getRenderedTaskForm("unexistingtask");
fail("ActivitiException expected");
} catch (ActivitiException ae) {
assertTextPresent("Task 'unexistingtask' not found", ae.getMessage());
}
}
@Deployment(resources = { "org/activiti/engine/test/api/form/FormsProcess.bpmn20.xml",
"org/activiti/engine/test/api/form/start.form",
"org/activiti/engine/test/api/form/task.form" })
public void testTaskFormPropertyDefaultsAndFormRendering() {
String procDefId = repositoryService.createProcessDefinitionQuery().singleResult().getId();
StartFormData startForm = formService.getStartFormData(procDefId);
assertNotNull(startForm);
assertEquals(deploymentId, startForm.getDeploymentId());
assertEquals("org/activiti/engine/test/api/form/start.form", startForm.getFormKey());
assertEquals(new ArrayList<FormProperty>(), startForm.getFormProperties());
assertEquals(procDefId, startForm.getProcessDefinition().getId());
Object renderedStartForm = formService.getRenderedStartForm(procDefId);
assertEquals("start form content", renderedStartForm);
Map<String, String> properties = new HashMap<String, String>();
properties.put("room", "5b");
properties.put("speaker", "Mike");
String processInstanceId = formService.submitStartFormData(procDefId, properties).getId();
Map<String, Object> expectedVariables = new HashMap<String, Object>();
expectedVariables.put("room", "5b");
expectedVariables.put("speaker", "Mike");
Map<String, Object> variables = runtimeService.getVariables(processInstanceId);
assertEquals(expectedVariables, variables);
Task task = taskService.createTaskQuery().singleResult();
String taskId = task.getId();
TaskFormData taskForm = formService.getTaskFormData(taskId);
assertEquals(deploymentId, taskForm.getDeploymentId());
assertEquals("org/activiti/engine/test/api/form/task.form", taskForm.getFormKey());
assertEquals(new ArrayList<FormProperty>(), taskForm.getFormProperties());
assertEquals(taskId, taskForm.getTask().getId());
assertEquals("Mike is speaking in room 5b", formService.getRenderedTaskForm(taskId));
properties = new HashMap<String, String>();
properties.put("room", "3f");
formService.submitTaskFormData(taskId, properties);
expectedVariables = new HashMap<String, Object>();
expectedVariables.put("room", "3f");
expectedVariables.put("speaker", "Mike");
variables = runtimeService.getVariables(processInstanceId);
assertEquals(expectedVariables, variables);
}
@Deployment
public void testFormPropertyHandling() {
Map<String, String> properties = new HashMap<String, String>();
properties.put("room", "5b"); // default
properties.put("speaker", "Mike"); // variable name mapping
properties.put("duration", "45"); // type conversion
properties.put("free", "true"); // type conversion
String procDefId = repositoryService.createProcessDefinitionQuery().singleResult().getId();
String processInstanceId = formService.submitStartFormData(procDefId, properties).getId();
Map<String, Object> expectedVariables = new HashMap<String, Object>();
expectedVariables.put("room", "5b");
expectedVariables.put("SpeakerName", "Mike");
expectedVariables.put("duration", new Long(45));
expectedVariables.put("free", Boolean.TRUE);
Map<String, Object> variables = runtimeService.getVariables(processInstanceId);
assertEquals(expectedVariables, variables);
Address address = new Address();
address.setStreet("broadway");
runtimeService.setVariable(processInstanceId, "address", address);
String taskId = taskService.createTaskQuery().singleResult().getId();
TaskFormData taskFormData = formService.getTaskFormData(taskId);
List<FormProperty> formProperties = taskFormData.getFormProperties();
FormProperty propertyRoom = formProperties.get(0);
assertEquals("room", propertyRoom.getId());
assertEquals("5b", propertyRoom.getValue());
FormProperty propertyDuration = formProperties.get(1);
assertEquals("duration", propertyDuration.getId());
assertEquals("45", propertyDuration.getValue());
FormProperty propertySpeaker = formProperties.get(2);
assertEquals("speaker", propertySpeaker.getId());
assertEquals("Mike", propertySpeaker.getValue());
FormProperty propertyStreet = formProperties.get(3);
assertEquals("street", propertyStreet.getId());
assertEquals("broadway", propertyStreet.getValue());
FormProperty propertyFree = formProperties.get(4);
assertEquals("free", propertyFree.getId());
assertEquals("true", propertyFree.getValue());
assertEquals(5, formProperties.size());
try {
formService.submitTaskFormData(taskId, new HashMap<String, String>());
fail("expected exception about required form property 'street'");
} catch (ActivitiException e) {
// OK
}
try {
properties = new HashMap<String, String>();
properties.put("speaker", "its not allowed to update speaker!");
formService.submitTaskFormData(taskId, properties);
fail("expected exception about a non writable form property 'speaker'");
} catch (ActivitiException e) {
// OK
}
properties = new HashMap<String, String>();
properties.put("street", "rubensstraat");
formService.submitTaskFormData(taskId, properties);
expectedVariables = new HashMap<String, Object>();
expectedVariables.put("room", "5b");
expectedVariables.put("SpeakerName", "Mike");
expectedVariables.put("duration", new Long(45));
expectedVariables.put("free", Boolean.TRUE);
variables = runtimeService.getVariables(processInstanceId);
address = (Address) variables.remove("address");
assertEquals("rubensstraat", address.getStreet());
assertEquals(expectedVariables, variables);
}
@SuppressWarnings("unchecked")
@Deployment
public void testFormPropertyDetails() {
String procDefId = repositoryService.createProcessDefinitionQuery().singleResult().getId();
StartFormData startFormData = formService.getStartFormData(procDefId);
FormProperty property = startFormData.getFormProperties().get(0);
assertEquals("speaker", property.getId());
assertNull(property.getValue());
assertTrue(property.isReadable());
assertTrue(property.isWritable());
assertFalse(property.isRequired());
assertEquals("string", property.getType().getName());
property = startFormData.getFormProperties().get(1);
assertEquals("start", property.getId());
assertNull(property.getValue());
assertTrue(property.isReadable());
assertTrue(property.isWritable());
assertFalse(property.isRequired());
assertEquals("date", property.getType().getName());
assertEquals("dd-MMM-yyyy", property.getType().getInformation("datePattern"));
property = startFormData.getFormProperties().get(2);
assertEquals("direction", property.getId());
assertNull(property.getValue());
assertTrue(property.isReadable());
assertTrue(property.isWritable());
assertFalse(property.isRequired());
assertEquals("enum", property.getType().getName());
Map<String, String> values = (Map<String, String>) property.getType().getInformation("values");
Map<String, String> expectedValues = new LinkedHashMap<String, String>();
expectedValues.put("left", "Go Left");
expectedValues.put("right", "Go Right");
expectedValues.put("up", "Go Up");
expectedValues.put("down", "Go Down");
// ACT-1023: check if ordering is retained
Iterator<Entry<String, String>> expectedValuesIterator = expectedValues.entrySet().iterator();
for(Entry<String, String> entry : values.entrySet()) {
Entry<String, String> expectedEntryAtLocation = expectedValuesIterator.next();
assertEquals(expectedEntryAtLocation.getKey(), entry.getKey());
assertEquals(expectedEntryAtLocation.getValue(), entry.getValue());
}
assertEquals(expectedValues, values);
}
@Deployment
public void testInvalidFormKeyReference() {
try {
formService.getRenderedStartForm(repositoryService.createProcessDefinitionQuery().singleResult().getId());
fail();
} catch (ActivitiException e) {
assertTextPresent("Form with formKey 'IDoNotExist' does not exist", e.getMessage());
}
}
@Deployment
public void testSubmitStartFormDataWithBusinessKey() {
Map<String, String> properties = new HashMap<String, String>();
properties.put("duration", "45");
properties.put("speaker", "Mike");
String procDefId = repositoryService.createProcessDefinitionQuery().singleResult().getId();
ProcessInstance processInstance = formService.submitStartFormData(procDefId, "123", properties);
assertEquals("123", processInstance.getBusinessKey());
assertEquals(processInstance.getId(), runtimeService.createProcessInstanceQuery().processInstanceBusinessKey("123").singleResult().getId());
}
public void testGetStartFormKeyEmptyArgument() {
try {
formService.getStartFormKey(null);
fail("ActivitiException expected");
} catch (ActivitiException ae) {
assertTextPresent("The process definition id is mandatory, but 'null' has been provided.", ae.getMessage());
}
try {
formService.getStartFormKey("");
fail("ActivitiException expected");
} catch (ActivitiException ae) {
assertTextPresent("The process definition id is mandatory, but '' has been provided.", ae.getMessage());
}
}
@Deployment(resources = "org/activiti/engine/test/api/form/FormsProcess.bpmn20.xml")
public void testGetStartFormKey() {
String processDefinitionId = repositoryService.createProcessDefinitionQuery().singleResult().getId();
String expectedFormKey = formService.getStartFormData(processDefinitionId).getFormKey();
String actualFormKey = formService.getStartFormKey(processDefinitionId);
assertEquals(expectedFormKey, actualFormKey);
}
public void testGetTaskFormKeyEmptyArguments() {
try {
formService.getTaskFormKey(null, "23");
fail("ActivitiException expected");
} catch (ActivitiException ae) {
assertTextPresent("The process definition id is mandatory, but 'null' has been provided.", ae.getMessage());
}
try {
formService.getTaskFormKey("", "23");
fail("ActivitiException expected");
} catch (ActivitiException ae) {
assertTextPresent("The process definition id is mandatory, but '' has been provided.", ae.getMessage());
}
try {
formService.getTaskFormKey("42", null);
fail("ActivitiException expected");
} catch (ActivitiException ae) {
assertTextPresent("The task definition key is mandatory, but 'null' has been provided.", ae.getMessage());
}
try {
formService.getTaskFormKey("42", "");
fail("ActivitiException expected");
} catch (ActivitiException ae) {
assertTextPresent("The task definition key is mandatory, but '' has been provided.", ae.getMessage());
}
}
@Deployment(resources = "org/activiti/engine/test/api/form/FormsProcess.bpmn20.xml")
public void testGetTaskFormKey() {
String processDefinitionId = repositoryService.createProcessDefinitionQuery().singleResult().getId();
runtimeService.startProcessInstanceById(processDefinitionId);
Task task = taskService.createTaskQuery().singleResult();
assertNotNull(task);
String expectedFormKey = formService.getTaskFormData(task.getId()).getFormKey();
String actualFormKey = formService.getTaskFormKey(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
assertEquals(expectedFormKey, actualFormKey);
}
@Deployment
public void testGetTaskFormKeyWithExpression() {
runtimeService.startProcessInstanceByKey("FormsProcess", CollectionUtil.singletonMap("dynamicKey", "test"));
Task task = taskService.createTaskQuery().singleResult();
assertNotNull(task);
assertEquals("test", formService.getTaskFormData(task.getId()).getFormKey());
}
}