Skip to content

Commit bcd1d8d

Browse files
ELI-578 unit test fixed
1 parent b9fe63b commit bcd1d8d

File tree

8 files changed

+47
-25
lines changed

8 files changed

+47
-25
lines changed

src/eligibility_signposting_api/model/consumer_mapping.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
ConsumerId = NewType("ConsumerId", str)
88

9+
910
class ConsumerMapping(RootModel[dict[ConsumerId, list[CampaignID]]]):
1011
def get(self, key: ConsumerId, default: list[CampaignID] | None = None) -> list[CampaignID] | None:
1112
return self.root.get(key, default)

src/eligibility_signposting_api/repos/consumer_mapping_repo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from wireup import Inject, service
66

77
from eligibility_signposting_api.model.campaign_config import CampaignID
8-
from eligibility_signposting_api.model.consumer_mapping import ConsumerMapping, ConsumerId
8+
from eligibility_signposting_api.model.consumer_mapping import ConsumerId, ConsumerMapping
99

1010
BucketName = NewType("BucketName", str)
1111

src/eligibility_signposting_api/services/eligibility_services.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from eligibility_signposting_api.model import eligibility_status
66
from eligibility_signposting_api.model.campaign_config import CampaignConfig
7+
from eligibility_signposting_api.model.consumer_mapping import ConsumerId
78
from eligibility_signposting_api.repos import CampaignRepo, NotFoundError, PersonRepo
89
from eligibility_signposting_api.repos.consumer_mapping_repo import ConsumerMappingRepo
910
from eligibility_signposting_api.services.calculators import eligibility_calculator as calculator
@@ -46,18 +47,27 @@ def get_eligibility_status(
4647
if nhs_number:
4748
try:
4849
person_data = self.person_repo.get_eligibility_data(nhs_number)
49-
campaign_configs = list(self.campaign_repo.get_campaign_configs())
50-
permitted_campaign_ids = self.consumer_mapping.get_permitted_campaign_ids(consumer_id)
51-
permitted_campaign_configs: list[CampaignConfig] = [
52-
campaign for campaign in campaign_configs
53-
if campaign.id in permitted_campaign_ids
54-
]
55-
5650
except NotFoundError as e:
5751
raise UnknownPersonError from e
5852
else:
59-
calc: calculator.EligibilityCalculator = self.calculator_factory.get(person_data,
60-
permitted_campaign_configs)
53+
campaign_configs: list[CampaignConfig] = list(self.campaign_repo.get_campaign_configs())
54+
permitted_campaign_configs = self.__collect_permitted_campaign_configs(
55+
campaign_configs, ConsumerId(consumer_id)
56+
)
57+
calc: calculator.EligibilityCalculator = self.calculator_factory.get(
58+
person_data, permitted_campaign_configs
59+
)
6160
return calc.get_eligibility_status(include_actions, conditions, category)
6261

6362
raise UnknownPersonError # pragma: no cover
63+
64+
def __collect_permitted_campaign_configs(
65+
self, campaign_configs: list[CampaignConfig], consumer_id: ConsumerId
66+
) -> list[CampaignConfig]:
67+
permitted_campaign_ids = self.consumer_mapping.get_permitted_campaign_ids(ConsumerId(consumer_id))
68+
if permitted_campaign_ids:
69+
permitted_campaign_configs: list[CampaignConfig] = [
70+
campaign for campaign in campaign_configs if campaign.id in permitted_campaign_ids
71+
]
72+
return permitted_campaign_configs
73+
return []

tests/fixtures/builders/model/rule.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class IterationFactory(ModelFactory[Iteration]):
9393

9494
class RawCampaignConfigFactory(ModelFactory[CampaignConfig]):
9595
iterations = Use(IterationFactory.batch, size=2)
96-
id = "42-hi5tch-hi5kers-gu5ide-t2o-t3he-gal6axy"
96+
id = "42-hi5tch-hi5kers-gu5ide-t2o-t3he-gal6axy"
9797
start_date = Use(past_date)
9898
end_date = Use(future_date)
9999

tests/integration/conftest.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,17 @@
2121
from eligibility_signposting_api.model.campaign_config import (
2222
AvailableAction,
2323
CampaignConfig,
24+
CampaignID,
2425
EndDate,
2526
RuleCode,
2627
RuleEntry,
2728
RuleName,
2829
RuleText,
2930
RuleType,
3031
StartDate,
31-
StatusText, CampaignID,
32+
StatusText,
3233
)
33-
from eligibility_signposting_api.model.consumer_mapping import ConsumerMapping, ConsumerId
34+
from eligibility_signposting_api.model.consumer_mapping import ConsumerId, ConsumerMapping
3435
from eligibility_signposting_api.processors.hashing_service import HashingService, HashSecretName
3536
from eligibility_signposting_api.repos import SecretRepo
3637
from eligibility_signposting_api.repos.campaign_repo import BucketName
@@ -727,19 +728,21 @@ def campaign_config(s3_client: BaseClient, rules_bucket: BucketName) -> Generato
727728
yield campaign
728729
s3_client.delete_object(Bucket=rules_bucket, Key=f"{campaign.name}.json")
729730

731+
730732
@pytest.fixture(scope="class")
731733
def consumer_mapping(s3_client: BaseClient, consumer_mapping_bucket: BucketName) -> Generator[ConsumerMapping]:
732734
consumer_mapping = ConsumerMapping.model_validate({})
733-
consumer_mapping.root[ConsumerId("23-mic7heal-jor6don")] = [
734-
CampaignID("42-hi5tch-hi5kers-gu5ide-t2o-t3he-gal6axy")
735-
]
735+
consumer_mapping.root[ConsumerId("23-mic7heal-jor6don")] = [CampaignID("42-hi5tch-hi5kers-gu5ide-t2o-t3he-gal6axy")]
736736

737737
consumer_mapping_data = consumer_mapping.model_dump(by_alias=True)
738738
s3_client.put_object(
739-
Bucket=consumer_mapping_bucket, Key=f"consumer_mapping.json", Body=json.dumps(consumer_mapping_data), ContentType="application/json"
739+
Bucket=consumer_mapping_bucket,
740+
Key="consumer_mapping.json",
741+
Body=json.dumps(consumer_mapping_data),
742+
ContentType="application/json",
740743
)
741744
yield consumer_mapping
742-
s3_client.delete_object(Bucket=consumer_mapping_bucket, Key=f"consumer_mapping.json")
745+
s3_client.delete_object(Bucket=consumer_mapping_bucket, Key="consumer_mapping.json")
743746

744747

745748
@pytest.fixture

tests/integration/in_process/test_eligibility_endpoint.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ def test_nhs_number_given(
3030
secretsmanager_client: BaseClient, # noqa: ARG002
3131
):
3232
# Given
33-
headers = {"nhs-login-nhs-number": str(persisted_person),
34-
"Consumer-ID": "23-mic7heal-jor6don"}
33+
headers = {"nhs-login-nhs-number": str(persisted_person), "Consumer-ID": "23-mic7heal-jor6don"}
3534

3635
# When
3736
response = client.get(f"/patient-check/{persisted_person}", headers=headers)

tests/unit/services/test_eligibility_services.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
def test_eligibility_service_returns_from_repo():
1515
# Given
1616
person_repo = MagicMock(spec=PersonRepo)
17-
consumer_mapping_repo = MagicMock(spec=ConsumerMappingRepo)
1817
campaign_repo = MagicMock(spec=CampaignRepo)
18+
consumer_mapping_repo = MagicMock(spec=ConsumerMappingRepo)
1919
person_repo.get_eligibility = MagicMock(return_value=[])
20-
service = EligibilityService(person_repo, campaign_repo, EligibilityCalculatorFactory(), consumer_mapping_repo)
20+
service = EligibilityService(person_repo, campaign_repo, consumer_mapping_repo, EligibilityCalculatorFactory())
2121

2222
# When
2323
actual = service.get_eligibility_status(
@@ -32,9 +32,16 @@ def test_eligibility_service_for_nonexistent_nhs_number():
3232
# Given
3333
person_repo = MagicMock(spec=PersonRepo)
3434
campaign_repo = MagicMock(spec=CampaignRepo)
35+
consumer_mapping_repo = MagicMock(spec=ConsumerMappingRepo)
3536
person_repo.get_eligibility_data = MagicMock(side_effect=NotFoundError)
36-
service = EligibilityService(person_repo, campaign_repo, EligibilityCalculatorFactory())
37+
service = EligibilityService(person_repo, campaign_repo, consumer_mapping_repo, EligibilityCalculatorFactory())
3738

3839
# When
3940
with pytest.raises(UnknownPersonError):
40-
service.get_eligibility_status(NHSNumber("1234567890"), include_actions="Y", conditions=["ALL"], category="ALL")
41+
service.get_eligibility_status(
42+
NHSNumber("1234567890"),
43+
include_actions="Y",
44+
conditions=["ALL"],
45+
category="ALL",
46+
consumer_id="test_consumer_id",
47+
)

tests/unit/views/test_eligibility.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def get_eligibility_status(
6060
_include_actions: str,
6161
_conditions: list[str],
6262
_category: str,
63+
_consumer_id: str,
6364
) -> EligibilityStatus:
6465
return EligibilityStatusFactory.build()
6566

@@ -74,6 +75,7 @@ def get_eligibility_status(
7475
_include_actions: str,
7576
_conditions: list[str],
7677
_category: str,
78+
_consumer_id: str,
7779
) -> EligibilityStatus:
7880
raise UnknownPersonError
7981

@@ -100,7 +102,7 @@ def test_security_headers_present_on_successful_response(app: Flask, client: Fla
100102
get_app_container(app).override.service(AuditService, new=FakeAuditService()),
101103
):
102104
# When
103-
headers = {"nhs-login-nhs-number": "9876543210"}
105+
headers = {"nhs-login-nhs-number": "9876543210", "Consumer-Id": "test_consumer_id"}
104106
response = client.get("/patient-check/9876543210", headers=headers)
105107

106108
# Then

0 commit comments

Comments
 (0)