/**
* Copyright 2005 Red Hat, Inc. and/or its affiliates.
*
* 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.jbpm.ruleflow.core.validation;
import org.jbpm.process.core.validation.ProcessValidationError;
import org.jbpm.ruleflow.core.RuleFlowProcess;
import org.jbpm.workflow.core.Node;
import org.jbpm.workflow.core.node.DynamicNode;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class RuleFlowProcessValidatorTest {
private RuleFlowProcessValidator validator;
private List<ProcessValidationError> errors;
@Mock
private RuleFlowProcess process;
@Mock
private Node node;
@Before
public void setUp() throws Exception {
errors = new ArrayList<ProcessValidationError>();
validator = RuleFlowProcessValidator.getInstance();
}
@Test
public void testAddErrorMessage() throws Exception {
when(node.getName()).thenReturn("nodeName");
when(node.getId()).thenReturn(Long.MAX_VALUE);
validator.addErrorMessage(process, node, errors, "any message");
assertEquals(1, errors.size());
assertEquals("Node 'nodeName' [" + Long.MAX_VALUE + "] any message", errors.get(0).getMessage());
}
@Test
public void testDynamicNodeValidationInNotDynamicProcess() throws Exception {
RuleFlowProcess process = new RuleFlowProcess();
process.setId("org.drools.core.process");
process.setName("Dynamic Node Process");
process.setPackageName("org.mycomp.myprocess");
process.setDynamic(false);
DynamicNode dynamicNode = new DynamicNode();
dynamicNode.setName("MyDynamicNode");
dynamicNode.setId(1);
dynamicNode.setAutoComplete(false);
// empty completion expression to trigger validation error
dynamicNode.setCompletionExpression("");
process.addNode(dynamicNode);
ProcessValidationError[] errors = validator.validateProcess(process);
assertNotNull(errors);
// in non-dynamic processes all check should be triggered
// they should also include process level checks (start node, end node etc)
assertEquals(6, errors.length);
assertEquals("Process has no start node.", errors[0].getMessage());
assertEquals("Process has no end node.", errors[1].getMessage());
assertEquals("Node 'MyDynamicNode' [1] Dynamic has no incoming connection", errors[2].getMessage());
assertEquals("Node 'MyDynamicNode' [1] Dynamic has no outgoing connection", errors[3].getMessage());
assertEquals("Node 'MyDynamicNode' [1] Dynamic has no completion condition set", errors[4].getMessage());
assertEquals("Node 'MyDynamicNode' [1] Has no connection to the start node.", errors[5].getMessage());
}
@Test
public void testDynamicNodeValidationInDynamicProcess() throws Exception {
RuleFlowProcess process = new RuleFlowProcess();
process.setId("org.drools.core.process");
process.setName("Dynamic Node Process");
process.setPackageName("org.mycomp.myprocess");
process.setDynamic(true);
DynamicNode dynamicNode = new DynamicNode();
dynamicNode.setName("MyDynamicNode");
dynamicNode.setId(1);
dynamicNode.setAutoComplete(false);
dynamicNode.setCompletionExpression("completion-expression");
process.addNode(dynamicNode);
ProcessValidationError[] errors = validator.validateProcess(process);
assertNotNull(errors);
// if dynamic process no longer triggering incoming / outgoing connection errors for dynamic nodes
assertEquals(0, errors.length);
// empty completion expression to trigger validation error
process.removeNode(dynamicNode);
DynamicNode dynamicNode2 = new DynamicNode();
dynamicNode2.setName("MyDynamicNode");
dynamicNode2.setId(1);
dynamicNode2.setAutoComplete(false);
dynamicNode2.setCompletionExpression("");
process.addNode(dynamicNode2);
ProcessValidationError[] errors2 = validator.validateProcess(process);
assertNotNull(errors2);
// autocomplete set to false and empty completion condition triggers error
assertEquals(1, errors2.length);
assertEquals("Node 'MyDynamicNode' [1] Dynamic has no completion condition set", errors2[0].getMessage());
}
@Test
public void testEmptyPackageName() throws Exception {
RuleFlowProcess process = new RuleFlowProcess();
process.setId("org.drools.core.process");
process.setName("Empty Package Name Process");
process.setPackageName("");
process.setDynamic(true);
ProcessValidationError[] errors = validator.validateProcess(process);
assertNotNull(errors);
assertEquals(0, errors.length);
}
@Test
public void testNoPackageName() throws Exception {
RuleFlowProcess process = new RuleFlowProcess();
process.setId("org.drools.core.process");
process.setName("No Package Name Process");
process.setDynamic(true);
ProcessValidationError[] errors = validator.validateProcess(process);
assertNotNull(errors);
assertEquals(0, errors.length);
}
}