@Override public RuleViolations evaluate(final Occurrences rule, final CardinalityContext context) { final DefaultRuleViolations results = new DefaultRuleViolations(); final int minOccurrences = rule.getMinOccurrences(); final int maxOccurrences = rule.getMaxOccurrences(); final int candidatesCount = context.getCandidateCount(); final Optional<CardinalityContext.Operation> operation = context.getOperation(); final Violation.Type type = operation .filter(CardinalityContext.Operation.ADD::equals) .isPresent() ? Violation.Type.ERROR : Violation.Type.WARNING; final int count = !operation.isPresent() ? candidatesCount : (operation.get().equals(CardinalityContext.Operation.ADD) ? candidatesCount + 1 : candidatesCount - 1); if (count < minOccurrences) { results.addViolation(new CardinalityMinRuleViolation(context.getRoles().toString(), minOccurrences, candidatesCount, type)); } else if (maxOccurrences > -1 && count > maxOccurrences) { results.addViolation(new CardinalityMaxRuleViolation(context.getRoles().toString(), maxOccurrences, candidatesCount, type)); } return results; } }
@Test public void testMaxOneSuccess() { when(context.getCandidateCount()).thenReturn(0); when(context.getOperation()).thenReturn(Optional.of(CardinalityContext.Operation.ADD)); RuleViolations violations = tested.evaluate(RULE_MAX_1, context); assertNotNull(violations); assertFalse(violations.violations(RuleViolation.Type.ERROR).iterator().hasNext()); }
@Override public boolean accepts(final Occurrences rule, final CardinalityContext context) { return context.getRoles().contains(rule.getRole()); }
@Test public void testMinOneFailed1() { when(context.getCandidateCount()).thenReturn(1); when(context.getOperation()).thenReturn(Optional.of(CardinalityContext.Operation.DELETE)); RuleViolations violations = tested.evaluate(RULE_MIN_1, context); assertNotNull(violations); assertTrue(violations.violations(RuleViolation.Type.WARNING).iterator().hasNext()); }
@Before public void setup() throws Exception { when(context.getRoles()).thenReturn(ROLES); tested = new CardinalityEvaluationHandler(); }
@Test public void testMinOneSuccess() { when(context.getCandidateCount()).thenReturn(0); when(context.getOperation()).thenReturn(Optional.of(CardinalityContext.Operation.ADD)); RuleViolations violations = tested.evaluate(RULE_MIN_1, context); assertNotNull(violations); assertFalse(violations.violations(RuleViolation.Type.ERROR).iterator().hasNext()); }
@Test public void testAccepts() { Set<String> roles = Collections.singleton(ROLE); when(context.getRoles()).thenReturn(roles); assertTrue(tested.accepts(RULE_NO_LIMIT, context)); roles = Collections.singleton("anotherTheRole"); when(context.getRoles()).thenReturn(roles); assertFalse(tested.accepts(RULE_NO_LIMIT, context)); }
@Test public void testMaxOneFailed1() { when(context.getCandidateCount()).thenReturn(1); when(context.getOperation()).thenReturn(Optional.of(CardinalityContext.Operation.ADD)); RuleViolations violations = tested.evaluate(RULE_MAX_1, context); assertNotNull(violations); assertTrue(violations.violations(RuleViolation.Type.ERROR).iterator().hasNext()); } }
@Test public void testEvaluateNoLimit() { when(context.getCandidateCount()).thenReturn(0); when(context.getOperation()).thenReturn(Optional.of(CardinalityContext.Operation.ADD)); RuleViolations violations = tested.evaluate(RULE_NO_LIMIT, context); assertNotNull(violations); assertFalse(violations.violations(RuleViolation.Type.ERROR).iterator().hasNext()); when(context.getCandidateCount()).thenReturn(100); when(context.getOperation()).thenReturn(Optional.of(CardinalityContext.Operation.ADD)); violations = tested.evaluate(RULE_NO_LIMIT, context); assertNotNull(violations); assertFalse(violations.violations(RuleViolation.Type.ERROR).iterator().hasNext()); }
@Test @SuppressWarnings("unchecked") public void testLookupAllowedDefinitionsByLabels() { when(cache.getDefinitions(eq("label1"))).thenReturn(Collections.singleton(TestingGraphInstanceBuilder.DEF1_ID)); when(definitionsCache.getLabels(eq(TestingGraphInstanceBuilder.DEF1_ID))) .thenReturn(TestingGraphInstanceBuilder.DEF1_LABELS); LookupAllowedDefinitionsByLabels function = new LookupAllowedDefinitionsByLabels(graph1Instance.graph, new HashSet<String>(1) {{ add("label1"); }}, id -> true); Set<String> result = function.execute(context); assertTrue(result.contains(TestingGraphInstanceBuilder.DEF1_ID)); ArgumentCaptor<RuleEvaluationContext> ruleEvaluationContextCaptor = ArgumentCaptor.forClass(RuleEvaluationContext.class); verify(ruleManager, times(1)).evaluate(eq(RULE_SET), ruleEvaluationContextCaptor.capture()); RuleEvaluationContext evaluationContext = ruleEvaluationContextCaptor.getValue(); assertTrue(evaluationContext instanceof CardinalityContext); CardinalityContext cardinalityContext = (CardinalityContext) evaluationContext; assertEquals(1, cardinalityContext.getCandidateCount()); assertEquals(CardinalityContext.Operation.ADD, cardinalityContext.getOperation().get()); }