88import pytest
99from botocore .exceptions import ClientError
1010from enums .upload_status import UploadStatus
11- from freezegun import freeze_time
12-
1311from enums .virus_scan_result import VirusScanResult
12+ from freezegun import freeze_time
1413from models .staging_metadata import (
1514 METADATA_FILENAME ,
1615 BulkUploadQueueMetadata ,
3534 BulkUploadMetadataException ,
3635 InvalidFileNameException ,
3736 LGInvalidFilesException ,
38- VirusScanNoResultException , VirusScanFailedException ,
37+ VirusScanFailedException ,
3938)
4039
4140METADATA_FILE_DIR = "tests/unit/helpers/data/bulk_upload"
@@ -616,6 +615,93 @@ def test_validate_and_correct_filename_sad_path(
616615 assert result == "corrected/path/file_corrected.pdf"
617616
618617
618+ @freeze_time ("2025-02-03T10:00:00" )
619+ def test_create_expedite_sqs_metadata_builds_expected_structure (test_service ):
620+ ods_code = "A12345"
621+ key = f"expedite/{ ods_code } /1of1_1234567890_record.pdf"
622+
623+ result = test_service .create_expedite_sqs_metadata (key )
624+
625+ assert result .nhs_number == "1234567890"
626+ assert len (result .files ) == 1
627+ item = result .files [0 ]
628+ assert item .file_path == key
629+ assert item .stored_file_name == key
630+ assert item .gp_practice_code == ods_code
631+ assert item .scan_date == "2025-02-03"
632+
633+
634+ @freeze_time ("2025-02-03T10:00:00" )
635+ def test_handle_expedite_event_happy_path_sends_sqs (test_service , mocker ):
636+ ods = "A12345"
637+ key = f"expedite/{ ods } /1of1_1234567890_record.pdf"
638+ event = {"detail" : {"object" : {"key" : key }}}
639+
640+ mocker .patch .object (BulkUploadMetadataProcessorService , "enforce_virus_scanner" )
641+ mocker .patch .object (BulkUploadMetadataProcessorService , "check_file_status" )
642+ mocked_send = mocker .patch .object (
643+ BulkUploadMetadataProcessorService , "send_metadata_to_fifo_sqs"
644+ )
645+
646+ test_service .handle_expedite_event (event )
647+
648+ mocked_send .assert_called_once ()
649+ args , _ = mocked_send .call_args
650+ assert len (args ) == 1
651+ sqs_payload_list = args [0 ]
652+ sqs_payload = sqs_payload_list [0 ]
653+ assert sqs_payload .nhs_number == "1234567890"
654+ assert len (sqs_payload .files ) == 1
655+ file_item = sqs_payload .files [0 ]
656+ assert file_item .file_path == key
657+ assert file_item .stored_file_name == key
658+ assert file_item .gp_practice_code == ods
659+ assert file_item .scan_date == "2025-02-03"
660+
661+
662+ def test_handle_expedite_event_invalid_directory_raises (test_service , mocker ):
663+ mocked_send = mocker .patch .object (
664+ BulkUploadMetadataProcessorService , "send_metadata_to_fifo_sqs"
665+ )
666+ bad_key = "notexpedite/A12345/1234567890_record.pdf"
667+ event = {"detail" : {"object" : {"key" : bad_key }}}
668+
669+ with pytest .raises (BulkUploadMetadataException ) as exc :
670+ test_service .handle_expedite_event (event )
671+
672+ assert "Unexpected directory or file location" in str (exc .value )
673+ mocked_send .assert_not_called ()
674+
675+
676+ def test_handle_expedite_event_missing_key_raises (test_service , mocker ):
677+ mocked_send = mocker .patch .object (
678+ BulkUploadMetadataProcessorService , "send_metadata_to_fifo_sqs"
679+ )
680+ event = {"detail" : {}}
681+
682+ with pytest .raises (BulkUploadMetadataException ) as exc :
683+ test_service .handle_expedite_event (event )
684+
685+ assert "Failed due to missing key" in str (exc .value )
686+ mocked_send .assert_not_called ()
687+
688+
689+ def test_handle_expedite_event_rejects_non_1of1 (test_service , mocker ):
690+ mocker .patch .object (BulkUploadMetadataProcessorService , "enforce_virus_scanner" )
691+ mocker .patch .object (BulkUploadMetadataProcessorService , "check_file_status" )
692+ mocked_send = mocker .patch .object (
693+ BulkUploadMetadataProcessorService , "send_metadata_to_fifo_sqs"
694+ )
695+ key = "expedite/A12345/2of3_1234567890_record.pdf"
696+ event = {"detail" : {"object" : {"key" : key }}}
697+
698+ with pytest .raises (BulkUploadMetadataException ) as exc :
699+ test_service .handle_expedite_event (event )
700+
701+ assert "not being a 1of1" in str (exc .value )
702+ mocked_send .assert_not_called ()
703+
704+
619705@pytest .fixture
620706def mock_csv_content ():
621707 header = "FILEPATH,PAGE COUNT,GP-PRACTICE-CODE,NHS-NO,SECTION,SUB-SECTION,SCAN-DATE,SCAN-ID,USER-ID,UPLOAD"
@@ -864,10 +950,34 @@ def test_no_remapping_logic(
864950 ]
865951
866952
953+ @freeze_time ("2025-02-03T10:00:00" )
954+ def test_validate_expedite_file_happy_path_returns_expected_tuple (test_service ):
955+ ods_code = "A12345"
956+ key = f"expedite/{ ods_code } /1of1_1234567890_record.pdf"
957+
958+ nhs_number , file_name , extracted_ods , scan_date = (
959+ test_service .validate_expedite_file (key )
960+ )
961+
962+ assert nhs_number == "1234567890"
963+ assert file_name == key
964+ assert extracted_ods == ods_code
965+ assert scan_date == "2025-02-03"
966+
967+
968+ def test_validate_expedite_file_rejects_non_1of1 (test_service ):
969+ key = "expedite/A12345/2of3_1234567890_record.pdf"
970+ with pytest .raises (BulkUploadMetadataException ):
971+ test_service .validate_expedite_file (key )
972+
973+
867974def test_handle_expedite_event_calls_enforce_for_expedite_key (mocker , test_service ):
868975 encoded_key = urllib .parse .quote_plus ("expedite/folder/some file.pdf" )
869976 event = {"detail" : {"object" : {"key" : encoded_key }}}
870977
978+ mocker .patch .object (
979+ BulkUploadMetadataProcessorService , "create_expedite_sqs_metadata"
980+ )
871981 mocked_enforce = mocker .patch .object (test_service , "enforce_virus_scanner" )
872982 mocked_check_status = mocker .patch .object (test_service , "check_file_status" )
873983
@@ -1011,6 +1121,7 @@ def test_enforce_virus_scanner_re_raises_unexpected_client_error(mocker, test_se
10111121
10121122 mock_scan .assert_not_called ()
10131123
1124+
10141125def test_check_file_status_clean_does_nothing (mocker , test_service , caplog ):
10151126 file_key = "expedite/folder/file.pdf"
10161127 mock_check = mocker .patch .object (
@@ -1043,4 +1154,4 @@ def test_check_file_status_logs_issue_when_not_clean(mocker, test_service, caplo
10431154 assert any (
10441155 f"Found an issue with the file { file_key } ." in record .msg
10451156 for record in caplog .records
1046- )
1157+ )
0 commit comments