Skip to content

Commit 8f4e28a

Browse files
ELI-578 Integration test to check if consumer has campaign mappings
1 parent aefbe33 commit 8f4e28a

File tree

4 files changed

+51
-21
lines changed

4 files changed

+51
-21
lines changed

src/eligibility_signposting_api/common/api_error_response.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,11 @@ def log_and_generate_response(
143143
fhir_error_code=FHIRSpineErrorCode.ACCESS_DENIED,
144144
fhir_display_message="Access has been denied to process this request.",
145145
)
146+
147+
CONSUMER_HAS_NO_CAMPAIGN_MAPPING = APIErrorResponse(
148+
status_code=HTTPStatus.FORBIDDEN,
149+
fhir_issue_code=FHIRIssueCode.FORBIDDEN,
150+
fhir_issue_severity=FHIRIssueSeverity.ERROR,
151+
fhir_error_code=FHIRSpineErrorCode.ACCESS_DENIED,
152+
fhir_display_message="Access has been denied to process this request.",
153+
)

src/eligibility_signposting_api/services/eligibility_services.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ class InvalidQueryParamError(Exception):
2020
pass
2121

2222

23+
class NoPermittedCampaignsError(Exception):
24+
pass
25+
26+
2327
@service
2428
class EligibilityService:
2529
def __init__(
@@ -70,4 +74,4 @@ def __collect_permitted_campaign_configs(
7074
campaign for campaign in campaign_configs if campaign.id in permitted_campaign_ids
7175
]
7276
return permitted_campaign_configs
73-
return []
77+
raise NoPermittedCampaignsError

src/eligibility_signposting_api/views/eligibility.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@
1111

1212
from eligibility_signposting_api.audit.audit_context import AuditContext
1313
from eligibility_signposting_api.audit.audit_service import AuditService
14-
from eligibility_signposting_api.common.api_error_response import NHS_NUMBER_NOT_FOUND_ERROR
14+
from eligibility_signposting_api.common.api_error_response import (
15+
CONSUMER_HAS_NO_CAMPAIGN_MAPPING,
16+
NHS_NUMBER_NOT_FOUND_ERROR,
17+
)
1518
from eligibility_signposting_api.common.request_validator import validate_request_params
1619
from eligibility_signposting_api.config.constants import CONSUMER_ID, URL_PREFIX
1720
from eligibility_signposting_api.model.consumer_mapping import ConsumerId
1821
from eligibility_signposting_api.model.eligibility_status import Condition, EligibilityStatus, NHSNumber, Status
1922
from eligibility_signposting_api.services import EligibilityService, UnknownPersonError
23+
from eligibility_signposting_api.services.eligibility_services import NoPermittedCampaignsError
2024
from eligibility_signposting_api.views.response_model import eligibility_response
2125
from eligibility_signposting_api.views.response_model.eligibility_response import ProcessedSuggestion
2226

@@ -48,9 +52,11 @@ def check_eligibility(
4852
nhs_number: NHSNumber, eligibility_service: Injected[EligibilityService], audit_service: Injected[AuditService]
4953
) -> ResponseReturnValue:
5054
logger.info("checking nhs_number %r in %r", nhs_number, eligibility_service, extra={"nhs_number": nhs_number})
55+
56+
query_params = _get_or_default_query_params()
57+
consumer_id = _get_consumer_id_from_headers()
58+
5159
try:
52-
query_params = _get_or_default_query_params()
53-
consumer_id = _get_consumer_id_from_headers()
5460
eligibility_status = eligibility_service.get_eligibility_status(
5561
nhs_number,
5662
query_params["includeActions"],
@@ -60,6 +66,8 @@ def check_eligibility(
6066
)
6167
except UnknownPersonError:
6268
return handle_unknown_person_error(nhs_number)
69+
except NoPermittedCampaignsError:
70+
return handle_no_permitted_campaigns_for_the_consumer_error(consumer_id)
6371
else:
6472
response: eligibility_response.EligibilityResponse = build_eligibility_response(eligibility_status)
6573
AuditContext.write_to_firehose(audit_service)
@@ -112,6 +120,13 @@ def handle_unknown_person_error(nhs_number: NHSNumber) -> ResponseReturnValue:
112120
)
113121

114122

123+
def handle_no_permitted_campaigns_for_the_consumer_error(consumer_id: ConsumerId) -> ResponseReturnValue:
124+
diagnostics = f"Consumer ID '{consumer_id}' was not recognised by the Eligibility Signposting API"
125+
return CONSUMER_HAS_NO_CAMPAIGN_MAPPING.log_and_generate_response(
126+
log_message=diagnostics, diagnostics=diagnostics, location_param="id"
127+
)
128+
129+
115130
def build_eligibility_response(eligibility_status: EligibilityStatus) -> eligibility_response.EligibilityResponse:
116131
"""Return an object representing the API response we are going to send, given an evaluation of the person's
117132
eligibility."""

tests/integration/in_process/test_eligibility_endpoint.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -324,23 +324,6 @@ def test_actionable_with_and_rule(
324324
),
325325
)
326326

327-
def test_empty_response_when_no_campaign_mapped_to_consumer(
328-
self,
329-
client: FlaskClient,
330-
persisted_person: NHSNumber,
331-
campaign_config: CampaignConfig, # noqa: ARG002
332-
consumer_mapping: ConsumerMapping, # noqa: ARG002
333-
):
334-
# Given
335-
consumer_id_not_having_mapping = "23-jo4hn-ce4na"
336-
headers = {"nhs-login-nhs-number": str(persisted_person), CONSUMER_ID: consumer_id_not_having_mapping}
337-
338-
# When
339-
response = client.get(f"/patient-check/{persisted_person}?includeActions=Y", headers=headers)
340-
341-
# Then
342-
assert_that(response, is_response().with_status_code(HTTPStatus.NOT_FOUND))
343-
344327

345328
class TestVirtualCohortResponse:
346329
def test_not_eligible_by_rule_when_only_virtual_cohort_is_present(
@@ -840,3 +823,23 @@ def test_not_actionable_and_check_response_when_rule_mapper_is_given(
840823
)
841824
),
842825
)
826+
827+
828+
class TestEligibilityResponseWhenConsumerHasNoMapping:
829+
def test_empty_response_when_no_campaign_mapped_for_the_consumer(
830+
self,
831+
client: FlaskClient,
832+
persisted_person: NHSNumber,
833+
campaign_config: CampaignConfig, # noqa: ARG002
834+
consumer_mapping: ConsumerMapping, # noqa: ARG002
835+
secretsmanager_client: BaseClient, # noqa: ARG002
836+
):
837+
# Given
838+
consumer_id_not_having_mapping = "23-jo4hn-ce4na"
839+
headers = {"nhs-login-nhs-number": str(persisted_person), CONSUMER_ID: consumer_id_not_having_mapping}
840+
841+
# When
842+
response = client.get(f"/patient-check/{persisted_person}?includeActions=Y", headers=headers)
843+
844+
# Then
845+
assert_that(response, is_response().with_status_code(HTTPStatus.FORBIDDEN))

0 commit comments

Comments
 (0)