Skip to content

Commit ce2c02a

Browse files
Ensure rules evaluation does something sensible with empty values and Nones.
1 parent c804777 commit ce2c02a

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

src/eligibility_signposting_api/services/eligibility_services.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,13 @@ 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 int(attribute_value) < int(iteration_rule.comparator)
90+
return int(attribute_value or 0) < int(iteration_rule.comparator)
9191
case RuleOperator.lte:
92-
return int(attribute_value) <= int(iteration_rule.comparator)
92+
return int(attribute_value or 0) <= int(iteration_rule.comparator)
9393
case RuleOperator.gt:
94-
return int(attribute_value) > int(iteration_rule.comparator)
94+
return int(attribute_value or 0) > int(iteration_rule.comparator)
9595
case RuleOperator.gte:
96-
return int(attribute_value) >= int(iteration_rule.comparator)
96+
return int(attribute_value or 0) >= int(iteration_rule.comparator)
9797
case RuleOperator.year_gt:
9898
attribute_date = datetime.strptime(str(attribute_value), "%Y%m%d") if attribute_value else None # noqa: DTZ007
9999
today = datetime.today() # noqa: DTZ002

tests/unit/services/test_eligibility_services.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,12 +162,16 @@ def test_equals_rule():
162162
rule = IterationRuleFactory.build(operator=RuleOperator.equals, comparator="42")
163163
assert EligibilityService.evaluate_rule(rule, "42")
164164
assert not EligibilityService.evaluate_rule(rule, "99")
165+
assert not EligibilityService.evaluate_rule(rule, "")
166+
assert not EligibilityService.evaluate_rule(rule, None)
165167

166168

167169
def test_not_equals_rule():
168170
rule = IterationRuleFactory.build(operator=RuleOperator.ne, comparator="42")
169171
assert EligibilityService.evaluate_rule(rule, "99")
170172
assert not EligibilityService.evaluate_rule(rule, "42")
173+
assert EligibilityService.evaluate_rule(rule, "")
174+
assert EligibilityService.evaluate_rule(rule, None)
171175

172176

173177
def test_less_than_rule():
@@ -176,27 +180,35 @@ def test_less_than_rule():
176180
assert EligibilityService.evaluate_rule(rule, "99")
177181
assert not EligibilityService.evaluate_rule(rule, "100")
178182
assert not EligibilityService.evaluate_rule(rule, "101")
183+
assert EligibilityService.evaluate_rule(rule, "")
184+
assert EligibilityService.evaluate_rule(rule, None)
179185

180186

181187
def test_less_than_or_equal_rule():
182188
rule = IterationRuleFactory.build(operator=RuleOperator.lte, comparator="100")
183189
assert EligibilityService.evaluate_rule(rule, "99")
184190
assert EligibilityService.evaluate_rule(rule, "100")
185191
assert not EligibilityService.evaluate_rule(rule, "101")
192+
assert EligibilityService.evaluate_rule(rule, "")
193+
assert EligibilityService.evaluate_rule(rule, None)
186194

187195

188196
def test_greater_than_rule():
189197
rule = IterationRuleFactory.build(operator=RuleOperator.gt, comparator="100")
190198
assert EligibilityService.evaluate_rule(rule, "101")
191199
assert not EligibilityService.evaluate_rule(rule, "100")
192200
assert not EligibilityService.evaluate_rule(rule, "99")
201+
assert not EligibilityService.evaluate_rule(rule, "")
202+
assert not EligibilityService.evaluate_rule(rule, None)
193203

194204

195205
def test_greater_than_or_equal_rule():
196206
rule = IterationRuleFactory.build(operator=RuleOperator.gte, comparator="100")
197207
assert EligibilityService.evaluate_rule(rule, "100")
198208
assert EligibilityService.evaluate_rule(rule, "101")
199209
assert not EligibilityService.evaluate_rule(rule, "99")
210+
assert not EligibilityService.evaluate_rule(rule, "")
211+
assert not EligibilityService.evaluate_rule(rule, None)
200212

201213

202214
def test_year_gt_rule_future_date():
@@ -206,6 +218,8 @@ def test_year_gt_rule_future_date():
206218
attribute_value = future_date.strftime("%Y%m%d")
207219
rule = IterationRuleFactory.build(operator=RuleOperator.year_gt, comparator=str(years_offset))
208220
assert EligibilityService.evaluate_rule(rule, attribute_value)
221+
assert not EligibilityService.evaluate_rule(rule, "")
222+
assert not EligibilityService.evaluate_rule(rule, None)
209223

210224

211225
def test_year_gt_rule_past_date():
@@ -215,12 +229,8 @@ def test_year_gt_rule_past_date():
215229
attribute_value = past_date.strftime("%Y%m%d")
216230
rule = IterationRuleFactory.build(operator=RuleOperator.year_gt, comparator=str(years_offset))
217231
assert not EligibilityService.evaluate_rule(rule, attribute_value)
218-
219-
220-
def test_year_gt_rule_empty_value():
221-
rule = IterationRuleFactory.build(operator=RuleOperator.year_gt, comparator="2")
222-
assert not EligibilityService.evaluate_rule(rule, None)
223232
assert not EligibilityService.evaluate_rule(rule, "")
233+
assert not EligibilityService.evaluate_rule(rule, None)
224234

225235

226236
def test_unimplemented_operator():

0 commit comments

Comments
 (0)