Skip to content

Commit 5bde2e5

Browse files
Test for mulitple campaigns (#87)
* Add test for multiple campaigns with multiple conditions. * Add test for multiple campaigns with the same condition.
1 parent ad8abda commit 5bde2e5

File tree

1 file changed

+137
-2
lines changed

1 file changed

+137
-2
lines changed

tests/unit/services/test_eligibility_services.py

Lines changed: 137 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@
44
import pytest
55
from faker import Faker
66
from freezegun import freeze_time
7-
from hamcrest import assert_that, empty, has_item
7+
from hamcrest import assert_that, contains_exactly, empty, has_item, has_items
88

99
from eligibility_signposting_api.model.eligibility import ConditionName, DateOfBirth, NHSNumber, Postcode, Status
10-
from eligibility_signposting_api.model.rules import IterationDate, IterationRule, RuleComparator, RulePriority, RuleType
10+
from eligibility_signposting_api.model.rules import (
11+
CampaignConfig,
12+
IterationDate,
13+
IterationRule,
14+
RuleComparator,
15+
RulePriority,
16+
RuleType,
17+
)
1118
from eligibility_signposting_api.repos import EligibilityRepo, NotFoundError, RulesRepo
1219
from eligibility_signposting_api.services import EligibilityService, UnknownPersonError
1320
from tests.fixtures.builders.model import rule as rule_builder
@@ -480,3 +487,131 @@ def test_rules_with_same_priority_must_all_match_to_exclude(
480487
),
481488
test_comment,
482489
)
490+
491+
492+
def test_multiple_conditions(faker: Faker):
493+
# Given
494+
nhs_number = NHSNumber(f"5{faker.random_int(max=999999999):09d}")
495+
date_of_birth = DateOfBirth(faker.date_of_birth(minimum_age=76, maximum_age=78))
496+
497+
eligibility_repo = MagicMock(spec=EligibilityRepo)
498+
rules_repo = MagicMock(spec=RulesRepo)
499+
500+
eligibility_repo.get_eligibility_data = MagicMock(
501+
return_value=eligibility_rows_builder(nhs_number, date_of_birth=date_of_birth, cohorts=["cohort1"])
502+
)
503+
rules_repo.get_campaign_configs = MagicMock(
504+
return_value=[
505+
rule_builder.CampaignConfigFactory.build(
506+
target="RSV",
507+
iterations=[
508+
rule_builder.IterationFactory.build(
509+
iteration_cohorts=[rule_builder.IterationCohortFactory.build(cohort_label="cohort1")],
510+
iteration_rules=[rule_builder.PersonAgeSuppressionRuleFactory.build()],
511+
)
512+
],
513+
),
514+
rule_builder.CampaignConfigFactory.build(
515+
target="COVID",
516+
iterations=[
517+
rule_builder.IterationFactory.build(
518+
iteration_cohorts=[rule_builder.IterationCohortFactory.build(cohort_label="cohort1")],
519+
iteration_rules=[rule_builder.PersonAgeSuppressionRuleFactory.build()],
520+
)
521+
],
522+
),
523+
]
524+
)
525+
526+
service = EligibilityService(eligibility_repo, rules_repo)
527+
528+
# When
529+
actual = service.get_eligibility_status(NHSNumber(nhs_number))
530+
531+
# Then
532+
assert_that(
533+
actual,
534+
is_eligibility_status().with_conditions(
535+
has_items(
536+
is_condition().with_condition_name(ConditionName("RSV")).and_status(Status.actionable),
537+
is_condition().with_condition_name(ConditionName("COVID")).and_status(Status.actionable),
538+
)
539+
),
540+
)
541+
542+
543+
@pytest.mark.parametrize(
544+
("test_comment", "campaign1", "campaign2"),
545+
[
546+
(
547+
"1st campaign allows, 2nd excludes",
548+
rule_builder.CampaignConfigFactory.build(
549+
target="RSV",
550+
iterations=[
551+
rule_builder.IterationFactory.build(
552+
iteration_cohorts=[rule_builder.IterationCohortFactory.build(cohort_label="cohort1")],
553+
iteration_rules=[rule_builder.PersonAgeSuppressionRuleFactory.build()],
554+
)
555+
],
556+
),
557+
rule_builder.CampaignConfigFactory.build(
558+
target="RSV",
559+
iterations=[
560+
rule_builder.IterationFactory.build(
561+
iteration_cohorts=[rule_builder.IterationCohortFactory.build(cohort_label="cohort1")],
562+
iteration_rules=[rule_builder.PersonAgeSuppressionRuleFactory.build(comparator="-85")],
563+
)
564+
],
565+
),
566+
),
567+
(
568+
"1st campaign excludes, 2nd allows",
569+
rule_builder.CampaignConfigFactory.build(
570+
target="RSV",
571+
iterations=[
572+
rule_builder.IterationFactory.build(
573+
iteration_cohorts=[rule_builder.IterationCohortFactory.build(cohort_label="cohort1")],
574+
iteration_rules=[rule_builder.PersonAgeSuppressionRuleFactory.build(comparator="-85")],
575+
)
576+
],
577+
),
578+
rule_builder.CampaignConfigFactory.build(
579+
target="RSV",
580+
iterations=[
581+
rule_builder.IterationFactory.build(
582+
iteration_cohorts=[rule_builder.IterationCohortFactory.build(cohort_label="cohort1")],
583+
iteration_rules=[rule_builder.PersonAgeSuppressionRuleFactory.build()],
584+
)
585+
],
586+
),
587+
),
588+
],
589+
)
590+
def test_multiple_campaigns_for_single_condition(
591+
test_comment: str, campaign1: CampaignConfig, campaign2: CampaignConfig, faker: Faker
592+
):
593+
# Given
594+
nhs_number = NHSNumber(f"5{faker.random_int(max=999999999):09d}")
595+
date_of_birth = DateOfBirth(faker.date_of_birth(minimum_age=76, maximum_age=78))
596+
597+
eligibility_repo = MagicMock(spec=EligibilityRepo)
598+
rules_repo = MagicMock(spec=RulesRepo)
599+
600+
eligibility_repo.get_eligibility_data = MagicMock(
601+
return_value=eligibility_rows_builder(nhs_number, date_of_birth=date_of_birth, cohorts=["cohort1"])
602+
)
603+
rules_repo.get_campaign_configs = MagicMock(return_value=[campaign1, campaign2])
604+
605+
service = EligibilityService(eligibility_repo, rules_repo)
606+
607+
# When
608+
actual = service.get_eligibility_status(NHSNumber(nhs_number))
609+
610+
# Then
611+
assert_that(
612+
actual,
613+
is_eligibility_status().with_conditions(
614+
contains_exactly(is_condition().with_condition_name(ConditionName("RSV")).and_status(Status.actionable))
615+
),
616+
test_comment,
617+
)

0 commit comments

Comments
 (0)