/*
* Copyright 2017 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.kie.workbench.common.stunner.core.rule;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.stunner.core.registry.RegistryFactory;
import org.kie.workbench.common.stunner.core.registry.rule.RuleHandlerRegistry;
import org.kie.workbench.common.stunner.core.rule.context.ContainmentContext;
import org.kie.workbench.common.stunner.core.rule.context.impl.RuleContextBuilder;
import org.kie.workbench.common.stunner.core.rule.ext.RuleExtension;
import org.kie.workbench.common.stunner.core.rule.ext.RuleExtensionHandler;
import org.kie.workbench.common.stunner.core.rule.impl.CanContain;
import org.kie.workbench.common.stunner.core.rule.violations.ContextOperationNotAllowedViolation;
import org.kie.workbench.common.stunner.core.rule.violations.DefaultRuleViolations;
import org.kie.workbench.common.stunner.core.rule.violations.RuleViolationImpl;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class RuleManagerImplTest {
private final List<RuleEvaluationHandler> handlers = new LinkedList<>();
@Mock
RegistryFactory registryFactory;
@Mock
RuleHandlerRegistry registry;
@Mock
RuleEvaluationHandler handler1;
@Mock
RuleEvaluationHandler handler2;
@Mock
RuleExtensionHandler extensionHandler;
private RuleManagerImpl tested;
private RuleSet ruleSet;
private Rule rule1;
private Rule rule2;
private RuleViolation ruleViolation1;
private RuleViolation ruleViolation2;
private RuleViolation ruleViolation3;
private RuleViolations ruleViolations1;
private RuleViolations ruleViolations2;
private RuleViolations ruleViolations3;
private RuleEvaluationContext ruleEvaluationContext;
private RuleExtension ruleExtension;
@Before
public void setup() throws Exception {
rule1 = new CanContain("r1",
"r1-cId",
new HashSet<String>(2) {{
add("role1");
add("role2");
}});
rule2 = new CanContain("r2",
"r2-cId",
new HashSet<String>(2) {{
add("role1");
add("role2");
}});
ruleEvaluationContext = RuleContextBuilder.DomainContexts.containment(Collections.singleton("r1-cId"),
new HashSet<String>(1) {{
add("r2-cId");
}});
ruleViolation1 = new RuleViolationImpl("error - v1");
ruleViolation2 = new RuleViolationImpl("error - v2");
ruleViolation3 = new RuleViolationImpl("error - v3");
ruleViolations1 = new DefaultRuleViolations().addViolation(ruleViolation1);
ruleViolations2 = new DefaultRuleViolations().addViolation(ruleViolation2);
ruleViolations3 = new DefaultRuleViolations().addViolation(ruleViolation3);
ruleExtension = new RuleExtension("re1",
"cId").setHandlerType(RuleExtensionHandler.class);
ruleSet = new RuleSetImpl("rs1",
new ArrayList<Rule>(2) {{
add(rule1);
add(rule2);
add(ruleExtension);
}});
handlers.add(handler1);
handlers.add(handler2);
when(registryFactory.newRuleHandlerRegistry()).thenReturn(registry);
when(registry.getHandlersByContext(any(Class.class))).thenReturn(handlers);
when(registry.getExtensionHandler(eq(RuleExtensionHandler.class))).thenReturn(extensionHandler);
when(handler1.getRuleType()).thenReturn(CanContain.class);
when(handler1.getContextType()).thenReturn(ContainmentContext.class);
when(handler2.getRuleType()).thenReturn(CanContain.class);
when(handler2.getContextType()).thenReturn(ContainmentContext.class);
when(extensionHandler.getRuleType()).thenReturn(RuleExtension.class);
when(extensionHandler.getContextType()).thenReturn(ContainmentContext.class);
tested = new RuleManagerImpl(registryFactory);
}
@Test
@SuppressWarnings("unchecked")
public void testDefaultPolicyAccept() {
when(registry.getExtensionHandler(any(Class.class))).thenReturn(null);
when(handler1.accepts(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(true);
final RuleViolations result = tested.evaluate(ruleSet,
ruleEvaluationContext);
assertNotNull(result);
final Collection<RuleViolation> violations = (Collection<RuleViolation>) result.violations();
assertTrue(violations.isEmpty());
}
@Test
@SuppressWarnings("unchecked")
public void testDefaultPolicyDeny() {
when(registry.getExtensionHandler(any(Class.class))).thenReturn(null);
when(handler1.accepts(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(false);
final RuleViolations result = tested.evaluate(ruleSet,
ruleEvaluationContext);
assertNotNull(result);
final Collection<RuleViolation> violations = (Collection<RuleViolation>) result.violations();
assertEquals(1,
violations.size());
assertEquals(ContextOperationNotAllowedViolation.class,
violations.stream().findFirst().get().getClass());
}
@Test
@SuppressWarnings("unchecked")
public void testEvaluateAllNoExtensions() {
when(registry.getExtensionHandler(any(Class.class))).thenReturn(null);
when(handler1.accepts(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(true);
when(handler2.accepts(eq(rule2),
eq(ruleEvaluationContext))).thenReturn(true);
when(handler1.evaluate(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(ruleViolations1);
when(handler2.evaluate(eq(rule2),
eq(ruleEvaluationContext))).thenReturn(ruleViolations2);
final RuleViolations result = tested.evaluate(ruleSet,
ruleEvaluationContext);
assertNotNull(result);
final Collection<RuleViolation> violations = (Collection<RuleViolation>) result.violations();
assertTrue(violations.size() == 2);
assertTrue(violations.contains(ruleViolation1));
assertTrue(violations.contains(ruleViolation2));
}
@Test
@SuppressWarnings("unchecked")
public void testEvaluateOnlyOne() {
when(registry.getExtensionHandler(any(Class.class))).thenReturn(null);
when(handler1.accepts(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(true);
when(handler2.accepts(eq(rule2),
eq(ruleEvaluationContext))).thenReturn(false);
when(handler1.evaluate(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(ruleViolations1);
when(handler2.evaluate(eq(rule2),
eq(ruleEvaluationContext))).thenReturn(ruleViolations2);
final RuleViolations result = tested.evaluate(ruleSet,
ruleEvaluationContext);
assertNotNull(result);
final Collection<RuleViolation> violations = (Collection<RuleViolation>) result.violations();
assertTrue(violations.size() == 1);
assertTrue(violations.contains(ruleViolation1));
}
@Test
@SuppressWarnings("unchecked")
public void testEvaluateOnlyTwo() {
when(registry.getExtensionHandler(any(Class.class))).thenReturn(null);
when(handler1.accepts(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(false);
when(handler2.accepts(eq(rule2),
eq(ruleEvaluationContext))).thenReturn(true);
when(handler1.evaluate(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(ruleViolations1);
when(handler2.evaluate(eq(rule2),
eq(ruleEvaluationContext))).thenReturn(ruleViolations2);
final RuleViolations result = tested.evaluate(ruleSet,
ruleEvaluationContext);
assertNotNull(result);
final Collection<RuleViolation> violations = (Collection<RuleViolation>) result.violations();
assertTrue(violations.size() == 1);
assertTrue(violations.contains(ruleViolation2));
}
@Test
@SuppressWarnings("unchecked")
public void testEvaluateExtensionAndOne() {
when(handler1.accepts(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(true);
when(handler2.accepts(eq(rule2),
eq(ruleEvaluationContext))).thenReturn(false);
when(extensionHandler.accepts(eq(ruleExtension),
eq(ruleEvaluationContext))).thenReturn(true);
when(handler1.evaluate(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(ruleViolations1);
when(handler2.evaluate(eq(rule2),
eq(ruleEvaluationContext))).thenReturn(ruleViolations2);
when(extensionHandler.evaluate(eq(ruleExtension),
eq(ruleEvaluationContext))).thenReturn(ruleViolations3);
final RuleViolations result = tested.evaluate(ruleSet,
ruleEvaluationContext);
assertNotNull(result);
final Collection<RuleViolation> violations = (Collection<RuleViolation>) result.violations();
assertTrue(violations.size() == 2);
assertTrue(violations.contains(ruleViolation1));
assertTrue(violations.contains(ruleViolation3));
}
@Test
@SuppressWarnings("unchecked")
public void testEvaluateExtensionAndTwo() {
when(handler1.accepts(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(false);
when(handler2.accepts(eq(rule2),
eq(ruleEvaluationContext))).thenReturn(true);
when(extensionHandler.accepts(eq(ruleExtension),
eq(ruleEvaluationContext))).thenReturn(true);
when(handler1.evaluate(eq(rule1),
eq(ruleEvaluationContext))).thenReturn(ruleViolations1);
when(handler2.evaluate(eq(rule2),
eq(ruleEvaluationContext))).thenReturn(ruleViolations2);
when(extensionHandler.evaluate(eq(ruleExtension),
eq(ruleEvaluationContext))).thenReturn(ruleViolations3);
final RuleViolations result = tested.evaluate(ruleSet,
ruleEvaluationContext);
assertNotNull(result);
final Collection<RuleViolation> violations = (Collection<RuleViolation>) result.violations();
assertTrue(violations.size() == 2);
assertTrue(violations.contains(ruleViolation2));
assertTrue(violations.contains(ruleViolation3));
}
}