/* 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.workflow.simple;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Collections;
import org.activiti.workflow.simple.converter.json.SimpleWorkflowJsonConverter;
import org.activiti.workflow.simple.definition.ChoiceStepsDefinition;
import org.activiti.workflow.simple.definition.HumanStepDefinition;
import org.activiti.workflow.simple.definition.ListConditionStepDefinition;
import org.activiti.workflow.simple.definition.ListStepDefinition;
import org.activiti.workflow.simple.definition.ParallelStepsDefinition;
import org.activiti.workflow.simple.definition.StepDefinition;
import org.activiti.workflow.simple.definition.WorkflowDefinition;
import org.activiti.workflow.simple.definition.form.FormDefinition;
import org.activiti.workflow.simple.definition.form.FormPropertyDefinition;
import org.activiti.workflow.simple.definition.form.ListPropertyDefinition;
import org.activiti.workflow.simple.definition.form.ListPropertyEntry;
import org.activiti.workflow.simple.definition.form.NumberPropertyDefinition;
import org.activiti.workflow.simple.definition.form.ReferencePropertyDefinition;
import org.activiti.workflow.simple.definition.form.TextPropertyDefinition;
import org.junit.BeforeClass;
import org.junit.Test;
public class JsonConverterTest {
private static SimpleWorkflowJsonConverter converter;
@BeforeClass
public static void init() {
converter = new SimpleWorkflowJsonConverter();
}
@Test
public void testWorkflowDefinitionConversion() {
// Create definition
WorkflowDefinition workflowDefinition = new WorkflowDefinition().name("testWorkflow")
.description("This is a test workflow").id("the id").key("the key");
// Write result to byte-array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(baos);
converter.writeWorkflowDefinition(workflowDefinition, writer);
// Parse definition based on written JSON
WorkflowDefinition parsedDefinition = converter.readWorkflowDefinition(baos.toByteArray());
// Check if parsed definition matches the original one
assertEquals(workflowDefinition.getName(), parsedDefinition.getName());
assertEquals(workflowDefinition.getKey(), parsedDefinition.getKey());
assertEquals(workflowDefinition.getId(), parsedDefinition.getId());
assertEquals(workflowDefinition.getDescription(), parsedDefinition.getDescription());
}
@Test
public void testHumanStepConversion() {
WorkflowDefinition workflowDefinition = new WorkflowDefinition().name("testWorkflow").addHumanStep("step1", "fred")
.addHumanStepForGroup("step2", Collections.singletonList("group")).addHumanStepForWorkflowInitiator("step3");
// Add form to last step
HumanStepDefinition stepWithForm = new HumanStepDefinition();
stepWithForm.setName("step4");
stepWithForm.setDescription("Step description");
workflowDefinition.getSteps().add(stepWithForm);
FormDefinition formDefinition = new FormDefinition();
stepWithForm.setForm(formDefinition);
formDefinition.setFormKey("123");
TextPropertyDefinition textProp = new TextPropertyDefinition();
textProp.setMandatory(true);
textProp.setName("textProp");
textProp.setWritable(false);
formDefinition.addFormProperty(textProp);
textProp.getParameters().put("custom-parameter", "This is a test");
NumberPropertyDefinition numberProp = new NumberPropertyDefinition();
numberProp.setMandatory(true);
numberProp.setName("numberProp");
numberProp.setWritable(false);
formDefinition.addFormProperty(numberProp);
ReferencePropertyDefinition reference = new ReferencePropertyDefinition();
reference.setMandatory(true);
reference.setName("referenceProp");
reference.setWritable(false);
reference.setType("referencedType");
formDefinition.addFormProperty(reference);
ListPropertyDefinition itemType = new ListPropertyDefinition();
itemType.setMandatory(true);
itemType.setName("referenceProp");
itemType.setWritable(false);
itemType.addEntry(new ListPropertyEntry("1", "Item 1"));
itemType.addEntry(new ListPropertyEntry("2", "Item 2"));
formDefinition.addFormProperty(itemType);
// Write result to byte-array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(baos);
converter.writeWorkflowDefinition(workflowDefinition, writer);
// Parse definition based on written JSON
WorkflowDefinition parsedDefinition = converter.readWorkflowDefinition(baos.toByteArray());
assertEquals(workflowDefinition.getSteps().size(), parsedDefinition.getSteps().size());
int index = 0;
for(StepDefinition stepDefinition : parsedDefinition.getSteps()) {
assertTrue(stepDefinition instanceof HumanStepDefinition);
HumanStepDefinition humanStep = (HumanStepDefinition) stepDefinition;
HumanStepDefinition originalStep = (HumanStepDefinition) workflowDefinition.getSteps().get(index);
// Check general human-step fields
assertEquals(originalStep.getAssignee(), humanStep.getAssignee());
assertEquals(originalStep.getAssignmentType(), humanStep.getAssignmentType());
assertEquals(originalStep.getCandidateGroups(), humanStep.getCandidateGroups());
assertEquals(originalStep.getCandidateUsers(), humanStep.getCandidateUsers());
assertEquals(originalStep.getName(), humanStep.getName());
assertEquals(originalStep.getDescription(), humanStep.getDescription());
if(originalStep.getForm() != null) {
// Encountered step with form attached to it, should be last step
assertEquals(3, index);
assertEquals("123", humanStep.getForm().getFormKey());
assertEquals(originalStep.getForm().getFormPropertyDefinitions().size(),
humanStep.getForm().getFormPropertyDefinitions().size());
// Check form-fields, generic fields
for(int i=0; i<originalStep.getForm().getFormPropertyDefinitions().size(); i++) {
FormPropertyDefinition origDef = originalStep.getForm().getFormPropertyDefinitions().get(i);
FormPropertyDefinition parsedDef = humanStep.getForm().getFormPropertyDefinitions().get(i);
assertEquals(origDef.getName(), parsedDef.getName());
assertEquals(origDef.isMandatory(), parsedDef.isMandatory());
assertEquals(origDef.isWritable(), parsedDef.isWritable());
assertEquals(origDef.getClass(), parsedDef.getClass());
if(parsedDef instanceof TextPropertyDefinition) {
assertTrue(parsedDef.getParameters() != null);
assertEquals(1L, parsedDef.getParameters().size());
assertEquals("This is a test", parsedDef.getParameters().get("custom-parameter"));
}
if(parsedDef instanceof ListPropertyDefinition) {
ListPropertyDefinition parsed = (ListPropertyDefinition) parsedDef;
assertEquals(2L, parsed.getEntries().size());
}
}
}
index++;
}
}
@Test
public void testChoiceConversion() {
// Create definition
WorkflowDefinition workflowDefinition = new WorkflowDefinition()
.name("testWorkflow")
.description("This is a test workflow")
.inChoice()
.inList()
.addCondition("test", "==", "'hello'")
.addCondition("test2", "==", "'world'")
.addHumanStep("first task", "kermit")
.endList()
.inList()
.addHumanStep("gonzo task", "gonzo")
.endList()
.endChoice();
// Write result to byte-array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(baos);
converter.writeWorkflowDefinition(workflowDefinition, writer);
// Parse definition based on written JSON
WorkflowDefinition parsedDefinition = converter.readWorkflowDefinition(baos.toByteArray());
// Check if parsed definition matches the original one
assertEquals(workflowDefinition.getName(), parsedDefinition.getName());
assertEquals(workflowDefinition.getDescription(), parsedDefinition.getDescription());
ChoiceStepsDefinition choiceDef = null;
for (StepDefinition step : parsedDefinition.getSteps()) {
if (step instanceof ChoiceStepsDefinition) {
choiceDef = (ChoiceStepsDefinition) step;
}
}
assertNotNull(choiceDef);
assertEquals(2, choiceDef.getStepList().size());
ListConditionStepDefinition<ChoiceStepsDefinition> listSteps = choiceDef.getStepList().get(0);
assertEquals(2, listSteps.getConditions().size());
assertEquals("test", listSteps.getConditions().get(0).getLeftOperand());
assertEquals("==", listSteps.getConditions().get(0).getOperator());
assertEquals("'hello'", listSteps.getConditions().get(0).getRightOperand());
listSteps = choiceDef.getStepList().get(1);
assertEquals(0, listSteps.getConditions().size());
}
@Test
public void testParallelConversion() {
// Create definition
WorkflowDefinition workflowDefinition = new WorkflowDefinition()
.name("testWorkflow")
.description("This is a test workflow")
.inParallel()
.inList()
.addHumanStep("first task", "kermit")
.addHumanStep("second task", "kermit")
.endList()
.inList()
.addHumanStep("gonzo task", "gonzo")
.endList()
.endParallel();
// Write result to byte-array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(baos);
converter.writeWorkflowDefinition(workflowDefinition, writer);
// Parse definition based on written JSON
WorkflowDefinition parsedDefinition = converter.readWorkflowDefinition(baos.toByteArray());
// Check if parsed definition matches the original one
assertEquals(workflowDefinition.getName(), parsedDefinition.getName());
assertEquals(workflowDefinition.getDescription(), parsedDefinition.getDescription());
ParallelStepsDefinition parallelDef = null;
for (StepDefinition step : parsedDefinition.getSteps()) {
if (step instanceof ParallelStepsDefinition) {
parallelDef = (ParallelStepsDefinition) step;
}
}
assertNotNull(parallelDef);
assertEquals(2, parallelDef.getStepList().size());
ListStepDefinition<ParallelStepsDefinition> listSteps = parallelDef.getStepList().get(0);
assertEquals(2, listSteps.getSteps().size());
listSteps = parallelDef.getStepList().get(1);
assertEquals(1, listSteps.getSteps().size());
}
}