From a16d954ebc7b412352eab6f9aa5b67aaa2573b61 Mon Sep 17 00:00:00 2001 From: karthikeyannhs <174426205+Karthikeyannhs@users.noreply.github.com> Date: Thu, 22 May 2025 15:30:27 +0100 Subject: [PATCH 1/3] test_base_eligible_with_when_magic_cohort_is_present --- .../calculators/eligibility_calculator.py | 6 +-- .../test_eligibility_calculator.py | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py b/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py index 0423e533..b383b1d7 100644 --- a/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py +++ b/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py @@ -70,11 +70,11 @@ def get_the_base_eligible_campaigns(self, campaign_group: list[rules.CampaignCon return base_eligible_campaigns return [] - def check_base_eligibility(self, iteration: rules.Iteration | None) -> set[str]: + def check_base_eligibility(self, iteration: rules.Iteration | None) -> bool | set[Any]: """Return cohorts for which person is base eligible.""" if not iteration: - return set() + return False iteration_cohorts: set[str] = { cohort.cohort_label for cohort in iteration.iteration_cohorts if cohort.cohort_label } @@ -82,7 +82,7 @@ def check_base_eligibility(self, iteration: rules.Iteration | None) -> set[str]: (row for row in self.person_data if row.get("ATTRIBUTE_TYPE") == "COHORTS"), {} ) person_cohorts: set[str] = set(cohorts_row.get("COHORT_MAP", {}).get("cohorts", {}).get("M", {}).keys()) - return iteration_cohorts & person_cohorts + return bool(iteration_cohorts & person_cohorts) or ("elid_all_people" in iteration_cohorts) def evaluate_eligibility_by_iteration_rules( self, campaign_group: list[rules.CampaignConfig] diff --git a/tests/unit/services/calculators/test_eligibility_calculator.py b/tests/unit/services/calculators/test_eligibility_calculator.py index 88c4c722..2e6ed793 100644 --- a/tests/unit/services/calculators/test_eligibility_calculator.py +++ b/tests/unit/services/calculators/test_eligibility_calculator.py @@ -46,6 +46,48 @@ def test_not_base_eligible(faker: Faker): ) +@pytest.mark.parametrize( + ("cohorts", "test_comment"), + [ + (["elid_all_people"], "Only magic cohort present"), + (["elid_all_people", "cohort1"], "Magic cohort with other cohorts"), + ], +) +def test_base_eligible_with_when_magic_cohort_is_present(faker: Faker, cohorts, test_comment): + # Given + nhs_number = NHSNumber(faker.nhs_number()) + date_of_birth = DateOfBirth(faker.date_of_birth(minimum_age=76, maximum_age=79)) + + person_rows = person_rows_builder(nhs_number, date_of_birth=date_of_birth, cohorts=["cohort1"]) + campaign_configs = [ + rule_builder.CampaignConfigFactory.build( + target="RSV", + iterations=[ + rule_builder.IterationFactory.build( + iteration_cohorts=[ + rule_builder.IterationCohortFactory.build(cohort_label=label) for label in cohorts + ], + iteration_rules=[rule_builder.PersonAgeSuppressionRuleFactory.build()], + ) + ], + ) + ] + + calculator = EligibilityCalculator(person_rows, campaign_configs) + + # When + actual = calculator.evaluate_eligibility() + + # Then + assert_that( + actual, + is_eligibility_status().with_conditions( + has_item(is_condition().with_condition_name(ConditionName("RSV")).and_status(Status.actionable)) + ), + test_comment, + ) + + @freeze_time("2025-04-25") def test_only_live_campaigns_considered(faker: Faker): # Given From 7c0e6e9a37d9bbfd9d10413d36b4d855bedeac25 Mon Sep 17 00:00:00 2001 From: karthikeyannhs <174426205+Karthikeyannhs@users.noreply.github.com> Date: Thu, 22 May 2025 16:14:40 +0100 Subject: [PATCH 2/3] check_base_eligibility return type changed to boolean --- .../services/calculators/eligibility_calculator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py b/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py index b383b1d7..d0501c10 100644 --- a/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py +++ b/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py @@ -70,7 +70,7 @@ def get_the_base_eligible_campaigns(self, campaign_group: list[rules.CampaignCon return base_eligible_campaigns return [] - def check_base_eligibility(self, iteration: rules.Iteration | None) -> bool | set[Any]: + def check_base_eligibility(self, iteration: rules.Iteration | None) -> bool: """Return cohorts for which person is base eligible.""" if not iteration: From 082ed981b9670ef60a9a0f92fb194903c1656a0a Mon Sep 17 00:00:00 2001 From: karthikeyannhs <174426205+Karthikeyannhs@users.noreply.github.com> Date: Thu, 22 May 2025 16:44:10 +0100 Subject: [PATCH 3/3] Simplify cohort eligibility check --- .../services/calculators/eligibility_calculator.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py b/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py index d0501c10..31419b83 100644 --- a/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py +++ b/src/eligibility_signposting_api/services/calculators/eligibility_calculator.py @@ -13,6 +13,7 @@ from eligibility_signposting_api.services.calculators.rule_calculator import RuleCalculator Row = Collection[Mapping[str, Any]] +magic_cohort = "elid_all_people" @service @@ -74,15 +75,18 @@ def check_base_eligibility(self, iteration: rules.Iteration | None) -> bool: """Return cohorts for which person is base eligible.""" if not iteration: - return False + return False # pragma: no cover iteration_cohorts: set[str] = { cohort.cohort_label for cohort in iteration.iteration_cohorts if cohort.cohort_label } + if magic_cohort in iteration_cohorts: + return True + cohorts_row: Mapping[str, dict[str, dict[str, dict[str, Any]]]] = next( (row for row in self.person_data if row.get("ATTRIBUTE_TYPE") == "COHORTS"), {} ) person_cohorts: set[str] = set(cohorts_row.get("COHORT_MAP", {}).get("cohorts", {}).get("M", {}).keys()) - return bool(iteration_cohorts & person_cohorts) or ("elid_all_people" in iteration_cohorts) + return bool(iteration_cohorts & person_cohorts) def evaluate_eligibility_by_iteration_rules( self, campaign_group: list[rules.CampaignConfig]