Beispiel #1
0
        public void GetMatchingRules_StringStartsWithMatch_RuleReturned()
        {
            // Arrange
            var engine = new RulesService <TestModel>(new RulesCompiler(), new LazyCache.Mocks.MockCachingService());

            // Act
            var matching = engine.GetMatchingRules(
                new TestModel {
                TextField = "SomePrefixBlahBlah"
            },
                new[] {
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.And,
                            Rules         = new[] {
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.StringStartsWith, ComparisonValue = "someprefix", ComparisonPredicate = nameof(TestModel.TextField)
                                }
                            }
                        }
                    }
                }
            });

            // Assert
            Assert.Single(matching.Data);
        }
Beispiel #2
0
        public void GetMatchingRules_EnumValueMatch_RuleReturned()
        {
            // Arrange
            var engine = new RulesService <TestModel>(new RulesCompiler(), new LazyCache.Mocks.MockCachingService());

            // Act
            var matching = engine.GetMatchingRules(
                new TestModel {
                SomeEnumValue = TestModel.SomeEnum.Yes
            },
                new[] {
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.Or,
                            Rules         = new[] {
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.Equal, ComparisonValue = TestModel.SomeEnum.Yes.ToString(), ComparisonPredicate = $"{nameof(TestModel.SomeEnumValue)}"
                                }
                            }
                        }
                    }
                }
            });

            // Assert
            Assert.Single(matching.Data);
        }
Beispiel #3
0
        public void GetMatchingRulesPrimitiveCollectionNoMatch_RuleNotReturned()
        {
            // Arrange
            var engine = new RulesService <TestModel>(new RulesCompiler(), new LazyCache.Mocks.MockCachingService());

            // Act
            var matching = engine.GetMatchingRules(
                new TestModel {
                PrimitivesCollection = new List <int> {
                    1, 2, 4, 5
                }
            },
                new[] {
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.Or,
                            Rules         = new[] {
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.CollectionContainsAll, ComparisonValue = "1|2|10", ComparisonPredicate = $"{nameof(TestModel.PrimitivesCollection)}"
                                }
                            }
                        }
                    }
                }
            });

            // Assert
            Assert.Empty(matching.Data);
        }
Beispiel #4
0
        public void GetMatchingRules_PrimitiveNotInCollectionMatch_RuleReturned()
        {
            // Arrange
            var engine = new RulesService <TestModel>(new RulesCompiler(), new LazyCache.Mocks.MockCachingService());

            // Act
            var matching = engine.GetMatchingRules(
                new TestModel {
                NumericField = 10
            },
                new[] {
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.Or,
                            Rules         = new[] {
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.In, ComparisonValue = "1|2|3|4|5", ComparisonPredicate = $"{nameof(TestModel.NumericField)}"
                                }
                            }
                        }
                    }
                }
            });

            // Assert
            Assert.Empty(matching.Data);
        }
Beispiel #5
0
        public void GetMatchingRules_KeyValueCollectionNotMatch_RuleReturned()
        {
            // Arrange
            var engine = new RulesService <TestModel>(new RulesCompiler(), new LazyCache.Mocks.MockCachingService());

            // Act
            var matching = engine.GetMatchingRules(
                new TestModel {
                KeyValueCollection = new Dictionary <string, object> {
                    { "DateOfBirth", DateTime.Now }
                }
            },
                new[] {
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.Or,
                            Rules         = new[] {
                                // PredicateType is needed here to be able to determine value type which is string
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.LessThan, ComparisonValue = DateTime.Now.AddSeconds(-2).ToString("U"), ComparisonPredicate = $"{nameof(TestModel.KeyValueCollection)}[DateOfBirth]", PredicateType = TypeCode.DateTime
                                }
                            }
                        }
                    }
                }
            });

            // Assert
            Assert.Empty(matching.Data);
        }
Beispiel #6
0
        public void GetMatchingRules_CaluculatedCollectionNotContainsAnyOfNotMatch_RuleNotReturned()
        {
            // Arrange
            var engine = new RulesService <TestModel>(new RulesCompiler(), new LazyCache.Mocks.MockCachingService());

            // Act
            var matching = engine.GetMatchingRules(
                new TestModel {
                CompositeCollection = new List <TestModel.CompositeInnerClass> {
                    new TestModel.CompositeInnerClass {
                        NumericField = 10
                    }
                }
            },
                new[] {
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.Or,
                            Rules         = new[] {
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.CollectionNotContainsAnyOf, ComparisonValue = "10|11|12", ComparisonPredicate = $"{nameof(TestModel.CaluculatedCollection)}"
                                }
                            }
                        }
                    }
                }
            });

            // Assert
            Assert.Empty(matching.Data);
        }
Beispiel #7
0
        public void GetMatchingRules_CompositePropertyMatch_RuleReturned()
        {
            // Arrange
            var engine = new RulesService <TestModel>(new RulesCompiler(), new LazyCache.Mocks.MockCachingService());

            // Act
            var matching = engine.GetMatchingRules(
                new TestModel {
                Composit = new TestModel.CompositeInnerClass {
                    NumericField = 10
                }
            },
                new[] {
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.Or,
                            Rules         = new[] {
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.GreaterThanOrEqual, ComparisonValue = 4.ToString(), ComparisonPredicate = $"{nameof(TestModel.Composit)}.{nameof(TestModel.Composit.NumericField)}"
                                }
                            }
                        }
                    }
                }
            });

            // Assert
            Assert.Single(matching.Data);
        }
Beispiel #8
0
        public void GetMatchingRules_MultiRuleOrMatch_RuleReturned()
        {
            // Arrange
            var engine = new RulesService <TestModel>(new RulesCompiler(), new LazyCache.Mocks.MockCachingService());

            // Act
            var matching = engine.GetMatchingRules(
                new TestModel {
                TextField = "SomePrefixBlahBlah", NumericField = 10
            },
                new[] {
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.Or,
                            Rules         = new[] {
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.StringStartsWith, ComparisonValue = "NOT MATCHING PREFIX", ComparisonPredicate = nameof(TestModel.TextField)
                                },
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.GreaterThan, ComparisonValue = 4.ToString(), ComparisonPredicate = nameof(TestModel.NumericField)
                                }
                            }
                        }
                    }
                }
            });

            // Assert
            Assert.Single(matching.Data);
        }
Beispiel #9
0
        public void GetMatchingRules_MultiRulesAllMatch_AllRulesReturned()
        {
            // Arrange
            var engine = new RulesService <TestModel>(new RulesCompiler(), new LazyCache.Mocks.MockCachingService());

            // Act
            var matching = engine.GetMatchingRules(
                new TestModel {
                NumericField = 10, TextField = "test1"
            },
                new[] {
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.Or,
                            Rules         = new[] {
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.NotIn, ComparisonValue = "1|2|3|4|5", ComparisonPredicate = $"{nameof(TestModel.NumericField)}"
                                }
                            }
                        }
                    }
                },
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.Or,
                            Rules         = new[] {
                                new Rule {
                                    ComparisonOperator = Rule.ComparisonOperatorType.StringEndsWith, ComparisonValue = "1", ComparisonPredicate = $"{nameof(TestModel.TextField)}"
                                }
                            }
                        }
                    }
                }
            });

            // Assert
            Assert.Equal(2, matching.Data.Count());
        }
Beispiel #10
0
        public void GetMatchingRules_NumericValueMatch_ShouldMatchByOperatorAndValue(int ruleVal, Rule.ComparisonOperatorType op, int objectVal, bool shouldMatch)
        {
            // Arrange
            var engine = new RulesService <TestModel>(new RulesCompiler(), new LazyCache.Mocks.MockCachingService());

            // Act
            var numericValueTest = objectVal;
            var matching         = engine.GetMatchingRules(
                new TestModel {
                NumericField = numericValueTest
            },
                new[] {
                new RulesConfig {
                    Id            = Guid.NewGuid(),
                    RulesOperator = Rule.InterRuleOperatorType.And,
                    RulesGroups   = new RulesGroup[] {
                        new RulesGroup {
                            RulesOperator = Rule.InterRuleOperatorType.And,
                            Rules         = new[] {
                                new Rule {
                                    ComparisonOperator = op, ComparisonValue = ruleVal.ToString(), ComparisonPredicate = nameof(TestModel.NumericField)
                                }
                            }
                        }
                    }
                }
            });

            // Assert
            if (shouldMatch)
            {
                Assert.Single(matching.Data);
            }
            else
            {
                Assert.Empty(matching.Data);
            }
        }