|
1 | 1 | import datetime |
| 2 | +import logging |
2 | 3 | from typing import Any |
3 | 4 |
|
4 | 5 | import pytest |
5 | 6 | from faker import Faker |
6 | 7 | from flask import Flask |
7 | 8 | from freezegun import freeze_time |
8 | 9 | from hamcrest import assert_that, contains_exactly, contains_inanyorder, has_item, has_items, is_, is_in |
9 | | -from pydantic import HttpUrl |
10 | 10 |
|
11 | 11 | from eligibility_signposting_api.model import campaign_config as rules_model |
12 | 12 | from eligibility_signposting_api.model import eligibility_status |
13 | 13 | from eligibility_signposting_api.model.campaign_config import ( |
14 | | - AvailableAction, |
15 | 14 | CohortLabel, |
16 | 15 | Description, |
17 | 16 | RuleAttributeLevel, |
@@ -585,19 +584,94 @@ def test_cohort_group_descriptions_are_selected_based_on_priority_when_cohorts_h |
585 | 584 | ) |
586 | 585 |
|
587 | 586 |
|
588 | | -book_nbs_comms = AvailableAction( |
589 | | - ActionType="ButtonAuthLink", |
590 | | - ExternalRoutingCode="BookNBS", |
591 | | - ActionDescription="Action description", |
592 | | - UrlLink=HttpUrl("https://www.nhs.uk/book-rsv"), |
593 | | - UrlLabel="Continue to booking", |
594 | | -) |
| 587 | +@freeze_time("2025-04-25") |
| 588 | +def test_no_active_iteration_returns_empty_conditions_with_single_active_campaign(faker: Faker): |
| 589 | + # Given |
| 590 | + person_rows = person_rows_builder(NHSNumber(faker.nhs_number())) |
| 591 | + campaign_configs = [ |
| 592 | + rule_builder.CampaignConfigFactory.build( |
| 593 | + target="RSV", |
| 594 | + iterations=[ |
| 595 | + rule_builder.IterationFactory.build( |
| 596 | + name="inactive iteration", |
| 597 | + iteration_rules=[], |
| 598 | + iteration_cohorts=[rule_builder.IterationCohortFactory.build(cohort_label="cohort1")], |
| 599 | + ) |
| 600 | + ], |
| 601 | + ) |
| 602 | + ] |
| 603 | + # Need to set the iteration date to override CampaignConfigFactory.fix_iteration_date_invariants behavior |
| 604 | + campaign_configs[0].iterations[0].iteration_date = datetime.date(2025, 5, 10) |
595 | 605 |
|
596 | | -default_comms_detail = AvailableAction( |
597 | | - ActionType="CareCardWithText", |
598 | | - ExternalRoutingCode="BookLocal", |
599 | | - ActionDescription="You can get an RSV vaccination at your GP surgery", |
600 | | -) |
| 606 | + calculator = EligibilityCalculator(person_rows, campaign_configs) |
| 607 | + |
| 608 | + # When |
| 609 | + actual = calculator.get_eligibility_status("Y", ["ALL"], "ALL") |
| 610 | + |
| 611 | + # Then |
| 612 | + assert_that(actual, is_eligibility_status().with_conditions([])) |
| 613 | + |
| 614 | + |
| 615 | +@pytest.mark.usefixtures("caplog") |
| 616 | +@freeze_time("2025-04-25") |
| 617 | +def test_returns_no_condition_data_for_campaign_without_active_iteration(faker: Faker, caplog): |
| 618 | + # Given |
| 619 | + person_rows = person_rows_builder(NHSNumber(faker.nhs_number())) |
| 620 | + campaign_configs = [ |
| 621 | + rule_builder.CampaignConfigFactory.build( |
| 622 | + target="RSV", |
| 623 | + iterations=[ |
| 624 | + rule_builder.IterationFactory.build( |
| 625 | + name="inactive iteration", |
| 626 | + iteration_rules=[], |
| 627 | + iteration_cohorts=[rule_builder.IterationCohortFactory.build(cohort_label="cohort1")], |
| 628 | + ) |
| 629 | + ], |
| 630 | + ), |
| 631 | + rule_builder.CampaignConfigFactory.build( |
| 632 | + target="COVID", |
| 633 | + iterations=[ |
| 634 | + rule_builder.IterationFactory.build( |
| 635 | + name="active iteration", |
| 636 | + iteration_rules=[], |
| 637 | + iteration_cohorts=[rule_builder.IterationCohortFactory.build(cohort_label="cohort1")], |
| 638 | + ) |
| 639 | + ], |
| 640 | + ), |
| 641 | + ] |
| 642 | + # Need to set the iteration date to override CampaignConfigFactory.fix_iteration_date_invariants behavior |
| 643 | + rsv_campaign = campaign_configs[0] |
| 644 | + rsv_campaign.iterations[0].iteration_date = datetime.date(2025, 5, 10) |
| 645 | + |
| 646 | + calculator = EligibilityCalculator(person_rows, campaign_configs) |
| 647 | + |
| 648 | + # When |
| 649 | + with caplog.at_level(logging.INFO): |
| 650 | + actual = calculator.get_eligibility_status("Y", ["ALL"], "ALL") |
| 651 | + |
| 652 | + # Then |
| 653 | + condition_names = [condition.condition_name for condition in actual.conditions] |
| 654 | + |
| 655 | + assert ConditionName("RSV") not in condition_names |
| 656 | + assert ConditionName("COVID") in condition_names |
| 657 | + assert f"Skipping campaign ID {rsv_campaign.id} as no active iteration was found." in caplog.text |
| 658 | + |
| 659 | + |
| 660 | +@freeze_time("2025-04-25") |
| 661 | +def test_no_active_campaign(faker: Faker): |
| 662 | + # Given |
| 663 | + person_rows = person_rows_builder(NHSNumber(faker.nhs_number())) |
| 664 | + campaign_configs = [rule_builder.CampaignConfigFactory.build()] |
| 665 | + # Need to set the campaign dates to override CampaignConfigFactory.fix_iteration_date_invariants behavior |
| 666 | + campaign_configs[0].start_date = datetime.date(2025, 5, 10) |
| 667 | + |
| 668 | + calculator = EligibilityCalculator(person_rows, campaign_configs) |
| 669 | + |
| 670 | + # When |
| 671 | + actual = calculator.get_eligibility_status("Y", ["ALL"], "ALL") |
| 672 | + |
| 673 | + # Then |
| 674 | + assert_that(actual, is_eligibility_status().with_conditions([])) |
601 | 675 |
|
602 | 676 |
|
603 | 677 | class TestEligibilityResultBuilder: |
|
0 commit comments