# Tests deprecated Djrill features from datetime import date, datetime import warnings from django.core import mail from django.test import TestCase from djrill import MandrillAPIError, NotSupportedByMandrillError, DjrillAdminSite from djrill.exceptions import RemovedInDjrill2 from djrill.mail import DjrillMessage from djrill.tests.mock_backend import DjrillBackendMockAPITestCase from djrill.tests.utils import reset_warning_registry class DjrillBackendDeprecationTests(DjrillBackendMockAPITestCase): def setUp(self): reset_warning_registry() super(DjrillBackendDeprecationTests, self).setUp() def test_deprecated_admin_site(self): """Djrill 2.0 drops the custom DjrillAdminSite""" self.assertWarnsMessage(DeprecationWarning, "DjrillAdminSite will be removed in Djrill 2.0", DjrillAdminSite) def test_deprecated_json_date_encoding(self): """Djrill 2.0+ avoids a blanket JSONDateUTCEncoder""" # Djrill allows dates for send_at, so shouldn't warn: message = mail.EmailMessage('Subject', 'Body', 'from@example.com', ['to@example.com']) message.send_at = datetime(2022, 10, 11, 12, 13, 14, 567) self.assertNotWarns(DeprecationWarning, message.send) # merge_vars need to be json-serializable, so should generate a warning: message = mail.EmailMessage('Subject', 'Body', 'from@example.com', ['to@example.com']) message.global_merge_vars = {'DATE': date(2022, 10, 11)} self.assertWarnsMessage(DeprecationWarning, "Djrill 2.0 will require you to explicitly convert this date to a string", message.send) # ... but should still encode the date (for now): data = self.get_api_call_data() self.assertEqual(data['message']['global_merge_vars'], [{'name': 'DATE', 'content': "2022-10-11 00:00:00"}]) def test_deprecated_djrill_message_class(self): """Djrill 0.2 deprecated DjrillMessage; 2.0 will drop it""" self.assertWarnsMessage(DeprecationWarning, "DjrillMessage will be removed in Djrill 2.0", DjrillMessage) def test_deprecated_djrill_backend_http_error(self): """Djrill 0.2 deprecated DjrillBackendHTTPError; 2.0 will drop it""" def try_import(): # noinspection PyUnresolvedReferences from djrill.mail.backends.djrill import DjrillBackendHTTPError self.assertWarnsMessage(DeprecationWarning, "DjrillBackendHTTPError will be removed in Djrill 2.0", try_import) def assertWarnsMessage(self, warning, message, callable, *args, **kwds): """Checks that `callable` issues a warning of category `warning` containing `message`""" with warnings.catch_warnings(record=True) as warned: warnings.simplefilter("always") callable(*args, **kwds) self.assertGreater(len(warned), 0, msg="No warnings issued") self.assertTrue( any(issubclass(w.category, warning) and message in str(w.message) for w in warned), msg="%r(%r) not found in %r" % (warning, message, [str(w) for w in warned])) def assertNotWarns(self, warning, callable, *args, **kwds): """Checks that `callable` does not issue any warnings of category `warning`""" with warnings.catch_warnings(record=True) as warned: warnings.simplefilter("always") callable(*args, **kwds) relevant_warnings = [w for w in warned if issubclass(w.category, warning)] self.assertEqual(len(relevant_warnings), 0, msg="Unexpected warnings %r" % [str(w) for w in relevant_warnings]) class DjrillMessageTests(TestCase): """Test the DjrillMessage class (deprecated as of Djrill v0.2.0) Maintained for compatibility with older code. """ def run(self, result=None): with warnings.catch_warnings(): # DjrillMessage deprecation is tested in test_deprecated_djrill_message_class above warnings.filterwarnings('ignore', category=RemovedInDjrill2, message="DjrillMessage will be removed in Djrill 2.0") def setUp(self): self.subject = "Djrill baby djrill." self.from_name = "Tarzan" self.from_email = "test@example" self.to = ["King Kong ", "Cheetah