From 3106c41fd5a32eda8ea962f6e7e6338505e2190b Mon Sep 17 00:00:00 2001 From: Vitor Rangel Date: Mon, 25 Sep 2023 18:43:07 -0300 Subject: [PATCH] Fix storage mocks --- tests/backends/test_vanilla_django_backend.py | 66 ++++++++++--------- tests/generic_views/test_views.py | 10 +-- tests/test_utils.py | 8 +-- tests/utils.py | 2 +- 4 files changed, 45 insertions(+), 41 deletions(-) diff --git a/tests/backends/test_vanilla_django_backend.py b/tests/backends/test_vanilla_django_backend.py index 8c09411..bc4e711 100644 --- a/tests/backends/test_vanilla_django_backend.py +++ b/tests/backends/test_vanilla_django_backend.py @@ -5,7 +5,14 @@ from django.test import TestCase, override_settings from django.core.mail import EmailMessage, EmailMultiAlternatives -from django.core.files.storage import default_storage +try: + from django.core.files.storage import get_storage_class +except ImportError: + from django.core.files.storage import storages + + def get_storage_class(s): + storages[s] + from django.template import TemplateDoesNotExist from django.core import mail @@ -69,17 +76,11 @@ class TemplateBackendTestCase(MockedNetworkTestCaseMixin, template_backend_klass = TemplateBackend def setUp(self): - self.storage_mock = Mock(wraps=default_storage)() - self.storage_mock.save = Mock() self.backend = self.template_backend_klass() self.context = {'username': 'vintasoftware', 'joindate': date(2016, 8, 22), 'full_name': 'Foo Bar'} - def patch_storage(self): - return patch('django.core.files.storage.default_storage._wrapped', - self.storage_mock) - def test_inexistent_base_email(self): try: self.backend._render_email('inexistent_base.email', {}) @@ -168,22 +169,23 @@ def test_get_email_message_with_create_link(self, mocked): uuid=uuid) self.assertEqual(saved_email.content, HTML_RESULT) + @patch('django.core.files.storage.FileSystemStorage.save') + @patch('django.core.files.storage.FileSystemStorage.url') @patch.object( template_backend_klass, '_render_email', return_value={'html': HTML_RESULT, 'plain': PLAIN_RESULT, 'subject': SUBJECT_RESULT} ) - def test_get_email_message_with_inline_image(self, mocked): - self.storage_mock.save = Mock(return_value='saved_url') - with self.patch_storage(): - self.backend.get_email_message( - 'foo.email', {'an_image': InlineImage('file.png', b'foo', - subtype='png')}, - from_email='from@example.com', cc=['cc@example.com'], - bcc=['bcc@example.com'], to=['to@example.com'], - create_link=True) - second_call_context = mocked.call_args_list[1][0][1] - self.assertEqual(second_call_context['an_image'], '/media/saved_url') + def test_get_email_message_with_inline_image(self, mock_render_email, mock_url, mock_save): + mock_url.return_value = 'media/saved_url' + self.backend.get_email_message( + 'foo.email', {'an_image': InlineImage('file.png', b'foo', + subtype='png')}, + from_email='from@example.com', cc=['cc@example.com'], + bcc=['bcc@example.com'], to=['to@example.com'], + create_link=True) + second_call_context = mock_render_email.call_args_list[1][0][1] + self.assertEqual(second_call_context['an_image'], 'media/saved_url') @override_settings(TEMPLATED_EMAIL_EMAIL_MESSAGE_CLASS='anymail.message.AnymailMessage') @patch.object( @@ -496,30 +498,32 @@ def test_removal_of_legacy(self): except TemplateDoesNotExist as e: self.assertEqual(e.args[0], 'templated_email/legacy.email') - def test_host_inline_image_if_not_exist(self): + @patch('django.core.files.storage.FileSystemStorage.url') + @patch('django.core.files.storage.FileSystemStorage.save') + def test_host_inline_image_if_not_exist(self, mock_save, mock_url): + mock_url.return_value = 'media/saved_url' inline_image = InlineImage('foo.jpg', b'bar') - self.storage_mock.save = Mock(return_value='saved_url') - with self.patch_storage(): - filename = self.backend.host_inline_image(inline_image) - self.assertEqual(filename, '/media/saved_url') - self.storage_mock.save.assert_called_once() - name, content = self.storage_mock.save.call_args[0] + filename = self.backend.host_inline_image(inline_image) + self.assertEqual(filename, 'media/saved_url') + mock_save.assert_called_once() + name, content = mock_save.call_args[0] self.assertEqual( name, 'templated_email/37b51d194a7513e45b56f6524f2d51f2foo.jpg') self.assertTrue(isinstance(content, BytesIO)) - def test_host_inline_image_if_exist(self): + @patch('django.core.files.storage.FileSystemStorage.exists') + @patch('django.core.files.storage.FileSystemStorage.save') + def test_host_inline_image_if_exist(self, mock_save, mock_exists): inline_image = InlineImage('foo.jpg', b'bar') - self.storage_mock.exists = Mock(return_value=True) + mock_exists.return_value = True - with self.patch_storage(): - filename = self.backend.host_inline_image(inline_image) + filename = self.backend.host_inline_image(inline_image) self.assertEqual( filename, '/media/templated_email/37b51d194a7513e45b56f6524f2d51f2foo.jpg') - self.storage_mock.save.assert_not_called() - self.storage_mock.exists.assert_called_once_with( + mock_save.assert_not_called() + mock_exists.assert_called_once_with( 'templated_email/37b51d194a7513e45b56f6524f2d51f2foo.jpg') diff --git a/tests/generic_views/test_views.py b/tests/generic_views/test_views.py index 71248e9..ffb6150 100644 --- a/tests/generic_views/test_views.py +++ b/tests/generic_views/test_views.py @@ -2,7 +2,7 @@ from django.core.exceptions import ImproperlyConfigured from django.core import mail -import unittest.mock +from unittest.mock import patch from templated_email.generic_views import TemplatedEmailFormViewMixin from tests.generic_views.views import AuthorCreateView @@ -44,10 +44,10 @@ def test_templated_email_get_recipients(self): self.mixin_object.templated_email_get_recipients, form=None) - @mock.patch.object(TemplatedEmailFormViewMixin, + @patch.object(TemplatedEmailFormViewMixin, 'templated_email_get_template_names', return_value=['template']) - @mock.patch.object(TemplatedEmailFormViewMixin, + @patch.object(TemplatedEmailFormViewMixin, 'templated_email_get_recipients', return_value=['foo@example.com']) def test_templated_email_get_send_email_kwargs_valid( @@ -65,10 +65,10 @@ class FakeForm(object): self.assertEqual(kwargs['recipient_list'], ['foo@example.com']) self.assertEqual(kwargs['context'], {'form_data': 'foo'}) - @mock.patch.object(TemplatedEmailFormViewMixin, + @patch.object(TemplatedEmailFormViewMixin, 'templated_email_get_template_names', return_value=['template']) - @mock.patch.object(TemplatedEmailFormViewMixin, + @patch.object(TemplatedEmailFormViewMixin, 'templated_email_get_recipients', return_value=['foo@example.com']) def test_templated_email_get_send_email_kwargs_not_valid( diff --git a/tests/test_utils.py b/tests/test_utils.py index f21dfeb..e74175d 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,4 +1,4 @@ -import unittest.mock +from unittest.mock import patch, Mock from django.test import TestCase @@ -23,11 +23,11 @@ def test_generate_cid(self): str(self.inline_image) self.assertIsNotNone(self.inline_image._content_id) - @mock.patch('templated_email.utils.make_msgid', return_value='foo') + @patch('templated_email.utils.make_msgid', return_value='foo') def test_str(self, mocked): self.assertEqual(str(self.inline_image), 'cid:foo') - @mock.patch('templated_email.utils.make_msgid', return_value='foo') + @patch('templated_email.utils.make_msgid', return_value='foo') def test_should_cache_cid(self, mocked): str(self.inline_image) str(self.inline_image) @@ -45,7 +45,7 @@ def test_changing_content_should_generate_new_cid(self): self.assertNotEqual(cid2, cid3) def test_attach_to_message(self): - message = mock.Mock() + message = Mock() self.inline_image.attach_to_message(message) mimeimage = message.attach.call_args[0][0] self.assertEqual(mimeimage.get('Content-ID'), diff --git a/tests/utils.py b/tests/utils.py index 63e4b7c..0f742fd 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -6,7 +6,7 @@ class MockedNetworkTestCaseMixin(object): # See: https://code.djangoproject.com/ticket/24380 @classmethod def setUpClass(cls): - cls.getfqdn_patcher = mock.patch( + cls.getfqdn_patcher = unittest.mock.patch( 'django.core.mail.utils.socket.getfqdn', return_value='vinta.local') cls.getfqdn_patcher.start()