Skip to content

Commit deb4ef8

Browse files
add file type check for review docs
1 parent 2200d34 commit deb4ef8

File tree

4 files changed

+68
-5
lines changed

4 files changed

+68
-5
lines changed

lambdas/enums/lambda_error.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,10 @@ def create_error_body(self, params: Optional[dict] = None, **kwargs) -> str:
517517
"err_code": "DRV_4005",
518518
"message": "The NHS number provided is invalid",
519519
}
520+
DocumentReviewUnsupportedFileType = {
521+
"err_code": "DRV_4006",
522+
"message": "The file type provided is not supported",
523+
}
520524

521525
"""
522526
Errors for get ods report lambda
@@ -690,10 +694,7 @@ def create_error_body(self, params: Optional[dict] = None, **kwargs) -> str:
690694
"message": "Invalid request",
691695
}
692696

693-
DocumentReviewUploadForbidden = {
694-
"err_code": "UDR_4031",
695-
"message": "Forbidden"
696-
}
697+
DocumentReviewUploadForbidden = {"err_code": "UDR_4031", "message": "Forbidden"}
697698

698699
DocumentReviewPresignedFailure = {
699700
"err_code": "UDR_5003",

lambdas/services/post_document_review_service.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from enums.document_review_status import DocumentReviewReason, DocumentReviewStatus
77
from enums.lambda_error import LambdaError
88
from enums.patient_ods_inactive_status import PatientOdsInactiveStatus
9+
from enums.upload_forbidden_file_extensions import is_file_type_allowed
910
from models.document_review import (
1011
DocumentReviewFileDetails,
1112
DocumentReviewUploadEvent,
@@ -14,8 +15,10 @@
1415
from pydantic import ValidationError
1516
from services.base.s3_service import S3Service
1617
from services.document_upload_review_service import DocumentUploadReviewService
18+
from utils import upload_file_configs
1719
from utils.audit_logging_setup import LoggingService
1820
from utils.exceptions import (
21+
ConfigNotFoundException,
1922
DocumentReviewException,
2023
OdsErrorException,
2124
PatientNotFoundException,
@@ -51,6 +54,8 @@ def process_event(self, event: DocumentReviewUploadEvent) -> dict:
5154
403, LambdaError.DocumentReviewUploadForbidden
5255
)
5356

57+
self.validate_document_file_type(event)
58+
5459
document_review_reference = self.create_review_reference_from_event(
5560
event=event, author=author, patient_details=patient_details
5661
)
@@ -84,6 +89,27 @@ def process_event(self, event: DocumentReviewUploadEvent) -> dict:
8489
except ClientError:
8590
raise DocumentReviewLambdaException(500, LambdaError.DocumentReviewDB)
8691

92+
def validate_document_file_type(self, event: DocumentReviewUploadEvent) -> None:
93+
snomed_code = event.snomed_code.code
94+
accepted_file_types = self.get_accepted_file_types(
95+
snomed_code, upload_file_configs
96+
)
97+
98+
if not is_file_type_allowed(event.documents[0], accepted_file_types):
99+
logger.info("File type is not supported.")
100+
raise DocumentReviewLambdaException(
101+
400, LambdaError.DocumentReviewUnsupportedFileType
102+
)
103+
104+
def get_accepted_file_types(self, snomed_code, upload_file_configs):
105+
try:
106+
return upload_file_configs.get_config_by_snomed_code(
107+
snomed_code
108+
).accepted_file_types
109+
except ConfigNotFoundException:
110+
logger.error(f"Unable to find config for snomed code: {snomed_code}")
111+
raise DocumentReviewLambdaException(400, LambdaError.DocRefInvalidType)
112+
87113
def create_response(
88114
self, document_review_reference: DocumentUploadReviewReference
89115
) -> dict:

lambdas/tests/unit/services/test_post_document_review_service.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,3 +294,39 @@ def test_create_response(mock_service):
294294
)
295295
)
296296
assert actual == expected
297+
298+
299+
@freeze_time("2024-01-01 12:00:00")
300+
def test_validate_file_type_with_invalid_file_type(mock_extract_ods, mock_service):
301+
mock_extract_ods.return_value = TEST_CURRENT_GP_ODS
302+
mock_service.pds_service.fetch_patient_details.return_value = (
303+
EXPECTED_PARSED_PATIENT_BASE_CASE
304+
)
305+
invalid_event = deepcopy(VALID_EVENT)
306+
invalid_event.documents = ["testFile.exe"]
307+
308+
with pytest.raises(DocumentReviewLambdaException) as e:
309+
mock_service.process_event(invalid_event)
310+
311+
assert e.value.status_code == 400
312+
assert e.value.err_code == "DRV_4006"
313+
314+
mock_service.review_document_service.create_dynamo_entry.assert_not_called()
315+
316+
317+
@freeze_time("2024-01-01 12:00:00")
318+
def test_validate_file_type_with_invalid_snomed_code(mock_extract_ods, mock_service):
319+
mock_extract_ods.return_value = TEST_CURRENT_GP_ODS
320+
mock_service.pds_service.fetch_patient_details.return_value = (
321+
EXPECTED_PARSED_PATIENT_BASE_CASE
322+
)
323+
invalid_event = deepcopy(VALID_EVENT)
324+
invalid_event.snomed_code.code = "INVALID_SNOMED_CODE"
325+
326+
with pytest.raises(DocumentReviewLambdaException) as e:
327+
mock_service.process_event(invalid_event)
328+
329+
assert e.value.status_code == 400
330+
assert e.value.err_code == "DR_4007"
331+
332+
mock_service.review_document_service.create_dynamo_entry.assert_not_called()

lambdas/tests/unit/services/test_post_fhir_document_reference_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ def test_extract_author_from_fhir(
549549
],
550550
)
551551
def test_extract_author_from_fhir_raises_error(
552-
mock_post_fhir_doc_ref_service, mocker, fhir_author
552+
mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker, fhir_author
553553
):
554554
"""Test _extract_author_from_fhir method with malformed json returns Validation errors."""
555555
fhir_doc = mocker.MagicMock(spec=FhirDocumentReference)

0 commit comments

Comments
 (0)