|
3 | 3 | import pytest |
4 | 4 | from hamcrest import assert_that, empty |
5 | 5 |
|
6 | | -from eligibility_signposting_api.model.campaign_config import CampaignID, CampaignConfig |
| 6 | +from eligibility_signposting_api.model.campaign_config import CampaignConfig, CampaignID |
7 | 7 | from eligibility_signposting_api.model.eligibility_status import NHSNumber |
8 | 8 | from eligibility_signposting_api.repos import CampaignRepo, NotFoundError, PersonRepo |
9 | 9 | from eligibility_signposting_api.repos.consumer_mapping_repo import ConsumerMappingRepo |
10 | 10 | from eligibility_signposting_api.services import EligibilityService, UnknownPersonError |
11 | 11 | from eligibility_signposting_api.services.calculators.eligibility_calculator import EligibilityCalculatorFactory |
12 | | -from eligibility_signposting_api.services.eligibility_services import NoPermittedCampaignsError |
13 | 12 | from tests.fixtures.matchers.eligibility import is_eligibility_status |
14 | 13 |
|
| 14 | + |
15 | 15 | @pytest.fixture |
16 | 16 | def mock_repos(): |
17 | 17 | return { |
18 | 18 | "person": MagicMock(spec=PersonRepo), |
19 | 19 | "campaign": MagicMock(spec=CampaignRepo), |
20 | 20 | "consumer": MagicMock(spec=ConsumerMappingRepo), |
21 | | - "factory": MagicMock(spec=EligibilityCalculatorFactory) |
| 21 | + "factory": MagicMock(spec=EligibilityCalculatorFactory), |
22 | 22 | } |
23 | 23 |
|
| 24 | + |
24 | 25 | @pytest.fixture |
25 | 26 | def service(mock_repos): |
26 | 27 | return EligibilityService( |
27 | | - mock_repos["person"], |
28 | | - mock_repos["campaign"], |
29 | | - mock_repos["consumer"], |
30 | | - mock_repos["factory"] |
| 28 | + mock_repos["person"], mock_repos["campaign"], mock_repos["consumer"], mock_repos["factory"] |
31 | 29 | ) |
32 | 30 |
|
| 31 | + |
33 | 32 | def test_eligibility_service_returns_from_repo(): |
34 | 33 | # Given |
35 | 34 | person_repo = MagicMock(spec=PersonRepo) |
@@ -66,48 +65,58 @@ def test_eligibility_service_for_nonexistent_nhs_number(): |
66 | 65 | ) |
67 | 66 |
|
68 | 67 |
|
69 | | -def test_get_eligibility_status_filters_permitted_campaigns(service, mock_repos): |
70 | | - """Tests that ONLY permitted campaigns reach the calculator factory.""" |
71 | | - # Given |
72 | | - nhs_number = NHSNumber("1234567890") |
73 | | - person_data = {"age": 65, "vulnerable": True} |
74 | | - mock_repos["person"].get_eligibility_data.return_value = person_data |
75 | | - |
76 | | - # Available campaigns in system |
77 | | - camp_a = MagicMock(spec=CampaignConfig, id=CampaignID("CAMP_A")) |
78 | | - camp_b = MagicMock(spec=CampaignConfig, id=CampaignID("CAMP_B")) |
79 | | - mock_repos["campaign"].get_campaign_configs.return_value = [camp_a, camp_b] |
80 | | - |
81 | | - # Consumer is only permitted to see CAMP_B |
82 | | - mock_repos["consumer"].get_permitted_campaign_ids.return_value = [CampaignID("CAMP_B")] |
83 | | - |
84 | | - # Mock calculator behavior |
85 | | - mock_calc = MagicMock() |
86 | | - mock_repos["factory"].get.return_value = mock_calc |
87 | | - mock_calc.get_eligibility_status.return_value = "eligible_result" |
| 68 | +def test_raises_unknown_person_error_on_repo_not_found(service, mock_repos): |
| 69 | + """Tests that NotFoundError from repo is translated to UnknownPersonError.""" |
| 70 | + mock_repos["person"].get_eligibility_data.side_effect = NotFoundError |
88 | 71 |
|
89 | | - # When |
90 | | - result = service.get_eligibility_status(nhs_number, "Y", ["FLU"], "G1", "consumer_xyz") |
| 72 | + with pytest.raises(UnknownPersonError): |
| 73 | + service.get_eligibility_status(NHSNumber("999"), "Y", [], "", "any") |
91 | 74 |
|
92 | | - # Then |
93 | | - # Verify the factory was called ONLY with camp_b |
94 | | - mock_repos["factory"].get.assert_called_once_with(person_data, [camp_b]) |
95 | | - assert result == "eligible_result" |
96 | 75 |
|
97 | | -def test_raises_no_permitted_campaigns_error(service, mock_repos): |
98 | | - """Tests the scenario where the consumer mapping exists but returns nothing.""" |
99 | | - mock_repos["person"].get_eligibility_data.return_value = {"data": "exists"} |
100 | | - mock_repos["campaign"].get_campaign_configs.return_value = [MagicMock()] |
| 76 | +@pytest.mark.parametrize( |
| 77 | + "available_campaign_ids, permitted_campaign_ids, expected_campaign_ids", |
| 78 | + [ |
| 79 | + # permitted campaigns is NOT empty → only permitted campaigns used |
| 80 | + ( |
| 81 | + ["CAMP_A", "CAMP_B"], |
| 82 | + ["CAMP_B"], |
| 83 | + ["CAMP_B"], |
| 84 | + ), |
| 85 | + # permitted campaigns is empty → no campaigns used |
| 86 | + ( |
| 87 | + ["CAMP_A", "CAMP_B"], |
| 88 | + [], |
| 89 | + [], |
| 90 | + ), |
| 91 | + # no campaigns in system → no campaigns used |
| 92 | + ( |
| 93 | + [], |
| 94 | + [], |
| 95 | + [], |
| 96 | + ), |
| 97 | + ], |
| 98 | +) |
| 99 | +def test_get_eligibility_status_campaign_filtering( |
| 100 | + service, |
| 101 | + mock_repos, |
| 102 | + available_campaign_ids, |
| 103 | + permitted_campaign_ids, |
| 104 | + expected_campaign_ids, |
| 105 | +): |
| 106 | + # Given |
| 107 | + nhs_number = NHSNumber("1234567890") |
| 108 | + person_data = {"age": 65, "vulnerable": True} |
| 109 | + mock_repos["person"].get_eligibility_data.return_value = person_data |
101 | 110 |
|
102 | | - # Consumer has no permitted IDs mapped |
103 | | - mock_repos["consumer"].get_permitted_campaign_ids.return_value = [] |
| 111 | + # Build campaign configs |
| 112 | + campaigns = [MagicMock(spec=CampaignConfig, id=CampaignID(camp_id)) for camp_id in available_campaign_ids] |
| 113 | + mock_repos["campaign"].get_campaign_configs.return_value = campaigns |
104 | 114 |
|
105 | | - with pytest.raises(NoPermittedCampaignsError): |
106 | | - service.get_eligibility_status(NHSNumber("1"), "Y", [], "", "bad_consumer") |
| 115 | + permitted_ids = [CampaignID(camp_id) for camp_id in permitted_campaign_ids] |
| 116 | + mock_repos["consumer"].get_permitted_campaign_ids.return_value = permitted_ids |
107 | 117 |
|
108 | | -def test_raises_unknown_person_error_on_repo_not_found(service, mock_repos): |
109 | | - """Tests that NotFoundError from repo is translated to UnknownPersonError.""" |
110 | | - mock_repos["person"].get_eligibility_data.side_effect = NotFoundError |
| 118 | + expected_ids = [CampaignID(camp_id) for camp_id in expected_campaign_ids] |
| 119 | + expected_campaigns = [camp for camp in campaigns if camp.id in expected_ids] |
111 | 120 |
|
112 | | - with pytest.raises(UnknownPersonError): |
113 | | - service.get_eligibility_status(NHSNumber("999"), "Y", [], "", "any") |
| 121 | + mock_calc = MagicMock() |
| 122 | + mock_repos["factory"].get.return_v |
0 commit comments