def test_get_pdf_for_templated_letter_happy_path(mocker, sample_letter_notification, branding_name, logo_filename): if branding_name: letter_branding = create_letter_branding(name=branding_name, filename=logo_filename) sample_letter_notification.service.letter_branding = letter_branding mock_celery = mocker.patch('app.celery.letters_pdf_tasks.notify_celery.send_task') mocker.patch('app.celery.letters_pdf_tasks.get_letter_pdf_filename', return_value='LETTER.PDF') get_pdf_for_templated_letter(sample_letter_notification.id) letter_data = { 'letter_contact_block': sample_letter_notification.reply_to_text, 'template': { "subject": sample_letter_notification.template.subject, "content": sample_letter_notification.template.content, "template_type": sample_letter_notification.template.template_type }, 'values': sample_letter_notification.personalisation, 'logo_filename': logo_filename, 'letter_filename': 'LETTER.PDF', "notification_id": str(sample_letter_notification.id), 'key_type': sample_letter_notification.key_type } encrypted_data = encryption.encrypt(letter_data) mock_celery.assert_called_once_with( name=TaskNames.CREATE_PDF_FOR_TEMPLATED_LETTER, args=(encrypted_data,), queue=QueueNames.SANITISE_LETTERS )
def test_get_pdf_for_templated_letter_retries_upon_error(mocker, sample_letter_notification): mock_celery = mocker.patch('app.celery.letters_pdf_tasks.notify_celery.send_task', side_effect=Exception()) mocker.patch('app.celery.letters_pdf_tasks.generate_letter_pdf_filename', return_value='LETTER.PDF') mock_retry = mocker.patch('app.celery.letters_pdf_tasks.get_pdf_for_templated_letter.retry') mock_logger = mocker.patch('app.celery.tasks.current_app.logger.exception') get_pdf_for_templated_letter(sample_letter_notification.id) assert mock_celery.called assert mock_retry.called mock_logger.assert_called_once_with( f"RETRY: calling create-letter-pdf task for notification {sample_letter_notification.id} failed" )
def test_get_pdf_for_templated_letter_sets_technical_failure_max_retries(mocker, sample_letter_notification): mock_celery = mocker.patch('app.celery.letters_pdf_tasks.notify_celery.send_task', side_effect=Exception()) mocker.patch('app.celery.letters_pdf_tasks.generate_letter_pdf_filename', return_value='LETTER.PDF') mock_retry = mocker.patch( 'app.celery.letters_pdf_tasks.get_pdf_for_templated_letter.retry', side_effect=MaxRetriesExceededError) mock_update_noti = mocker.patch('app.celery.letters_pdf_tasks.update_notification_status_by_id') with pytest.raises(NotificationTechnicalFailureException) as e: get_pdf_for_templated_letter(sample_letter_notification.id) assert e.value.args[0] == f"RETRY FAILED: Max retries reached. " \ f"The task create-letter-pdf failed for notification id {sample_letter_notification.id}. " \ f"Notification has been updated to technical-failure" assert mock_celery.called assert mock_retry.called mock_update_noti.assert_called_once_with(sample_letter_notification.id, 'technical-failure')
def test_get_pdf_for_templated_letter_non_existent_notification( notify_db_session, mocker, fake_uuid): with pytest.raises(expected_exception=NoResultFound): get_pdf_for_templated_letter(fake_uuid)