mirror of
https://github.com/coddingtonbear/django-mailbox.git
synced 2026-07-09 22:38:19 +02:00
Adding a more-versatile condition-handling method for preventing integration tests from mashing on one another.
This commit is contained in:
parent
3e1f6b9909
commit
988cb7504f
6 changed files with 17 additions and 17 deletions
|
|
@ -387,7 +387,7 @@ class Mailbox(models.Model):
|
||||||
msg.save()
|
msg.save()
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
def get_new_mail(self):
|
def get_new_mail(self, condition=None):
|
||||||
"""Connect to this transport and fetch new messages."""
|
"""Connect to this transport and fetch new messages."""
|
||||||
new_mail = []
|
new_mail = []
|
||||||
connection = self.get_connection()
|
connection = self.get_connection()
|
||||||
|
|
|
||||||
|
|
@ -55,12 +55,12 @@ class EmailMessageTestCase(TestCase):
|
||||||
settings.EMAIL_USE_TLS = True
|
settings.EMAIL_USE_TLS = True
|
||||||
super(EmailMessageTestCase, self).setUp()
|
super(EmailMessageTestCase, self).setUp()
|
||||||
|
|
||||||
def _get_new_messages(self, mailbox):
|
def _get_new_messages(self, mailbox, condition=None):
|
||||||
maximum_wait = time.time() + self.maximum_wait_seconds
|
maximum_wait = time.time() + self.maximum_wait_seconds
|
||||||
while True:
|
while True:
|
||||||
if time.time() > maximum_wait:
|
if time.time() > maximum_wait:
|
||||||
raise EmailIntegrationTimeout()
|
raise EmailIntegrationTimeout()
|
||||||
messages = self.mailbox.get_new_mail()
|
messages = self.mailbox.get_new_mail(condition)
|
||||||
if messages:
|
if messages:
|
||||||
return messages
|
return messages
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
|
|
|
||||||
|
|
@ -24,12 +24,6 @@ class TestImap(EmailMessageTestCase):
|
||||||
uri=self.get_connection_string()
|
uri=self.get_connection_string()
|
||||||
)
|
)
|
||||||
self.arbitrary_identifier = str(uuid.uuid4())
|
self.arbitrary_identifier = str(uuid.uuid4())
|
||||||
settings.DJANGO_MAILBOX_INTEGRATION_TESTING_SUBJECT = (
|
|
||||||
self.arbitrary_identifier
|
|
||||||
)
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
settings.DJANGO_MAILBOX_INTEGRATION_TESTING_SUBJECT = None
|
|
||||||
|
|
||||||
def get_connection_string(self):
|
def get_connection_string(self):
|
||||||
return "imap+ssl://{account}:{password}@{server}".format(
|
return "imap+ssl://{account}:{password}@{server}".format(
|
||||||
|
|
@ -50,7 +44,10 @@ class TestImap(EmailMessageTestCase):
|
||||||
)
|
)
|
||||||
msg.send()
|
msg.send()
|
||||||
|
|
||||||
messages = self._get_new_messages(self.mailbox)
|
messages = self._get_new_messages(
|
||||||
|
self.mailbox,
|
||||||
|
condition=lambda m: m['subject'] == self.arbitrary_identifier
|
||||||
|
)
|
||||||
|
|
||||||
self.assertEqual(1, len(messages))
|
self.assertEqual(1, len(messages))
|
||||||
self.assertEqual(messages[0].subject, self.arbitrary_identifier)
|
self.assertEqual(messages[0].subject, self.arbitrary_identifier)
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,12 @@ class GenericFileMailbox(EmailTransport):
|
||||||
def get_instance(self):
|
def get_instance(self):
|
||||||
return self._variant(self._path)
|
return self._variant(self._path)
|
||||||
|
|
||||||
def get_message(self):
|
def get_message(self, condition=None):
|
||||||
repository = self.get_instance()
|
repository = self.get_instance()
|
||||||
repository.lock()
|
repository.lock()
|
||||||
for key, message in repository.items():
|
for key, message in repository.items():
|
||||||
|
if condition and not condition(message):
|
||||||
|
continue
|
||||||
repository.remove(key)
|
repository.remove(key)
|
||||||
yield message
|
yield message
|
||||||
repository.unlock()
|
repository.unlock()
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ class ImapTransport(EmailTransport):
|
||||||
pass
|
pass
|
||||||
return safe_message_ids
|
return safe_message_ids
|
||||||
|
|
||||||
def get_message(self):
|
def get_message(self, condition=None):
|
||||||
message_ids = self._get_all_message_ids()
|
message_ids = self._get_all_message_ids()
|
||||||
|
|
||||||
if not message_ids:
|
if not message_ids:
|
||||||
|
|
@ -105,10 +105,7 @@ class ImapTransport(EmailTransport):
|
||||||
continue
|
continue
|
||||||
message = self.get_email_from_bytes(msg_contents[0][1])
|
message = self.get_email_from_bytes(msg_contents[0][1])
|
||||||
|
|
||||||
if (
|
if condition and not condition(message):
|
||||||
self.integration_testing_subject and
|
|
||||||
message['Subject'] != self.integration_testing_subject
|
|
||||||
):
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
yield message
|
yield message
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ class Pop3Transport(EmailTransport):
|
||||||
return six.binary_type('\r\n', 'ascii').join(message_lines)
|
return six.binary_type('\r\n', 'ascii').join(message_lines)
|
||||||
return '\r\n'.join(message_lines)
|
return '\r\n'.join(message_lines)
|
||||||
|
|
||||||
def get_message(self):
|
def get_message(self, condition=None):
|
||||||
message_count = len(self.server.list()[1])
|
message_count = len(self.server.list()[1])
|
||||||
for i in range(message_count):
|
for i in range(message_count):
|
||||||
try:
|
try:
|
||||||
|
|
@ -36,6 +36,10 @@ class Pop3Transport(EmailTransport):
|
||||||
self.server.retr(i + 1)[1]
|
self.server.retr(i + 1)[1]
|
||||||
)
|
)
|
||||||
message = self.get_email_from_bytes(msg_contents)
|
message = self.get_email_from_bytes(msg_contents)
|
||||||
|
|
||||||
|
if condition and not condition(message):
|
||||||
|
continue
|
||||||
|
|
||||||
yield message
|
yield message
|
||||||
except MessageParseError:
|
except MessageParseError:
|
||||||
continue
|
continue
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue