Example #1
0
def test_create_pdf_for_templated_letter_boto_error(
        mocker, client, data_for_create_pdf_for_templated_letter_task):
    # handle boto error while uploading file
    mocker.patch('app.celery.tasks.s3upload',
                 side_effect=BotoClientError({}, 'operation-name'))
    mock_celery = mocker.patch('app.celery.tasks.notify_celery.send_task')
    mock_logger = mocker.patch('app.celery.tasks.current_app.logger.info')
    mock_logger_exception = mocker.patch(
        'app.celery.tasks.current_app.logger.exception')

    encrypted_data = current_app.encryption_client.encrypt(
        data_for_create_pdf_for_templated_letter_task)

    create_pdf_for_templated_letter(encrypted_data)

    assert not mock_celery.called
    mock_logger.assert_called_once_with(
        "Creating a pdf for notification with id abc-123")
    mock_logger_exception.assert_called_once_with(
        "Error uploading MY_LETTER.PDF to pdf bucket for notification abc-123")
def test_create_pdf_for_templated_letter_html_error(
        mocker, data_for_create_pdf_for_templated_letter_task, client):
    encrypted_data = current_app.encryption_client.encrypt(
        data_for_create_pdf_for_templated_letter_task)

    weasyprint_html = mocker.Mock()
    expected_exc = WeasyprintError()
    weasyprint_html.write_pdf.side_effect = expected_exc

    mocker.patch('app.celery.tasks.HTML',
                 mocker.Mock(return_value=weasyprint_html))
    mock_retry = mocker.patch(
        'app.celery.tasks.create_pdf_for_templated_letter.retry',
        side_effect=Retry)

    with pytest.raises(Retry):
        create_pdf_for_templated_letter(encrypted_data)

    mock_retry.assert_called_once_with(exc=expected_exc,
                                       queue=QueueNames.SANITISE_LETTERS)
Example #3
0
def test_create_pdf_for_templated_letter_happy_path(
        mocker, client, data_for_create_pdf_for_templated_letter_task,
        key_type, bucket_name, logo_filename):
    # create a pdf for templated letter using data from API, upload the pdf to the final S3 bucket,
    # and send data back to API so that it can update notification status and billable units.
    mock_upload = mocker.patch('app.celery.tasks.s3upload')
    mock_celery = mocker.patch('app.celery.tasks.notify_celery.send_task')
    mock_logger = mocker.patch('app.celery.tasks.current_app.logger.info')
    mock_logger_exception = mocker.patch(
        'app.celery.tasks.current_app.logger.exception')

    data_for_create_pdf_for_templated_letter_task[
        "logo_filename"] = logo_filename
    data_for_create_pdf_for_templated_letter_task["key_type"] = key_type

    encrypted_data = current_app.encryption_client.encrypt(
        data_for_create_pdf_for_templated_letter_task)

    create_pdf_for_templated_letter(encrypted_data)

    mock_upload.assert_called_once_with(
        filedata=mocker.ANY,
        region=current_app.config['AWS_REGION'],
        bucket_name=current_app.config[bucket_name],
        file_location='MY_LETTER.PDF',
    )

    mock_celery.assert_called_once_with(
        kwargs={
            "notification_id": 'abc-123',
            "page_count": 1
        },
        name='update-billable-units-for-letter',
        queue='letter-tasks')
    mock_logger.assert_has_calls([
        call("Creating a pdf for notification with id abc-123"),
        call(
            f"Uploaded letters PDF MY_LETTER.PDF to {current_app.config[bucket_name]} for notification id abc-123"
        )
    ])
    mock_logger_exception.assert_not_called()