1
0
Fork 0

Adding a more-versatile condition-handling method for preventing integration tests from mashing on one another.

This commit is contained in:
Adam Coddington 2015-07-07 22:22:15 -07:00
parent 3e1f6b9909
commit 988cb7504f
6 changed files with 17 additions and 17 deletions

View file

@ -387,7 +387,7 @@ class Mailbox(models.Model):
msg.save()
return msg
def get_new_mail(self):
def get_new_mail(self, condition=None):
"""Connect to this transport and fetch new messages."""
new_mail = []
connection = self.get_connection()

View file

@ -55,12 +55,12 @@ class EmailMessageTestCase(TestCase):
settings.EMAIL_USE_TLS = True
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
while True:
if time.time() > maximum_wait:
raise EmailIntegrationTimeout()
messages = self.mailbox.get_new_mail()
messages = self.mailbox.get_new_mail(condition)
if messages:
return messages
time.sleep(5)

View file

@ -24,12 +24,6 @@ class TestImap(EmailMessageTestCase):
uri=self.get_connection_string()
)
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):
return "imap+ssl://{account}:{password}@{server}".format(
@ -50,7 +44,10 @@ class TestImap(EmailMessageTestCase):
)
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(messages[0].subject, self.arbitrary_identifier)

View file

@ -16,10 +16,12 @@ class GenericFileMailbox(EmailTransport):
def get_instance(self):
return self._variant(self._path)
def get_message(self):
def get_message(self, condition=None):
repository = self.get_instance()
repository.lock()
for key, message in repository.items():
if condition and not condition(message):
continue
repository.remove(key)
yield message
repository.unlock()

View file

@ -82,7 +82,7 @@ class ImapTransport(EmailTransport):
pass
return safe_message_ids
def get_message(self):
def get_message(self, condition=None):
message_ids = self._get_all_message_ids()
if not message_ids:
@ -105,10 +105,7 @@ class ImapTransport(EmailTransport):
continue
message = self.get_email_from_bytes(msg_contents[0][1])
if (
self.integration_testing_subject and
message['Subject'] != self.integration_testing_subject
):
if condition and not condition(message):
continue
yield message

View file

@ -28,7 +28,7 @@ class Pop3Transport(EmailTransport):
return six.binary_type('\r\n', 'ascii').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])
for i in range(message_count):
try:
@ -36,6 +36,10 @@ class Pop3Transport(EmailTransport):
self.server.retr(i + 1)[1]
)
message = self.get_email_from_bytes(msg_contents)
if condition and not condition(message):
continue
yield message
except MessageParseError:
continue