Ejemplo n.º 1
0
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')
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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