datatracker/ietf/utils/management/tests.py

108 lines
4.6 KiB
Python

# Copyright The IETF Trust 2013-2020, All Rights Reserved
# -*- coding: utf-8 -*-
import mock
from django.core.management import call_command, CommandError
from django.test import override_settings
from ietf.utils.mail import outbox, empty_outbox
from ietf.utils.management.base import EmailOnFailureCommand
from ietf.utils.test_utils import TestCase
@mock.patch.object(EmailOnFailureCommand, 'handle')
class EmailOnFailureCommandTests(TestCase):
def test_calls_handle(self, handle_method):
call_command(EmailOnFailureCommand())
self.assertEqual(handle_method.call_count, 1)
def test_sends_email(self, handle_method):
handle_method.side_effect = CommandError('error during the command')
empty_outbox()
admins = (
('admin one', 'admin1@example.com'),
('admin two', 'admin2@example.com'),
)
with override_settings(ADMINS=admins, SERVER_EMAIL='server@example.com'):
call_command(EmailOnFailureCommand())
self.assertEqual(len(outbox), 1)
msg = outbox[0]
self.assertEqual(msg['to'], 'admin1@example.com, admin2@example.com',
'Outgoing email recipients did not default to settings.ADMINS')
self.assertEqual(msg['from'], 'server@example.com',
'Outgoing email sender did not default to settings.SERVER_EMAIL')
self.assertTrue(msg.is_multipart())
parts = msg.get_payload()
self.assertEqual(len(parts), 2)
self.assertIn('error during the command', parts[0].get_content())
self.assertIn('error during the command', parts[1].get_content())
self.assertIn('Traceback', parts[1].get_content())
def test_disable_email(self, handle_method):
handle_method.side_effect = CommandError('error during the command')
empty_outbox()
with self.assertRaises(CommandError):
call_command(EmailOnFailureCommand(), '--no-failure-email')
self.assertEqual(len(outbox), 0)
def test_customize_email(self, handle_method):
class _SubclassCommand(EmailOnFailureCommand):
failure_message = 'simple message with the {error} and {other}\n'
failure_recipients = 'someone@example.com'
failure_subject = 'subject of the email'
def make_failure_message(self, error, **extra):
msg = super().make_failure_message(error, other='additional info', **extra)
msg.add_attachment('attached\n')
return msg
handle_method.side_effect = CommandError('error during the command')
empty_outbox()
with override_settings(
ADMINS=('a1', 'admin@example.com'),
SERVER_EMAIL='server@example.com',
):
call_command(_SubclassCommand())
self.assertEqual(len(outbox), 1)
msg = outbox[0]
self.assertEqual(msg['to'], 'someone@example.com',
'Outgoing email recipients were not customized')
self.assertEqual(msg['from'], 'server@example.com',
'Outgoing email sender did not default to settings.SERVER_EMAIL')
self.assertEqual(msg['subject'], 'subject of the email',
'Outgoing email subject was not customized')
self.assertTrue(msg.is_multipart())
parts = msg.get_payload()
self.assertEqual(len(parts), 3, 'Attachment was not added')
self.assertEqual(
parts[0].get_content(),
'simple message with the error during the command and additional info\n',
)
self.assertIn('error during the command', parts[1].get_content())
self.assertIn('Traceback', parts[1].get_content())
self.assertEqual('attached\n', parts[2].get_content())
def test_disable_traceback(self, handle_method):
"""Traceback should not be included when disabled"""
class _SubclassCommand(EmailOnFailureCommand):
failure_email_includes_traceback = False
handle_method.side_effect = CommandError('error during the command')
empty_outbox()
with override_settings(
ADMINS=('a1', 'admin@example.com'),
SERVER_EMAIL='server@example.com',
):
call_command(_SubclassCommand())
self.assertEqual(len(outbox), 1)
msg = outbox[0]
if msg.is_multipart():
parts = msg.get_payload()
self.assertEqual(len(parts), 1, 'Traceback should not be attached')
content = parts[0].get_content()
else:
content = msg.get_payload()
self.assertNotIn('Traceback', content)