Skip to content

Commit ee68dc0

Browse files
committed
[ELI-619] - formatting and removing monkey patch
1 parent 5a6cfb4 commit ee68dc0

6 files changed

Lines changed: 14 additions & 109 deletions

File tree

src/eligibility_signposting_api/config/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from typing import Literal
21
import os
2+
from typing import Literal
33

44
URL_PREFIX = "patient-check"
55
RULE_STOP_DEFAULT = False

src/eligibility_signposting_api/repos/campaign_repo.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import json
22
import logging
3-
import os
4-
import time
53
from collections.abc import Generator
64
from typing import Annotated, NewType
75

@@ -10,15 +8,16 @@
108
from cachetools import TTLCache
119
from wireup import Inject, service
1210

13-
from eligibility_signposting_api.model.campaign_config import CampaignConfig, Rules
1411
from eligibility_signposting_api.config.constants import CACHE_TTL_SECONDS
12+
from eligibility_signposting_api.model.campaign_config import CampaignConfig, Rules
1513

1614
BucketName = NewType("BucketName", str)
1715

1816
logger = logging.getLogger(__name__)
1917

2018
campaign_config_cache: TTLCache[str, list[CampaignConfig]] = TTLCache(maxsize=1, ttl=CACHE_TTL_SECONDS)
2119

20+
2221
@service
2322
class CampaignRepo:
2423
"""Repository class for Campaign Rules, which we can use to calculate a person's eligibility for vaccination.
@@ -34,7 +33,7 @@ def __init__(
3433
self.s3_client = s3_client
3534
self.bucket_name = bucket_name
3635

37-
def get_campaign_configs(self, consumer_id: str) -> Generator[CampaignConfig, None, None]:
36+
def get_campaign_configs(self, consumer_id: str) -> Generator[CampaignConfig]:
3837
bypass = "test-" in consumer_id
3938
cache_key = "all_campaigns"
4039
cached = None if bypass else campaign_config_cache.get(cache_key)
@@ -71,8 +70,6 @@ def _load_campaign_configs_from_s3(self) -> list[CampaignConfig]:
7170
Key=f"{campaign_object['Key']}",
7271
)
7372
body = response["Body"].read()
74-
campaign_configs.append(
75-
Rules.model_validate(json.loads(body)).campaign_config
76-
)
73+
campaign_configs.append(Rules.model_validate(json.loads(body)).campaign_config)
7774

7875
return campaign_configs

src/eligibility_signposting_api/services/eligibility_services.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,7 @@ def get_eligibility_status(
5050
except NotFoundError as e:
5151
raise UnknownPersonError from e
5252
else:
53-
campaign_configs: list[CampaignConfig] = list(
54-
self.campaign_repo.get_campaign_configs(consumer_id)
55-
)
53+
campaign_configs: list[CampaignConfig] = list(self.campaign_repo.get_campaign_configs(consumer_id))
5654
permitted_campaign_configs = self.__collect_permitted_campaign_configs(
5755
campaign_configs, ConsumerId(consumer_id)
5856
)

tests/integration/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def moto_server(request: pytest.FixtureRequest) -> URL:
107107
def clear_cache():
108108
campaign_config_cache.clear()
109109

110+
110111
def is_responsive(url: URL) -> bool:
111112
try:
112113
response = httpx.get(str(url))

tests/integration/lambda/test_app_running_as_lambda.py

Lines changed: 0 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -726,72 +726,3 @@ def test_status_end_point(invoke_with_mock_apigw_request):
726726
)
727727
),
728728
)
729-
730-
# Runnable if we go to tests/docker-compose.mock_aws.yml and add ENVIRONMENT=dev
731-
# shows that in a non-local environment we can bypass cache
732-
733-
# def test_cache_bypass( # noqa: PLR0913
734-
# lambda_client: BaseClient, # noqa:ARG001
735-
# persisted_person: NHSNumber,
736-
# rsv_campaign_config: CampaignConfig,
737-
# consumer_to_active_rsv_campaign_mapping: ConsumerMapping, # noqa: ARG001
738-
# consumer_id: ConsumerId,
739-
# s3_client: BaseClient,
740-
# audit_bucket: BucketName,
741-
# invoke_with_mock_apigw_request,
742-
# lambda_logs: Callable[[], list[str]],
743-
# secretsmanager_client: BaseClient, # noqa:ARG001
744-
# ):
745-
# # Given
746-
# invoke_path = f"/patient-check/{persisted_person}"
747-
# headers = {
748-
# "nhs-login-nhs-number": str(persisted_person),
749-
# "x_request_id": "x_request_id",
750-
# "x_correlation_id": "x_correlation_id",
751-
# "nhsd_end_user_organisation_ods": "nhsd_end_user_organisation_ods",
752-
# "nhsd-application-id": "nhsd-application-id",
753-
# "NHSE-Product-ID": consumer_id,
754-
# }
755-
# params = {"includeActions": "Y"}
756-
#
757-
# objects = s3_client.list_objects_v2(Bucket="test-rules-bucket").get("Contents", [])
758-
# assert_that(objects, is_not(equal_to([])))
759-
# config_key = objects[0]["Key"]
760-
# original = s3_client.get_object(Bucket="test-rules-bucket", Key=config_key)
761-
# original_payload = json.loads(original["Body"].read())
762-
# print(original_payload)
763-
#
764-
# # When
765-
# response = invoke_with_mock_apigw_request(path=invoke_path, headers=headers, params=params)
766-
#
767-
# # Then
768-
# assert_that(
769-
# response,
770-
# is_response().with_status_code(HTTPStatus.OK).and_body(is_json_that(has_key("processedSuggestions"))),
771-
# )
772-
#
773-
# original_payload["CampaignConfig"]["Target"] = "RSV_CHANGED_FOR_BYPASS_TEST"
774-
# s3_client.put_object(
775-
# Bucket="test-rules-bucket",
776-
# Key=config_key,
777-
# Body=json.dumps(original_payload),
778-
# ContentType="application/json",
779-
# )
780-
#
781-
# # Second request without bypass header should still use cached config
782-
# response_2 = invoke_with_mock_apigw_request(invoke_path, headers)
783-
# assert_that(
784-
# response_2,
785-
# is_response().with_status_code(HTTPStatus.OK).and_body(is_json_that(has_key("processedSuggestions"))),
786-
# )
787-
#
788-
# # Third request with bypass header should re-read S3 and reflect the change
789-
# bypass_headers = {
790-
# **headers,
791-
# "X-Bypass-Campaign-Config-Cache": "true",
792-
# }
793-
# response_3 = invoke_with_mock_apigw_request(invoke_path, bypass_headers)
794-
# assert_that(
795-
# response_3,
796-
# is_response().with_status_code(500),
797-
# )

tests/unit/repos/test_campaign_repo.py

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

55
import pytest
66

7-
from eligibility_signposting_api.repos.campaign_repo import CampaignRepo, BucketName, campaign_config_cache
7+
from eligibility_signposting_api.repos.campaign_repo import BucketName, CampaignRepo, campaign_config_cache
88
from tests.fixtures.builders.model.rule import CampaignConfigFactory
99

1010

@@ -31,14 +31,10 @@ def repo(self, mock_s3_client):
3131
@pytest.fixture
3232
def rules_payload(self):
3333
campaign_config = CampaignConfigFactory.build()
34-
return {
35-
"campaign_config": campaign_config.model_dump(mode="json")
36-
}
34+
return {"campaign_config": campaign_config.model_dump(mode="json")}
3735

3836
def test_get_campaign_configs_loads_from_s3(self, repo, mock_s3_client, rules_payload):
39-
mock_s3_client.list_objects.return_value = {
40-
"Contents": [{"Key": "rsv.json"}]
41-
}
37+
mock_s3_client.list_objects.return_value = {"Contents": [{"Key": "rsv.json"}]}
4238
mock_s3_client.get_object.return_value = make_s3_body(rules_payload)
4339

4440
result = list(repo.get_campaign_configs("consumer_id"))
@@ -56,20 +52,11 @@ def test_get_campaign_configs_uses_cache_within_ttl(
5652
self,
5753
repo,
5854
mock_s3_client,
59-
monkeypatch,
6055
):
61-
repo._cache_ttl_seconds = 60
62-
6356
first_config = CampaignConfigFactory.build(version=1)
6457

65-
mock_s3_client.list_objects.return_value = {
66-
"Contents": [{"Key": "rsv.json"}]
67-
}
68-
mock_s3_client.get_object.return_value = make_s3_body(
69-
{"campaign_config": first_config.model_dump(mode="json")}
70-
)
71-
72-
monkeypatch.setattr("time.time", lambda: 1000.0)
58+
mock_s3_client.list_objects.return_value = {"Contents": [{"Key": "rsv.json"}]}
59+
mock_s3_client.get_object.return_value = make_s3_body({"campaign_config": first_config.model_dump(mode="json")})
7360

7461
first = list(repo.get_campaign_configs("consumer_id"))
7562
second = list(repo.get_campaign_configs("consumer_id"))
@@ -83,28 +70,19 @@ def test_get_campaign_configs_refreshes_after_ttl_expiry(
8370
self,
8471
repo,
8572
mock_s3_client,
86-
monkeypatch,
8773
):
88-
repo._cache_ttl_seconds = 60
89-
9074
first_config = CampaignConfigFactory.build(version=1)
9175
second_config = CampaignConfigFactory.build(version=2)
9276

93-
mock_s3_client.list_objects.return_value = {
94-
"Contents": [{"Key": "rsv.json"}]
95-
}
77+
mock_s3_client.list_objects.return_value = {"Contents": [{"Key": "rsv.json"}]}
9678
mock_s3_client.get_object.side_effect = [
9779
make_s3_body({"campaign_config": first_config.model_dump(mode="json")}),
9880
make_s3_body({"campaign_config": second_config.model_dump(mode="json")}),
9981
]
10082

101-
current_time = {"value": 1000.0}
102-
monkeypatch.setattr("time.time", lambda: current_time["value"])
103-
10483
first = list(repo.get_campaign_configs("consumer_id"))
105-
current_time["value"] = 1030.0
10684
second = list(repo.get_campaign_configs("consumer_id"))
107-
current_time["value"] = 1061.0
85+
campaign_config_cache.clear()
10886
third = list(repo.get_campaign_configs("test-consumer-1"))
10987

11088
assert first[0].version == 1

0 commit comments

Comments
 (0)