Skip to content

Commit f59f45e

Browse files
Hamcrest matchers 🙏
1 parent e4d5ed5 commit f59f45e

4 files changed

Lines changed: 68 additions & 28 deletions

File tree

src/eligibility_signposting_api/model/eligibility.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class CohortResult:
8282
@dataclass
8383
class IterationResult:
8484
status: Status
85-
cohort_statuses: list[CohortResult]
85+
cohort_results: list[CohortResult]
8686

8787

8888
@dataclass

src/eligibility_signposting_api/services/calculators/eligibility_calculator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ def evaluate_eligibility(self) -> eligibility.EligibilityStatus:
157157
Condition(
158158
condition_name=condition_name,
159159
status=active_iteration_result.status,
160-
cohort_results=active_iteration_result.cohort_statuses,
160+
cohort_results=active_iteration_result.cohort_results,
161161
)
162162
for condition_name, active_iteration_result in results.items()
163163
]

tests/fixtures/matchers/eligibility.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from hamcrest.core.matcher import Matcher
22

3-
from eligibility_signposting_api.model.eligibility import Condition, EligibilityStatus
3+
from eligibility_signposting_api.model.eligibility import Condition, EligibilityStatus, CohortResult, Reason
4+
from eligibility_signposting_api.model.rules import IterationCohort
45

56
from .meta import BaseAutoMatcher
67

@@ -11,6 +12,14 @@ class EligibilityStatusMatcher(BaseAutoMatcher[EligibilityStatus]): ...
1112
class ConditionMatcher(BaseAutoMatcher[Condition]): ...
1213

1314

15+
class CohortResultMatcher(BaseAutoMatcher[CohortResult]): ...
16+
17+
class ReasonMatcher(BaseAutoMatcher[Reason]): ...
18+
19+
20+
class IterationCohortMatcher(BaseAutoMatcher[IterationCohort]): ...
21+
22+
1423
def is_eligibility_status() -> Matcher[EligibilityStatus]:
1524
return EligibilityStatusMatcher()
1625

@@ -19,5 +28,15 @@ def is_condition() -> Matcher[Condition]:
1928
return ConditionMatcher()
2029

2130

22-
def is_cohort_result() -> Matcher[Condition]:
23-
return ConditionMatcher()
31+
def is_cohort_result() -> Matcher[CohortResult]:
32+
return CohortResultMatcher()
33+
34+
def is_reason() -> Matcher[Reason]:
35+
return ReasonMatcher()
36+
37+
38+
def is_iteration_cohort() -> Matcher[IterationCohort]:
39+
return IterationCohortMatcher()
40+
41+
42+

tests/unit/services/calculators/test_eligibility_calculator.py

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
from eligibility_signposting_api.services.calculators.eligibility_calculator import EligibilityCalculator
1919
from tests.fixtures.builders.model import rule as rule_builder
2020
from tests.fixtures.builders.repos.person import person_rows_builder
21-
from tests.fixtures.matchers.eligibility import is_condition, is_eligibility_status
21+
from tests.fixtures.matchers.eligibility import is_condition, is_eligibility_status, is_cohort_result, is_reason, \
22+
is_iteration_cohort
2223

2324

2425
def test_not_base_eligible(faker: Faker):
@@ -884,23 +885,29 @@ def test_rules_stop_behavior(
884885
# When
885886
actual = calculator.evaluate_eligibility()
886887

887-
actual_reason_results: list[RuleResult] = []
888-
for condition in actual.conditions:
889-
if condition.condition_name == ConditionName("RSV"):
890-
for cohort_result in condition.cohort_results:
891-
actual_reason_results.extend([reason.rule_result for reason in cohort_result.reasons])
892-
893-
# Then
894-
assert_that(
895-
actual_reason_results,
896-
contains_inanyorder(*[equal_to(result) for result in expected_reason_results]),
897-
test_comment,
898-
)
899-
900888
# Then
901889
assert_that(
902890
actual,
903-
is_eligibility_status(),
891+
is_eligibility_status().with_conditions(
892+
has_items(
893+
is_condition()
894+
.with_condition_name(ConditionName("RSV"))
895+
.and_status(
896+
equal_to(Status.not_actionable)
897+
)
898+
.and_cohort_results(
899+
has_items(
900+
is_cohort_result()
901+
.with_reasons(
902+
contains_inanyorder(*[
903+
is_reason().with_rule_result(equal_to(result))
904+
for result in expected_reason_results
905+
])
906+
)
907+
)
908+
)
909+
)
910+
),
904911
)
905912

906913

@@ -973,13 +980,27 @@ def test_eligibility_results_when_multiple_cohorts(
973980
# When
974981
actual = calculator.evaluate_eligibility()
975982

976-
actual_cohort_labels: list[str] = []
977-
actual_cohort_labels.extend(
978-
cohort_result.cohort.cohort_label
979-
for condition in actual.conditions
980-
if condition.condition_name == ConditionName("RSV")
981-
for cohort_result in condition.cohort_results
983+
# Then
984+
assert_that(
985+
actual,
986+
is_eligibility_status().with_conditions(
987+
has_items(
988+
is_condition()
989+
.with_condition_name(ConditionName("RSV"))
990+
.and_status(equal_to(expected_status))
991+
.and_cohort_results(
992+
contains_inanyorder(
993+
*[
994+
is_cohort_result()
995+
.with_cohort(
996+
is_iteration_cohort()
997+
.with_cohort_label(equal_to(cohort_label))
998+
)
999+
for cohort_label in expected_cohorts
1000+
]
1001+
)
1002+
)
1003+
)
1004+
),
9821005
)
9831006

984-
# Then
985-
assert_that(actual_cohort_labels, contains_inanyorder(*expected_cohorts))

0 commit comments

Comments
 (0)