|
1 | 1 | import assertpy |
| 2 | +import pytest |
2 | 3 |
|
3 | 4 | from feast.permissions.decision import DecisionEvaluator, DecisionStrategy |
4 | 5 |
|
| 6 | +# Each vote is a tuple of `current_vote` and expected output of `is_decided` |
5 | 7 |
|
6 | | -def test_affirmative(): |
7 | | - evaluator = DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3) |
8 | | - evaluator.add_grant("vote", True, "") |
9 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
10 | | - assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) |
11 | 8 |
|
12 | | - evaluator = DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3) |
13 | | - evaluator.add_grant("vote", False, "a message") |
14 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
15 | | - evaluator.add_grant("vote", False, "a message") |
16 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
17 | | - evaluator.add_grant("vote", False, "a message") |
18 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
19 | | - grant, explanations = evaluator.grant() |
20 | | - assertpy.assert_that(grant).is_equal_to(False) |
21 | | - assertpy.assert_that(explanations).is_length(3) |
22 | | - |
23 | | - |
24 | | -def test_unanimous(): |
25 | | - evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3) |
26 | | - evaluator.add_grant("vote", True, "") |
27 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
28 | | - evaluator.add_grant("vote", True, "") |
29 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
30 | | - evaluator.add_grant("vote", True, "") |
31 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
32 | | - assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) |
33 | | - |
34 | | - evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3) |
35 | | - evaluator.add_grant("vote", True, "") |
36 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
37 | | - evaluator.add_grant("vote", False, "a message") |
38 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
39 | | - grant, explanations = evaluator.grant() |
40 | | - assertpy.assert_that(grant).is_equal_to(False) |
41 | | - assertpy.assert_that(explanations).is_length(1) |
42 | | - |
43 | | - |
44 | | -def test_consensus(): |
45 | | - evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 1) |
46 | | - evaluator.add_grant("vote", True, "") |
47 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
48 | | - assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) |
49 | | - |
50 | | - evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 1) |
51 | | - evaluator.add_grant("vote", False, "a message") |
52 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
53 | | - grant, explanations = evaluator.grant() |
54 | | - assertpy.assert_that(grant).is_equal_to(False) |
55 | | - assertpy.assert_that(explanations).is_length(1) |
56 | | - |
57 | | - evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 5) |
58 | | - evaluator.add_grant("vote", True, "") |
59 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
60 | | - evaluator.add_grant("vote", False, "a message") |
61 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
62 | | - evaluator.add_grant("vote", False, "a message") |
63 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
64 | | - evaluator.add_grant("vote", True, "") |
65 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
66 | | - evaluator.add_grant("vote", True, "") |
67 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
68 | | - grant, explanations = evaluator.grant() |
69 | | - assertpy.assert_that(grant).is_equal_to(True) |
70 | | - assertpy.assert_that(explanations).is_length(2) |
71 | | - |
72 | | - evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 5) |
73 | | - evaluator.add_grant("vote", True, "") |
74 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
75 | | - evaluator.add_grant("vote", False, "a message") |
76 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
77 | | - evaluator.add_grant("vote", False, "a message") |
78 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
79 | | - evaluator.add_grant("vote", False, "a message") |
80 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
81 | | - grant, explanations = evaluator.grant() |
82 | | - assertpy.assert_that(grant).is_equal_to(False) |
83 | | - assertpy.assert_that(explanations).is_length(3) |
84 | | - |
85 | | - |
86 | | -def test_additional_votes_are_discarded(): |
87 | | - evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2) |
88 | | - evaluator.add_grant("vote", True, "") |
89 | | - assertpy.assert_that(evaluator.is_decided()).is_false() |
90 | | - evaluator.add_grant("vote", True, "") |
91 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
92 | | - evaluator.add_grant("vote", False, "a message") |
93 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
94 | | - evaluator.add_grant("vote", False, "a message") |
95 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
96 | | - evaluator.add_grant("vote", False, "a message") |
97 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
98 | | - assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) |
| 9 | +@pytest.mark.parametrize( |
| 10 | + "evaluator, votes, decision, no_of_explanations", |
| 11 | + [ |
| 12 | + (DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3), [(True, True)], True, 0), |
| 13 | + (DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3), [(True, True)], True, 0), |
| 14 | + ( |
| 15 | + DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3), |
| 16 | + [(False, False), (False, False), (False, True)], |
| 17 | + False, |
| 18 | + 3, |
| 19 | + ), |
| 20 | + ( |
| 21 | + DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3), |
| 22 | + [(True, False), (True, False), (True, True)], |
| 23 | + True, |
| 24 | + 0, |
| 25 | + ), |
| 26 | + ( |
| 27 | + DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3), |
| 28 | + [(True, False), (False, True)], |
| 29 | + False, |
| 30 | + 1, |
| 31 | + ), |
| 32 | + (DecisionEvaluator(DecisionStrategy.CONSENSUS, 1), [(True, True)], True, 0), |
| 33 | + (DecisionEvaluator(DecisionStrategy.CONSENSUS, 1), [(False, True)], False, 1), |
| 34 | + ( |
| 35 | + DecisionEvaluator(DecisionStrategy.CONSENSUS, 5), |
| 36 | + [ |
| 37 | + (True, False), |
| 38 | + (False, False), |
| 39 | + (False, False), |
| 40 | + (True, False), |
| 41 | + (True, True), |
| 42 | + ], |
| 43 | + True, |
| 44 | + 2, |
| 45 | + ), |
| 46 | + ( |
| 47 | + DecisionEvaluator(DecisionStrategy.CONSENSUS, 5), |
| 48 | + [(True, False), (False, False), (False, False), (False, True)], |
| 49 | + False, |
| 50 | + 3, |
| 51 | + ), |
| 52 | + ( |
| 53 | + DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2), |
| 54 | + [(True, False), (True, True), (False, True), (False, True), (False, True)], |
| 55 | + True, |
| 56 | + 0, |
| 57 | + ), |
| 58 | + ( |
| 59 | + DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2), |
| 60 | + [(False, True), (False, True), (False, True), (False, True), (False, True)], |
| 61 | + False, |
| 62 | + 1, |
| 63 | + ), |
| 64 | + ], |
| 65 | +) |
| 66 | +def test_decision_evaluator(evaluator, votes, decision, no_of_explanations): |
| 67 | + for v in votes: |
| 68 | + vote = v[0] |
| 69 | + decided = v[1] |
| 70 | + evaluator.add_grant("vote", vote, "" if vote else "a message") |
| 71 | + if decided: |
| 72 | + assertpy.assert_that(evaluator.is_decided()).is_true() |
| 73 | + else: |
| 74 | + assertpy.assert_that(evaluator.is_decided()).is_false() |
99 | 75 |
|
100 | | - evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2) |
101 | | - evaluator.add_grant("vote", False, "a message") |
102 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
103 | | - evaluator.add_grant("vote", False, "a message") |
104 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
105 | | - evaluator.add_grant("vote", False, "a message") |
106 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
107 | | - evaluator.add_grant("vote", False, "a message") |
108 | | - assertpy.assert_that(evaluator.is_decided()).is_true() |
109 | 76 | grant, explanations = evaluator.grant() |
110 | | - assertpy.assert_that(grant).is_equal_to(False) |
111 | | - assertpy.assert_that(explanations).is_length(1) |
| 77 | + assertpy.assert_that(grant).is_equal_to(decision) |
| 78 | + assertpy.assert_that(explanations).is_length(no_of_explanations) |
0 commit comments