Skip to content

Commit

Permalink
Cleanup: add reprs for AnymailStatus, AnymailRecipientStatus
Browse files Browse the repository at this point in the history
  • Loading branch information
medmunds committed Sep 11, 2020
1 parent 03dd15d commit 088d3c8
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 1 deletion.
19 changes: 19 additions & 0 deletions anymail/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ def __init__(self, message_id, status):
self.message_id = message_id # ESP message id
self.status = status # one of ANYMAIL_STATUSES, or None for not yet sent to ESP

def __repr__(self):
return "AnymailRecipientStatus({message_id!r}, {status!r})".format(
message_id=self.message_id, status=self.status)


class AnymailStatus:
"""Information about an EmailMessage's send status for all recipients"""
Expand All @@ -98,6 +102,21 @@ def __init__(self):
self.recipients = {} # per-recipient: { email: AnymailRecipientStatus, ... }
self.esp_response = None

def __repr__(self):
def _repr(o):
if isinstance(o, set):
# force sorted order, for reproducible testing
item_reprs = [repr(item) for item in sorted(o)]
return "{%s}" % ", ".join(item_reprs)
else:
return repr(o)
details = ["status={status}".format(status=_repr(self.status))]
if self.message_id:
details.append("message_id={message_id}".format(message_id=_repr(self.message_id)))
if self.recipients:
details.append("{num_recipients} recipients".format(num_recipients=len(self.recipients)))
return "AnymailStatus<{details}>".format(details=", ".join(details))

def set_recipient_status(self, recipients):
self.recipients.update(recipients)
recipient_statuses = self.recipients.values()
Expand Down
49 changes: 48 additions & 1 deletion tests/test_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from django.test import SimpleTestCase
from mock import patch

from anymail.message import attach_inline_image
from anymail.message import AnymailRecipientStatus, AnymailStatus, attach_inline_image

from .utils import AnymailTestMixin, sample_image_content

Expand All @@ -29,3 +29,50 @@ def test_domain_override(self):
domain="example.org")
self.assertRegex(cid, r"[\w.]+@example\.org",
"Content-ID should be a valid Message-ID @example.org")


class AnymailStatusTests(AnymailTestMixin, SimpleTestCase):
def test_single_recipient(self):
recipients = {
"one@example.com": AnymailRecipientStatus("12345", "sent"),
}
status = AnymailStatus()
status.set_recipient_status(recipients)
self.assertEqual(status.status, {"sent"})
self.assertEqual(status.message_id, "12345")
self.assertEqual(status.recipients, recipients)
self.assertEqual(repr(status),
"AnymailStatus<status={'sent'}, message_id='12345', 1 recipients>")
self.assertEqual(repr(status.recipients["one@example.com"]),
"AnymailRecipientStatus('12345', 'sent')")

def test_multiple_recipients(self):
recipients = {
"one@example.com": AnymailRecipientStatus("12345", "sent"),
"two@example.com": AnymailRecipientStatus("45678", "queued"),
}
status = AnymailStatus()
status.set_recipient_status(recipients)
self.assertEqual(status.status, {"queued", "sent"})
self.assertEqual(status.message_id, {"12345", "45678"})
self.assertEqual(status.recipients, recipients)
self.assertEqual(repr(status),
"AnymailStatus<status={'queued', 'sent'}, message_id={'12345', '45678'}, 2 recipients>")

def test_multiple_recipients_same_message_id(self):
# status.message_id collapses when it's the same for all recipients
recipients = {
"one@example.com": AnymailRecipientStatus("12345", "sent"),
"two@example.com": AnymailRecipientStatus("12345", "queued"),
}
status = AnymailStatus()
status.set_recipient_status(recipients)
self.assertEqual(status.message_id, "12345")
self.assertEqual(repr(status),
"AnymailStatus<status={'queued', 'sent'}, message_id='12345', 2 recipients>")

def test_none(self):
status = AnymailStatus()
self.assertIsNone(status.status)
self.assertIsNone(status.message_id)
self.assertEqual(repr(status), "AnymailStatus<status=None>")

0 comments on commit 088d3c8

Please sign in to comment.