tests.test_rules.test_simple_comparison_rule()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 17
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 12
dl 0
loc 17
rs 9.8
c 0
b 0
f 0
cc 1
nop 2
1
# coding=utf-8
2
import pytest
3
4
from decision_engine.comparisons import Equal, GreaterThanOrEqual
5
from decision_engine.rules import SimpleComparisonRule, BooleanOrRule,\
6
    BooleanAndRule
7
from decision_engine.sources import DictSource, FixedValueSource
8
9
10
@pytest.mark.parametrize('smoker, expected', [
11
    (True, False),
12
    (False, True)
13
])
14
def test_simple_comparison_rule(smoker, expected):
15
    smoker_source = DictSource('smoker')
16
    non_smoker_requirement = FixedValueSource(False)
17
    rule = SimpleComparisonRule(smoker_source, non_smoker_requirement, Equal())
18
19
    data = {
20
        'smoker': smoker
21
    }
22
23
    assert rule.check(data) is expected
24
25
    comparison_name = rule.comparison.__class__.__name__
26
    assert rule.__repr__() == f"Name: '{rule.name}' | " \
27
                              f"source1: '{rule.source1.name}' | " \
28
                              f"source2: '{rule.source2.name}' | " \
29
                              f"comparison: '{comparison_name}'"
30
31
32
@pytest.mark.parametrize('colour, expected', [
33
    ('red', True),
34
    ('blue', True),
35
    ('yellow', True),
36
    ('brown', False),
37
    ('black', False)
38
])
39
def test_boolean_or_rule(colour, expected):
40
    """
41
    The colour source must match at least one of the two required colours.
42
    """
43
    colour_source = DictSource('colour')
44
    colour_requirement1 = FixedValueSource('blue')
45
    colour_requirement2 = FixedValueSource('red')
46
    colour_requirement3 = FixedValueSource('yellow')
47
    rule1 = SimpleComparisonRule(colour_source, colour_requirement1, Equal())
48
    rule2 = SimpleComparisonRule(colour_source, colour_requirement2, Equal())
49
    rule3 = SimpleComparisonRule(colour_source, colour_requirement3, Equal())
50
51
    rule = BooleanOrRule([rule1, rule2, rule3])
52
53
    data = {
54
        'colour': colour
55
    }
56
57
    assert rule.check(data) is expected
58
    assert rule.__repr__() == f"Name: '{rule.name}' | rules: {rule.rules}"
59
60
61
@pytest.mark.parametrize('age, smoker, voted_for_trump, expected', [
62
    (18, False, False, True),
63
    (18, False, True, False),
64
    (18, True, False, False),
65
    (18, True, True, False),
66
    (15, False, False, False),
67
    (15, False, True, False),
68
    (15, True, False, False),
69
    (15, True, True, False)
70
])
71
def test_boolean_and_rule(age, smoker, voted_for_trump, expected):
72
    """
73
    Only people 18+ years old, non-smokers,
74
    and who did not vote for Trump are allowed.
75
    """
76
    age_source = DictSource('age')
77
    age_requirement = FixedValueSource(18)
78
    rule1 = SimpleComparisonRule(age_source, age_requirement,
79
                                 GreaterThanOrEqual())
80
81
    smoker_source = DictSource('smoker')
82
    smoker_requirement = FixedValueSource(False)
83
    rule2 = SimpleComparisonRule(smoker_source, smoker_requirement, Equal())
84
85
    voter_source = DictSource('voted_for_trump')
86
    voter_requirement = FixedValueSource(False)
87
    rule3 = SimpleComparisonRule(voter_source, voter_requirement, Equal())
88
89
    rule = BooleanAndRule([rule1, rule2, rule3])
90
91
    data = {
92
        'age': age,
93
        'smoker': smoker,
94
        'voted_for_trump': voted_for_trump
95
    }
96
97
    assert rule.check(data) is expected
98
    assert rule.__repr__() == f"Name: '{rule.name}' | rules: {rule.rules}"
99