Skip to content

Commit d66a4ad

Browse files
Test various rule operators.
1 parent e48f56a commit d66a4ad

File tree

3 files changed

+80
-6
lines changed

3 files changed

+80
-6
lines changed

src/eligibility_signposting_api/services/eligibility_services.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,18 @@ def evaluate_rule(iteration_rule: IterationRule, attribute_value: Any) -> bool:
8787
case RuleOperator.ne:
8888
return attribute_value != iteration_rule.comparator
8989
case RuleOperator.lt:
90-
return attribute_value < iteration_rule.comparator
90+
return int(attribute_value) < int(iteration_rule.comparator)
9191
case RuleOperator.lte:
92-
return attribute_value <= iteration_rule.comparator
92+
return int(attribute_value) <= int(iteration_rule.comparator)
9393
case RuleOperator.gt:
94-
return attribute_value > iteration_rule.comparator
94+
return int(attribute_value) > int(iteration_rule.comparator)
9595
case RuleOperator.gte:
96-
return attribute_value >= iteration_rule.comparator
96+
return int(attribute_value) >= int(iteration_rule.comparator)
9797
case RuleOperator.year_gt:
98-
attribute_date = datetime.strptime(str(attribute_value), "%Y%m%d") # noqa: DTZ007
98+
attribute_date = datetime.strptime(str(attribute_value), "%Y%m%d") if attribute_value else None # noqa: DTZ007
9999
today = datetime.today() # noqa: DTZ002
100100
cutoff = today + relativedelta(years=int(iteration_rule.comparator))
101-
return (attribute_date > cutoff) if attribute_value else False
101+
return (attribute_date > cutoff) if attribute_date else False
102102
case _:
103103
msg = f"{iteration_rule.operator} not implemented"
104104
raise NotImplementedError(msg)

tests/integration/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ def campaign_config(s3_client: BaseClient, bucket: BucketName) -> Generator[Camp
261261
operator=RuleOperator.lt,
262262
attribute_level=RuleAttributeLevel.PERSON,
263263
attribute_name="DATE_OF_BIRTH",
264+
comparator="-75"
264265
)
265266
]
266267
)

tests/unit/services/test_eligibility_services.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
from datetime import datetime
12
from unittest.mock import MagicMock
23

34
import pytest
45
from brunns.matchers.object import false, true
6+
from dateutil.relativedelta import relativedelta
57
from faker import Faker
68
from hamcrest import assert_that
79

@@ -152,3 +154,74 @@ def test_simple_rule_ineligible(faker: Faker):
152154

153155
# Then
154156
assert_that(actual, is_eligibility_status().with_eligible(false()))
157+
158+
159+
def test_equals_rule():
160+
rule = IterationRuleFactory.build(operator=RuleOperator.equals, comparator="42")
161+
assert EligibilityService.evaluate_rule(rule, "42")
162+
assert not EligibilityService.evaluate_rule(rule, "99")
163+
164+
165+
def test_not_equals_rule():
166+
rule = IterationRuleFactory.build(operator=RuleOperator.ne, comparator="42")
167+
assert EligibilityService.evaluate_rule(rule, "99")
168+
assert not EligibilityService.evaluate_rule(rule, "42")
169+
170+
171+
def test_less_than_rule():
172+
rule = IterationRuleFactory.build(operator=RuleOperator.lt, comparator="100")
173+
assert EligibilityService.evaluate_rule(rule, "42")
174+
assert EligibilityService.evaluate_rule(rule, "99")
175+
assert not EligibilityService.evaluate_rule(rule, "100")
176+
assert not EligibilityService.evaluate_rule(rule, "101")
177+
178+
179+
def test_less_than_or_equal_rule():
180+
rule = IterationRuleFactory.build(operator=RuleOperator.lte, comparator="100")
181+
assert EligibilityService.evaluate_rule(rule, "99")
182+
assert EligibilityService.evaluate_rule(rule, "100")
183+
assert not EligibilityService.evaluate_rule(rule, "101")
184+
185+
186+
def test_greater_than_rule():
187+
rule = IterationRuleFactory.build(operator=RuleOperator.gt, comparator="100")
188+
assert EligibilityService.evaluate_rule(rule, "101")
189+
assert not EligibilityService.evaluate_rule(rule, "100")
190+
assert not EligibilityService.evaluate_rule(rule, "99")
191+
192+
193+
def test_greater_than_or_equal_rule():
194+
rule = IterationRuleFactory.build(operator=RuleOperator.gte, comparator="100")
195+
assert EligibilityService.evaluate_rule(rule, "100")
196+
assert EligibilityService.evaluate_rule(rule, "101")
197+
assert not EligibilityService.evaluate_rule(rule, "99")
198+
199+
200+
def test_year_gt_rule_future_date():
201+
today = datetime.today() # noqa: DTZ002
202+
years_offset = 2
203+
future_date = today + relativedelta(years=years_offset + 1)
204+
attribute_value = future_date.strftime("%Y%m%d")
205+
rule = IterationRuleFactory.build(operator=RuleOperator.year_gt, comparator=str(years_offset))
206+
assert EligibilityService.evaluate_rule(rule, attribute_value)
207+
208+
209+
def test_year_gt_rule_past_date():
210+
today = datetime.today() # noqa: DTZ002
211+
years_offset = 2
212+
past_date = today + relativedelta(years=years_offset - 1)
213+
attribute_value = past_date.strftime("%Y%m%d")
214+
rule = IterationRuleFactory.build(operator=RuleOperator.year_gt, comparator=str(years_offset))
215+
assert not EligibilityService.evaluate_rule(rule, attribute_value)
216+
217+
218+
def test_year_gt_rule_empty_value():
219+
rule = IterationRuleFactory.build(operator=RuleOperator.year_gt, comparator="2")
220+
assert not EligibilityService.evaluate_rule(rule, None)
221+
assert not EligibilityService.evaluate_rule(rule, "")
222+
223+
224+
def test_unimplemented_operator():
225+
rule = IterationRuleFactory.build(operator=RuleOperator.member_of, comparator="something")
226+
with pytest.raises(NotImplementedError, match="not implemented"):
227+
EligibilityService.evaluate_rule(rule, "any_value")

0 commit comments

Comments
 (0)