def test_process_sanitised_letter_retries_if_there_is_an_exception( mocker, sample_letter_notification, ): mocker.patch('app.celery.letters_pdf_tasks.update_letter_pdf_status', side_effect=Exception()) mock_celery_retry = mocker.patch( 'app.celery.letters_pdf_tasks.process_sanitised_letter.retry') 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), 'address': None }) process_sanitised_letter(encrypted_data) mock_celery_retry.assert_called_once_with(queue='retry-tasks')
def test_process_sanitised_letter_puts_letter_into_technical_failure_if_max_retries_exceeded( mocker, sample_letter_notification, ): mocker.patch('app.celery.letters_pdf_tasks.update_letter_pdf_status', side_effect=Exception()) mocker.patch('app.celery.letters_pdf_tasks.process_sanitised_letter.retry', side_effect=MaxRetriesExceededError()) 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), 'address': None }) with pytest.raises(NotificationTechnicalFailureException): process_sanitised_letter(encrypted_data) assert sample_letter_notification.status == NOTIFICATION_TECHNICAL_FAILURE
def test_process_sanitised_letter_puts_letter_into_tech_failure_for_boto_errors( sample_letter_notification, mocker, ): 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), 'address': None }) with pytest.raises(NotificationTechnicalFailureException): process_sanitised_letter(encrypted_data) assert sample_letter_notification.status == NOTIFICATION_TECHNICAL_FAILURE
def test_process_sanitised_letter_when_letter_status_is_not_pending_virus_scan( sample_letter_notification, mocker, ): mock_s3 = mocker.patch('app.celery.letters_pdf_tasks.s3') sample_letter_notification.status = NOTIFICATION_CREATED 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), 'address': None }) process_sanitised_letter(encrypted_data) assert not mock_s3.called
def test_process_sanitised_letter_with_valid_letter( sample_letter_notification, key_type, destination_bucket, expected_status, postage, destination_filename, ): # We save the letter as if it's 2nd class initially, and the task changes the filename to have the correct postage filename = 'NOTIFY.FOO.D.2.C.C.20180701120000.PDF' scan_bucket_name = current_app.config['LETTERS_SCAN_BUCKET_NAME'] template_preview_bucket_name = current_app.config['LETTER_SANITISE_BUCKET_NAME'] destination_bucket_name = current_app.config[destination_bucket] conn = boto3.resource('s3', region_name='eu-west-1') scan_bucket = conn.create_bucket( Bucket=scan_bucket_name, CreateBucketConfiguration={'LocationConstraint': 'eu-west-1'} ) template_preview_bucket = conn.create_bucket( Bucket=template_preview_bucket_name, CreateBucketConfiguration={'LocationConstraint': 'eu-west-1'} ) destination_bucket = conn.create_bucket( Bucket=destination_bucket_name, CreateBucketConfiguration={'LocationConstraint': 'eu-west-1'} ) s3 = boto3.client('s3', region_name='eu-west-1') s3.put_object(Bucket=scan_bucket_name, Key=filename, Body=b'original_pdf_content') s3.put_object(Bucket=template_preview_bucket_name, Key=filename, Body=b'sanitised_pdf_content') sample_letter_notification.status = NOTIFICATION_PENDING_VIRUS_CHECK sample_letter_notification.key_type = key_type sample_letter_notification.billable_units = 1 sample_letter_notification.created_at = datetime(2018, 7, 1, 12) sample_letter_notification.postage = postage encrypted_data = encryption.encrypt({ 'page_count': 2, 'message': None, 'invalid_pages': None, 'validation_status': 'passed', 'filename': filename, 'notification_id': str(sample_letter_notification.id), 'address': 'A. User\nThe house on the corner' }) process_sanitised_letter(encrypted_data) assert sample_letter_notification.status == expected_status assert sample_letter_notification.billable_units == 1 assert sample_letter_notification.to == 'A. User\nThe house on the corner' assert not [x for x in scan_bucket.objects.all()] assert not [x for x in template_preview_bucket.objects.all()] assert len([x for x in destination_bucket.objects.all()]) == 1 file_contents = conn.Object(destination_bucket_name, destination_filename).get()['Body'].read().decode('utf-8') assert file_contents == 'sanitised_pdf_content'
def test_process_sanitised_letter_with_invalid_letter( sample_letter_notification, key_type): filename = 'NOTIFY.{}'.format(sample_letter_notification.reference) scan_bucket_name = current_app.config['LETTERS_SCAN_BUCKET_NAME'] template_preview_bucket_name = current_app.config[ 'LETTER_SANITISE_BUCKET_NAME'] invalid_letter_bucket_name = current_app.config['INVALID_PDF_BUCKET_NAME'] conn = boto3.resource('s3', region_name='eu-west-1') scan_bucket = conn.create_bucket( Bucket=scan_bucket_name, CreateBucketConfiguration={'LocationConstraint': 'eu-west-1'}) template_preview_bucket = conn.create_bucket( Bucket=template_preview_bucket_name, CreateBucketConfiguration={'LocationConstraint': 'eu-west-1'}) invalid_letter_bucket = conn.create_bucket( Bucket=invalid_letter_bucket_name, CreateBucketConfiguration={'LocationConstraint': 'eu-west-1'}) s3 = boto3.client('s3', region_name='eu-west-1') s3.put_object(Bucket=scan_bucket_name, Key=filename, Body=b'original_pdf_content') sample_letter_notification.status = NOTIFICATION_PENDING_VIRUS_CHECK sample_letter_notification.key_type = key_type sample_letter_notification.billable_units = 1 sample_letter_notification.created_at = datetime(2018, 7, 1, 12) 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), 'address': None, }) process_sanitised_letter(encrypted_data) assert sample_letter_notification.status == NOTIFICATION_VALIDATION_FAILED assert sample_letter_notification.billable_units == 0 assert not [x for x in scan_bucket.objects.all()] assert not [x for x in template_preview_bucket.objects.all()] assert len([x for x in invalid_letter_bucket.objects.all()]) == 1 file_contents = conn.Object(invalid_letter_bucket_name, filename).get()['Body'].read().decode('utf-8') assert file_contents == 'original_pdf_content'
def test_process_sanitised_letter_sets_postage_international( sample_letter_notification, expected_postage, expected_international, address): filename = 'NOTIFY.{}'.format(sample_letter_notification.reference) scan_bucket_name = current_app.config['LETTERS_SCAN_BUCKET_NAME'] template_preview_bucket_name = current_app.config[ 'LETTER_SANITISE_BUCKET_NAME'] destination_bucket_name = current_app.config['LETTERS_PDF_BUCKET_NAME'] conn = boto3.resource('s3', region_name='eu-west-1') conn.create_bucket( Bucket=scan_bucket_name, CreateBucketConfiguration={'LocationConstraint': 'eu-west-1'}) conn.create_bucket( Bucket=template_preview_bucket_name, CreateBucketConfiguration={'LocationConstraint': 'eu-west-1'}) conn.create_bucket( Bucket=destination_bucket_name, CreateBucketConfiguration={'LocationConstraint': 'eu-west-1'}) s3 = boto3.client('s3', region_name='eu-west-1') s3.put_object(Bucket=scan_bucket_name, Key=filename, Body=b'original_pdf_content') s3.put_object(Bucket=template_preview_bucket_name, Key=filename, Body=b'sanitised_pdf_content') sample_letter_notification.status = NOTIFICATION_PENDING_VIRUS_CHECK sample_letter_notification.billable_units = 1 sample_letter_notification.created_at = datetime(2018, 7, 1, 12) encrypted_data = encryption.encrypt({ 'page_count': 2, 'message': None, 'invalid_pages': None, 'validation_status': 'passed', 'filename': filename, 'notification_id': str(sample_letter_notification.id), 'address': address }) process_sanitised_letter(encrypted_data) assert sample_letter_notification.status == 'created' assert sample_letter_notification.billable_units == 1 assert sample_letter_notification.to == address assert sample_letter_notification.postage == expected_postage assert sample_letter_notification.international == expected_international