diff --git a/app/service/send_notification.py b/app/service/send_notification.py index 357aa8db0..119f0a38d 100644 --- a/app/service/send_notification.py +++ b/app/service/send_notification.py @@ -7,7 +7,10 @@ from sqlalchemy.orm.exc import NoResultFound from app import create_random_identifier from app.config import QueueNames -from app.dao.notifications_dao import _update_notification_status +from app.dao.notifications_dao import ( + _update_notification_status, + get_notification_by_id, +) from app.dao.service_email_reply_to_dao import dao_get_reply_to_by_id from app.dao.service_sms_sender_dao import dao_get_service_sms_senders_by_id from app.dao.services_dao import dao_fetch_service_by_id @@ -172,9 +175,14 @@ def send_pdf_letter_notification(service_id, post_data): try: letter = utils_s3download(current_app.config['TRANSIENT_UPLOADED_LETTERS'], file_location) except S3ObjectNotFound as e: - current_app.logger.exception('Letter {}.pdf not in transient {} bucket'.format( + current_app.logger.warning('Letter {}.pdf not in transient {} bucket'.format( post_data['file_id'], current_app.config['TRANSIENT_UPLOADED_LETTERS']) ) + + # notification already exists e.g. if the user clicked send in different tabs + if get_notification_by_id(post_data['file_id']): + return {'id': str(post_data['file_id'])} + raise e # Getting the page count won't raise an error since admin has already checked the PDF is valid diff --git a/tests/app/service/test_send_pdf_letter_notification.py b/tests/app/service/test_send_pdf_letter_notification.py index 850db1f96..c507b477c 100644 --- a/tests/app/service/test_send_pdf_letter_notification.py +++ b/tests/app/service/test_send_pdf_letter_notification.py @@ -75,14 +75,41 @@ def test_send_pdf_letter_notification_raises_error_when_pdf_is_not_in_transient_ notify_user, ): user = sample_service_full_permissions.users[0] - post_data = {'filename': 'valid.pdf', 'created_by': user.id, 'file_id': fake_uuid, 'postage': 'first', - 'recipient_address': 'Bugs%20Bunny%0A123%20Main%20Street%0ALooney%20Town'} + post_data = { + 'filename': + 'valid.pdf', + 'created_by': user.id, + 'file_id': fake_uuid, + 'postage': 'first', + 'recipient_address': 'Bugs%20Bunny%0A123%20Main%20Street%0ALooney%20Town' + } mocker.patch('app.service.send_notification.utils_s3download', side_effect=S3ObjectNotFound({}, '')) with pytest.raises(S3ObjectNotFound): send_pdf_letter_notification(sample_service_full_permissions.id, post_data) +def test_send_pdf_letter_notification_does_nothing_if_notification_already_exists( + mocker, + sample_service_full_permissions, + fake_uuid, + notify_user, + sample_notification, +): + user = sample_service_full_permissions.users[0] + post_data = { + 'filename': + 'valid.pdf', + 'created_by': user.id, + 'file_id': str(sample_notification.id), + 'postage': 'first', + 'recipient_address': 'Bugs%20Bunny%0A123%20Main%20Street%0ALooney%20Town' + } + mocker.patch('app.service.send_notification.utils_s3download', side_effect=S3ObjectNotFound({}, '')) + response = send_pdf_letter_notification(sample_service_full_permissions.id, post_data) + assert response['id'] == str(sample_notification.id) + + @freeze_time("2019-08-02 11:00:00") def test_send_pdf_letter_notification_creates_notification_and_moves_letter( mocker,