From fb5912f0e7013fd11793810df544f354fe8fa9bf Mon Sep 17 00:00:00 2001 From: medmunds Date: Mon, 25 Jan 2021 10:45:39 -0800 Subject: [PATCH] Internal: validate AnymailRecipientStatus at init Catch invalid message_id and status when initializing AnymailRecipientStatus, so problems with ESP response are caught earlier (in individual backend parse_recipient_status, rather than base backend _send). --- CHANGELOG.rst | 2 ++ anymail/message.py | 8 ++++++++ tests/test_message.py | 8 ++++++++ 3 files changed, 18 insertions(+) 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")