diff --git a/app/celery/letters_pdf_tasks.py b/app/celery/letters_pdf_tasks.py index b78028596..74fc22fcf 100644 --- a/app/celery/letters_pdf_tasks.py +++ b/app/celery/letters_pdf_tasks.py @@ -172,15 +172,18 @@ def get_key_and_size_of_letters_to_be_sent_to_print(print_run_deadline): letter_pdfs = [] for letter in letters_awaiting_sending: - letter_file_name = get_letter_pdf_filename( - reference=letter.reference, - crown=letter.service.crown, - sending_date=letter.created_at, - postage=letter.postage - ) - - letter_head = s3.head_s3_object(current_app.config['LETTERS_PDF_BUCKET_NAME'], letter_file_name) - letter_pdfs.append({"Key": letter_file_name, "Size": letter_head['ContentLength']}) + try: + letter_file_name = get_letter_pdf_filename( + reference=letter.reference, + crown=letter.service.crown, + sending_date=letter.created_at, + postage=letter.postage + ) + letter_head = s3.head_s3_object(current_app.config['LETTERS_PDF_BUCKET_NAME'], letter_file_name) + letter_pdfs.append({"Key": letter_file_name, "Size": letter_head['ContentLength']}) + except BotoClientError as e: + current_app.logger.exception( + f"Error getting letter from bucket for notification: {letter.id} with reference: {letter.reference}", e) return letter_pdfs diff --git a/tests/app/celery/test_letters_pdf_tasks.py b/tests/app/celery/test_letters_pdf_tasks.py index ef95a17b0..2f52bbb2e 100644 --- a/tests/app/celery/test_letters_pdf_tasks.py +++ b/tests/app/celery/test_letters_pdf_tasks.py @@ -315,6 +315,48 @@ def test_get_key_and_size_of_letters_to_be_sent_to_print(notify_api, mocker, sam ] +@freeze_time('2020-02-17 18:00:00') +def test_get_key_and_size_of_letters_to_be_sent_to_print_catches_exception( + notify_api, mocker, sample_letter_template +): + create_notification( + template=sample_letter_template, + status='created', + reference='ref0', + created_at=(datetime.now() - timedelta(hours=2)) + ) + + create_notification( + template=sample_letter_template, + status='created', + reference='ref1', + created_at=(datetime.now() - timedelta(hours=3)) + ) + error_response = { + 'Error': { + 'Code': 'FileNotFound', + 'Message': 'some error message from amazon', + 'Type': 'Sender' + } + } + mock_head_s3_object = mocker.patch('app.celery.tasks.s3.head_s3_object', side_effect=[ + {'ContentLength': 2}, + ClientError(error_response, "File not found") + ]) + + results = get_key_and_size_of_letters_to_be_sent_to_print(datetime.now() - timedelta(minutes=30)) + + assert mock_head_s3_object.call_count == 2 + mock_head_s3_object.assert_has_calls( + [ + call(current_app.config['LETTERS_PDF_BUCKET_NAME'], '2020-02-17/NOTIFY.REF1.D.2.C.C.20200217150000.PDF'), + call(current_app.config['LETTERS_PDF_BUCKET_NAME'], '2020-02-17/NOTIFY.REF0.D.2.C.C.20200217160000.PDF'), + ] + ) + + assert results == [{'Key': '2020-02-17/NOTIFY.REF1.D.2.C.C.20200217150000.PDF', 'Size': 2}] + + @pytest.mark.parametrize('time_to_run_task', [ "2020-02-17 18:00:00", # after 5:30pm "2020-02-18 02:00:00", # the next day after midnight, before 5:30pm we expect the same results