diff --git a/src/eligibility_signposting_api/model/rules.py b/src/eligibility_signposting_api/model/rules.py index 5888a3a34..06770d783 100644 --- a/src/eligibility_signposting_api/model/rules.py +++ b/src/eligibility_signposting_api/model/rules.py @@ -159,7 +159,7 @@ class CampaignConfig(BaseModel): approver: str | None = Field(None, alias="Approver") reviewer: str | None = Field(None, alias="Reviewer") iteration_frequency: Literal["X", "D", "W", "M", "Q", "A"] = Field(..., alias="IterationFrequency") - iteration_type: Literal["A", "M", "S"] = Field(..., alias="IterationType") + iteration_type: Literal["A", "M", "S", "O"] = Field(..., alias="IterationType") iteration_time: str | None = Field(None, alias="IterationTime") default_comms_routing: str | None = Field(None, alias="DefaultCommsRouting") start_date: StartDate = Field(..., alias="StartDate") diff --git a/tests/unit/services/calculators/test_eligibility_calculator.py b/tests/unit/services/calculators/test_eligibility_calculator.py index 56a9b8911..f1e40ea79 100644 --- a/tests/unit/services/calculators/test_eligibility_calculator.py +++ b/tests/unit/services/calculators/test_eligibility_calculator.py @@ -4,7 +4,7 @@ import pytest from faker import Faker from freezegun import freeze_time -from hamcrest import assert_that, contains_exactly, contains_inanyorder, equal_to, has_item, has_items +from hamcrest import assert_that, contains_exactly, contains_inanyorder, equal_to, has_item, has_items, is_in from eligibility_signposting_api.model import rules from eligibility_signposting_api.model import rules as rules_model @@ -153,6 +153,35 @@ def test_only_live_campaigns_considered(faker: Faker): ) +@pytest.mark.parametrize( + "iteration_type", + ["A", "M", "S", "O"], +) +def test_campaigns_with_applicable_iteration_types_considered(iteration_type: str, faker: Faker): + # Given + nhs_number = NHSNumber(faker.nhs_number()) + + person_rows = person_rows_builder(nhs_number) + campaign_configs = [rule_builder.CampaignConfigFactory.build(target="RSV", iteration_type=iteration_type)] + + 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(is_in([Status.actionable, Status.not_actionable, Status.not_eligible])) + ), + ), + ) + + def test_base_eligible_and_simple_rule_includes(faker: Faker): # Given nhs_number = NHSNumber(faker.nhs_number())