diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 88b6cbd..97e96b7 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -42,6 +42,8 @@ Other * Move CI testing to GitHub Actions (and stop using Travis-CI). +* Internal: catch invalid recipient status earlier in ESP response parsing + v8.1 diff --git a/anymail/message.py b/anymail/message.py index bf0ad16..c118964 100644 --- a/anymail/message.py +++ b/anymail/message.py @@ -85,6 +85,14 @@ class AnymailRecipientStatus: """Information about an EmailMessage's send status for a single recipient""" def __init__(self, message_id, status): + try: + # message_id must be something that can be put in a set + # (see AnymailStatus.set_recipient_status) + set([message_id]) + except TypeError: + raise TypeError("Invalid message_id %r is not scalar type" % message_id) + if status is not None and status not in ANYMAIL_STATUSES: + raise ValueError("Invalid status %r" % status) self.message_id = message_id # ESP message id self.status = status # one of ANYMAIL_STATUSES, or None for not yet sent to ESP diff --git a/tests/test_message.py b/tests/test_message.py index c87286b..c26ba9d 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -76,3 +76,11 @@ class AnymailStatusTests(AnymailTestMixin, SimpleTestCase): self.assertIsNone(status.status) self.assertIsNone(status.message_id) self.assertEqual(repr(status), "AnymailStatus") + + def test_invalid_message_id(self): + with self.assertRaisesMessage(TypeError, "Invalid message_id"): + AnymailRecipientStatus(["id-list", "is-not-valid"], "queued") + + def test_invalid_status(self): + with self.assertRaisesMessage(ValueError, "Invalid status"): + AnymailRecipientStatus("12345", "not-a-known-status")