diff --git a/app/celery/letters_pdf_tasks.py b/app/celery/letters_pdf_tasks.py index 3ee3822a0..6a0a72e7f 100644 --- a/app/celery/letters_pdf_tasks.py +++ b/app/celery/letters_pdf_tasks.py @@ -15,7 +15,7 @@ from celery.exceptions import MaxRetriesExceededError from notifications_utils.statsd_decorators import statsd from notifications_utils.s3 import s3upload -from app import notify_celery +from app import encryption, notify_celery from app.aws import s3 from app.config import QueueNames, TaskNames from app.dao.notifications_dao import ( @@ -302,14 +302,12 @@ def sanitise_letter(self, filename): @notify_celery.task(name='process-sanitised-letter') -def process_sanitised_letter( - page_count, - message, - invalid_pages, - validation_status, - filename, - notification_id, -): +def process_sanitised_letter(sanitise_data): + letter_details = encryption.decrypt(sanitise_data) + + filename = letter_details['filename'] + notification_id = letter_details['notification_id'] + current_app.logger.info('Processing sanitised letter with id {}'.format(notification_id)) notification = get_notification_by_id(notification_id, _raise=True) @@ -323,7 +321,7 @@ def process_sanitised_letter( try: original_pdf_object = s3.get_s3_object(current_app.config['LETTERS_SCAN_BUCKET_NAME'], filename) - if validation_status == 'failed': + if letter_details['validation_status'] == 'failed': current_app.logger.info('Processing invalid precompiled pdf with id {} (file {})'.format( notification_id, filename)) @@ -331,16 +329,16 @@ def process_sanitised_letter( notification=notification, filename=filename, scan_pdf_object=original_pdf_object, - message=message, - invalid_pages=invalid_pages, - page_count=page_count, + message=letter_details['message'], + invalid_pages=letter_details['invalid_pages'], + page_count=letter_details['page_count'], ) return current_app.logger.info('Processing valid precompiled pdf with id {} (file {})'.format( notification_id, filename)) - billable_units = get_billable_units_for_letter_page_count(page_count) + billable_units = get_billable_units_for_letter_page_count(letter_details['page_count']) is_test_key = notification.key_type == KEY_TYPE_TEST move_sanitised_letter_to_test_or_live_pdf_bucket(filename, is_test_key, notification.created_at) diff --git a/tests/app/celery/test_letters_pdf_tasks.py b/tests/app/celery/test_letters_pdf_tasks.py index 4e6ade009..bc280dce7 100644 --- a/tests/app/celery/test_letters_pdf_tasks.py +++ b/tests/app/celery/test_letters_pdf_tasks.py @@ -13,6 +13,7 @@ from celery.exceptions import MaxRetriesExceededError, Retry from requests import RequestException from sqlalchemy.orm.exc import NoResultFound +from app import encryption from app.errors import VirusScanError from app.exceptions import NotificationTechnicalFailureException from app.celery.letters_pdf_tasks import ( @@ -773,14 +774,15 @@ def test_process_sanitised_letter_with_valid_letter( sample_letter_notification.billable_units = 1 sample_letter_notification.created_at = datetime(2018, 7, 1, 12) - process_sanitised_letter( - page_count=2, - message=None, - invalid_pages=None, - validation_status='passed', - filename=filename, - notification_id=str(sample_letter_notification.id) - ) + encrypted_data = encryption.encrypt({ + 'page_count': 2, + 'message': None, + 'invalid_pages': None, + 'validation_status': 'passed', + 'filename': filename, + 'notification_id': str(sample_letter_notification.id) + }) + process_sanitised_letter(encrypted_data) assert sample_letter_notification.status == expected_status assert sample_letter_notification.billable_units == 1 @@ -815,14 +817,15 @@ def test_process_sanitised_letter_with_invalid_letter(sample_letter_notification sample_letter_notification.billable_units = 1 sample_letter_notification.created_at = datetime(2018, 7, 1, 12) - process_sanitised_letter( - page_count=2, - message='content-outside-printable-area', - invalid_pages=[1], - validation_status='failed', - filename=filename, - notification_id=str(sample_letter_notification.id) - ) + encrypted_data = encryption.encrypt({ + 'page_count': 2, + 'message': 'content-outside-printable-area', + 'invalid_pages': [1], + 'validation_status': 'failed', + 'filename': filename, + 'notification_id': str(sample_letter_notification.id) + }) + process_sanitised_letter(encrypted_data) assert sample_letter_notification.status == NOTIFICATION_VALIDATION_FAILED assert sample_letter_notification.billable_units == 0 @@ -842,14 +845,15 @@ def test_process_sanitised_letter_when_letter_status_is_not_pending_virus_scan( mock_s3 = mocker.patch('app.celery.letters_pdf_tasks.s3') sample_letter_notification.status = NOTIFICATION_CREATED - process_sanitised_letter( - page_count=2, - message=None, - invalid_pages=None, - validation_status='passed', - filename='NOTIFY.{}'.format(sample_letter_notification.reference), - notification_id=str(sample_letter_notification.id) - ) + encrypted_data = encryption.encrypt({ + 'page_count': 2, + 'message': None, + 'invalid_pages': None, + 'validation_status': 'passed', + 'filename': 'NOTIFY.{}'.format(sample_letter_notification.reference), + 'notification_id': str(sample_letter_notification.id) + }) + process_sanitised_letter(encrypted_data) assert not mock_s3.called @@ -861,15 +865,17 @@ def test_process_sanitised_letter_puts_letter_into_tech_failure_for_boto_errors( mocker.patch('app.celery.letters_pdf_tasks.s3.get_s3_object', side_effect=ClientError({}, 'operation_name')) sample_letter_notification.status = NOTIFICATION_PENDING_VIRUS_CHECK + encrypted_data = encryption.encrypt({ + 'page_count': 2, + 'message': None, + 'invalid_pages': None, + 'validation_status': 'passed', + 'filename': 'NOTIFY.{}'.format(sample_letter_notification.reference), + 'notification_id': str(sample_letter_notification.id) + }) + with pytest.raises(NotificationTechnicalFailureException): - process_sanitised_letter( - page_count=2, - message=None, - invalid_pages=None, - validation_status='passed', - filename='NOTIFY.{}'.format(sample_letter_notification.reference), - notification_id=str(sample_letter_notification.id) - ) + process_sanitised_letter(encrypted_data) assert sample_letter_notification.status == NOTIFICATION_TECHNICAL_FAILURE