Skip to content

Commit 187ecb4

Browse files
authored
PRMP-0000: Pre-prod fixes (#438)
1 parent 919545b commit 187ecb4

File tree

4 files changed

+79
-22
lines changed

4 files changed

+79
-22
lines changed

lambdas/enums/metadata_report.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ class MetadataReport(StrEnum):
1111
Date = "Date"
1212
Timestamp = "Timestamp"
1313
ID = "ID"
14+
15+
@staticmethod
16+
def list():
17+
return [str(field) for field in MetadataReport]

lambdas/services/bulk_upload_report_service.py

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ def report_handler(self):
2828
)
2929

3030
if report_data:
31+
logger.info(
32+
f"Bulk upload reports for {str(start_time)} to {str(end_time)}.csv"
33+
)
34+
3135
generated_at = end_time.strftime("%Y%m%d")
36+
3237
ods_reports: list[OdsReport] = self.generate_ods_reports(
3338
report_data, generated_at
3439
)
@@ -37,6 +42,9 @@ def report_handler(self):
3742
self.generate_summary_report(ods_reports, generated_at)
3843
logger.info("Successfully processed daily summary report")
3944

45+
self.generate_daily_report(report_data, start_time, end_time)
46+
logger.info("Successfully processed daily report")
47+
4048
else:
4149
logger.info("No data found, no new report file to upload")
4250

@@ -133,7 +141,7 @@ def generate_individual_ods_report(
133141

134142
file_key = f"daily_statistical_report_bulk_upload_summary_{generated_at}_uploaded_by_{uploader_ods_code}.csv"
135143

136-
self.write_items_to_csv(
144+
self.write_summary_data_to_csv(
137145
file_name=file_key,
138146
total_successful=ods_report.total_successful,
139147
total_registered_elsewhere=ods_report.total_registered_elsewhere,
@@ -181,7 +189,7 @@ def generate_summary_report(self, ods_reports: list[OdsReport], generated_at: st
181189
file_name = f"daily_statistical_report_bulk_upload_summary_{generated_at}.csv"
182190
file_key = f"daily-reports/{file_name}"
183191

184-
self.write_items_to_csv(
192+
self.write_summary_data_to_csv(
185193
file_name=file_name,
186194
total_successful=total_successful,
187195
total_registered_elsewhere=total_registered_elsewhere,
@@ -196,8 +204,30 @@ def generate_summary_report(self, ods_reports: list[OdsReport], generated_at: st
196204
file_name=f"/tmp/{file_name}",
197205
)
198206

199-
def write_items_to_csv(
200-
self,
207+
def generate_daily_report(self, report_data: list, start_time: str, end_time: str):
208+
file_name = f"Bulk upload report for {str(start_time)} to {str(end_time)}.csv"
209+
210+
self.write_items_to_csv(report_data, f"/tmp/{file_name}")
211+
212+
logger.info("Uploading daily report file to S3")
213+
self.s3_service.upload_file(
214+
s3_bucket_name=self.reports_bucket,
215+
file_key=f"daily-reports/{file_name}",
216+
file_name=f"/tmp/{file_name}",
217+
)
218+
219+
@staticmethod
220+
def write_items_to_csv(items: list, csv_file_path: str):
221+
logger.info("Writing scan results to csv file")
222+
with open(csv_file_path, "w") as output_file:
223+
field_names = MetadataReport.list()
224+
dict_writer_object = csv.DictWriter(output_file, fieldnames=field_names)
225+
dict_writer_object.writeheader()
226+
for item in items:
227+
dict_writer_object.writerow(item)
228+
229+
@staticmethod
230+
def write_summary_data_to_csv(
201231
file_name: str,
202232
total_successful: int,
203233
total_registered_elsewhere: int,

lambdas/services/pds_api_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
from botocore.exceptions import ClientError
99
from enums.pds_ssm_parameters import SSMParameter
1010
from requests.adapters import HTTPAdapter
11-
from requests.models import HTTPError
11+
from requests.exceptions import ConnectionError, HTTPError, Timeout
1212
from services.patient_search_service import PatientSearch
13-
from urllib3 import HTTPConnectionPool, Retry
13+
from urllib3 import Retry
1414
from utils.audit_logging_setup import LoggingService
1515
from utils.exceptions import PdsErrorException, PdsTooManyRequestsException
1616

@@ -67,7 +67,7 @@ def pds_request(self, nhs_number: str, retry_on_expired: bool):
6767
logger.error(str(e), {"Result": "Error when getting ssm parameters"})
6868
raise PdsErrorException("Failed to perform patient search")
6969

70-
except HTTPConnectionPool as e:
70+
except (ConnectionError, Timeout, HTTPError) as e:
7171
logger.error(str(e), {"Result": "Error when calling PDS"})
7272
raise PdsTooManyRequestsException("Failed to perform patient search")
7373

lambdas/tests/unit/services/test_bulk_upload_report_service.py

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ def mock_get_db_report_items(bulk_upload_report_service, mocker):
8787
yield mocker.patch.object(bulk_upload_report_service, "get_dynamodb_report_items")
8888

8989

90+
@pytest.fixture
91+
def mock_write_summary_data_to_csv(bulk_upload_report_service, mocker):
92+
yield mocker.patch.object(bulk_upload_report_service, "write_summary_data_to_csv")
93+
94+
9095
@pytest.fixture
9196
def mock_write_items_to_csv(bulk_upload_report_service, mocker):
9297
yield mocker.patch.object(bulk_upload_report_service, "write_items_to_csv")
@@ -244,15 +249,17 @@ def test_report_handler_no_items_returns_expected_log(
244249
def test_report_handler_with_items_uploads_summary_report_to_bucket(
245250
bulk_upload_report_service,
246251
mock_get_db_with_data,
247-
mock_write_items_to_csv,
252+
mock_write_summary_data_to_csv,
248253
mock_get_times_for_scan,
249254
caplog,
250255
):
251-
expected_message = "Successfully processed daily summary report"
256+
expected_messages = [
257+
"Successfully processed daily ODS reports",
258+
"Successfully processed daily summary report",
259+
"Successfully processed daily report",
260+
]
261+
252262
mock_date_string = MOCK_END_REPORT_TIME.strftime("%Y%m%d")
253-
mock_file_name = (
254-
f"daily_statistical_report_bulk_upload_summary_{mock_date_string}.csv"
255-
)
256263
bulk_upload_report_service.report_handler()
257264

258265
mock_get_times_for_scan.assert_called_once()
@@ -261,19 +268,35 @@ def test_report_handler_with_items_uploads_summary_report_to_bucket(
261268
int(MOCK_END_REPORT_TIME.timestamp()),
262269
)
263270

264-
mock_write_items_to_csv.assert_called()
271+
mock_write_summary_data_to_csv.assert_called()
265272

266-
bulk_upload_report_service.s3_service.upload_file.assert_called()
267-
bulk_upload_report_service.s3_service.upload_file.assert_called_with(
268-
s3_bucket_name=MOCK_STATISTICS_REPORT_BUCKET_NAME,
269-
file_key=f"daily-reports/{mock_file_name}",
270-
file_name=f"/tmp/{mock_file_name}",
271-
)
272-
assert caplog.records[-1].msg == expected_message
273+
calls = [
274+
call(
275+
s3_bucket_name=MOCK_STATISTICS_REPORT_BUCKET_NAME,
276+
file_key=f"daily_statistical_report_bulk_upload_summary_{mock_date_string}_uploaded_by_Y12345.csv",
277+
file_name=f"/tmp/daily_statistical_report_bulk_upload_summary_{mock_date_string}_uploaded_by_Y12345.csv",
278+
),
279+
call(
280+
s3_bucket_name=MOCK_STATISTICS_REPORT_BUCKET_NAME,
281+
file_key=f"daily-reports/daily_statistical_report_bulk_upload_summary_{mock_date_string}.csv",
282+
file_name=f"/tmp/daily_statistical_report_bulk_upload_summary_{mock_date_string}.csv",
283+
),
284+
call(
285+
s3_bucket_name=MOCK_STATISTICS_REPORT_BUCKET_NAME,
286+
file_key=f"daily-reports/Bulk upload report for {str(MOCK_END_REPORT_TIME)}.csv",
287+
file_name=f"/tmp/Bulk upload report for {str(MOCK_END_REPORT_TIME)}.csv",
288+
),
289+
]
290+
291+
bulk_upload_report_service.s3_service.upload_file.has_calls(calls)
292+
293+
log_message_match = set(expected_messages).issubset(caplog.messages)
294+
295+
assert log_message_match
273296

274297

275298
def test_generate_individual_ods_report_creates_ods_report(
276-
bulk_upload_report_service, mock_write_items_to_csv
299+
bulk_upload_report_service, mock_write_summary_data_to_csv
277300
):
278301
mock_ods_report_data = [MOCK_DATA_COMPLETE_UPLOAD, MOCK_DATA_FAILED_UPLOAD]
279302
expected = OdsReport(
@@ -289,7 +312,7 @@ def test_generate_individual_ods_report_creates_ods_report(
289312

290313
assert actual.__dict__ == expected.__dict__
291314
bulk_upload_report_service.s3_service.upload_file.assert_called()
292-
mock_write_items_to_csv.assert_called()
315+
mock_write_summary_data_to_csv.assert_called()
293316

294317

295318
def test_generate_individual_ods_report_writes_csv_report(bulk_upload_report_service):

0 commit comments

Comments
 (0)