Fix fail_silently when session/client creation fails

Make sure backends actually fail silently when asked
(rather than raising inaccurate errors suggesting
coding problems).

Fixes #308
This commit is contained in:
Mike Edmunds
2023-05-02 12:38:18 -07:00
parent 1ba26e1be3
commit 7d993ee610
7 changed files with 75 additions and 4 deletions

View File

@@ -393,6 +393,16 @@ class AmazonSESBackendStandardEmailTests(AmazonSESBackendMockAPITestCase):
sent = self.message.send(fail_silently=True)
self.assertEqual(sent, 0)
def test_session_failure_fail_silently(self):
# Make sure fail_silently is respected if boto3.Session creation fails
# (e.g., due to invalid or missing credentials)
from botocore.exceptions import NoCredentialsError
self.mock_session.side_effect = NoCredentialsError()
sent = self.message.send(fail_silently=True)
self.assertEqual(sent, 0)
def test_prevents_header_injection(self):
# Since we build the raw MIME message, we're responsible for preventing header
# injection. django.core.mail.EmailMessage.message() implements most of that

View File

@@ -403,6 +403,16 @@ class AmazonSESBackendStandardEmailTests(AmazonSESBackendMockAPITestCase):
sent = self.message.send(fail_silently=True)
self.assertEqual(sent, 0)
def test_session_failure_fail_silently(self):
# Make sure fail_silently is respected if boto3.Session creation fails
# (e.g., due to invalid or missing credentials)
from botocore.exceptions import NoCredentialsError
self.mock_session.side_effect = NoCredentialsError()
sent = self.message.send(fail_silently=True)
self.assertEqual(sent, 0)
def test_prevents_header_injection(self):
# Since we build the raw MIME message, we're responsible for preventing header
# injection. django.core.mail.EmailMessage.message() implements most of that

View File

@@ -1,3 +1,5 @@
from unittest import mock
from django.test import SimpleTestCase, override_settings, tag
from anymail.backends.base_requests import AnymailRequestsBackend, RequestsPayload
@@ -69,6 +71,14 @@ class RequestsBackendBaseTestCase(RequestsBackendMockAPITestCase):
timeout = self.get_api_call_arg("timeout")
self.assertEqual(timeout, 5)
@mock.patch(f"{__name__}.MinimalRequestsBackend.create_session")
def test_create_session_error_fail_silently(self, mock_create_session):
# If create_session fails and fail_silently is True,
# make sure _send doesn't raise a misleading error.
mock_create_session.side_effect = ValueError("couldn't create session")
sent = self.message.send(fail_silently=True)
self.assertEqual(sent, 0)
@tag("live")
@override_settings(EMAIL_BACKEND="tests.test_base_backends.MinimalRequestsBackend")