From 322de9604d928cfcc7ab6194a7c45641b52c8719 Mon Sep 17 00:00:00 2001 From: bmedx Date: Fri, 3 Mar 2017 15:42:11 -0500 Subject: [PATCH] Address PR feedback --- cms/djangoapps/cms_user_tasks/signals.py | 8 ++++-- cms/djangoapps/cms_user_tasks/tests.py | 31 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/cms/djangoapps/cms_user_tasks/signals.py b/cms/djangoapps/cms_user_tasks/signals.py index 7fc8c6f629..b687088f9f 100644 --- a/cms/djangoapps/cms_user_tasks/signals.py +++ b/cms/djangoapps/cms_user_tasks/signals.py @@ -1,8 +1,10 @@ """ Receivers of signals sent from django-user-tasks """ +from __future__ import absolute_import, print_function, unicode_literals + import logging -from urlparse import urljoin +from six.moves.urllib.parse import urljoin from django.core.urlresolvers import reverse from django.dispatch import receiver @@ -11,6 +13,8 @@ from user_tasks.signals import user_task_stopped from .tasks import send_task_complete_email +LOGGER = logging.getLogger(__name__) + @receiver(user_task_stopped, dispatch_uid="cms_user_task_stopped") def user_task_stopped_handler(sender, **kwargs): # pylint: disable=unused-argument @@ -47,4 +51,4 @@ def user_task_stopped_handler(sender, **kwargs): # pylint: disable=unused-argum # Need to str state_text here because it is a proxy object and won't serialize correctly send_task_complete_email.delay(status.name.lower(), str(status.state_text), status.user.email, detail_url) except Exception: # pylint: disable=broad-except - logging.exception("Unable to queue send_task_complete_email") + LOGGER.exception("Unable to queue send_task_complete_email") diff --git a/cms/djangoapps/cms_user_tasks/tests.py b/cms/djangoapps/cms_user_tasks/tests.py index 3d5c9888bb..7efd4c6f7f 100644 --- a/cms/djangoapps/cms_user_tasks/tests.py +++ b/cms/djangoapps/cms_user_tasks/tests.py @@ -4,7 +4,9 @@ Unit tests for integration of the django-user-tasks app and its REST API. from __future__ import absolute_import, print_function, unicode_literals +import sys from uuid import uuid4 +import logging import mock from boto.exception import NoAuthHandlerFound @@ -21,6 +23,24 @@ from user_tasks.serializers import ArtifactSerializer, StatusSerializer from .signals import user_task_stopped +# Mock logging handler to check for expected logs. +class MockLoggingHandler(logging.Handler): + def __init__(self, *args, **kwargs): + self.reset() + logging.Handler.__init__(self, *args, **kwargs) + + def emit(self, record): + self.messages[record.levelname.lower()].append(record.getMessage()) + + def reset(self): + self.messages = { + 'debug': [], + 'info': [], + 'warning': [], + 'error': [], + 'critical': [], + } + # Helper functions for stuff that pylint complains about without disable comments def _context(response): @@ -199,3 +219,14 @@ class TestUserTaskStopped(APITestCase): with mock.patch('cms_user_tasks.tasks.send_task_complete_email.retry') as mock_retry: user_task_stopped.send(sender=UserTaskStatus, status=self.status) self.assertTrue(mock_retry.called) + + def test_queue_email_failure(self): + logger = logging.getLogger("cms_user_tasks.signals") + hdlr = MockLoggingHandler(level="DEBUG") + logger.addHandler(hdlr) + + with mock.patch('cms_user_tasks.tasks.send_task_complete_email.delay') as mock_delay: + mock_delay.side_effect = NoAuthHandlerFound() + user_task_stopped.send(sender=UserTaskStatus, status=self.status) + self.assertTrue(mock_delay.called) + self.assertEqual(hdlr.messages['error'][0], u'Unable to queue send_task_complete_email')