From 6ca8400e91c595b1e4d115aef638063238e5f320 Mon Sep 17 00:00:00 2001 From: rwood-moz Date: Tue, 30 Jun 2026 16:56:13 -0400 Subject: [PATCH] Fix intermittent integration test failures --- test/common/IMAP.py | 5 ++++- test/common/JMAP.py | 28 ++++++++++++++++--------- test/integration/imap/test_messaging.py | 4 ++-- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/test/common/IMAP.py b/test/common/IMAP.py index 6e19141..65056e0 100644 --- a/test/common/IMAP.py +++ b/test/common/IMAP.py @@ -379,12 +379,15 @@ def delete_messages(self, msg_ids): """ Mark the given message(s) as deleted (in the currently selected mailbox). """ + if isinstance(msg_ids, str): + msg_ids = [msg_ids] for msg in msg_ids: log.debug(f'marking message {msg} as deleted') result, data = self.connection.store(msg, '+FLAGS', '\\Deleted') log.debug(f'{result}, {data}') assert result == RESULT_OK, 'expected to be able to mark message as deleted' - assert MSG_DELETED_FLAG in data[0], 'expected deleted flag to have been added' + msg_flags = self.fetch_message_flags(msg) + assert MSG_DELETED_FLAG in msg_flags[0], 'expected deleted flag to have been added' def permanently_delete_msgs(self): """ diff --git a/test/common/JMAP.py b/test/common/JMAP.py index f6c4dd7..fdf2cde 100644 --- a/test/common/JMAP.py +++ b/test/common/JMAP.py @@ -351,17 +351,17 @@ def delete_mailbox_by_id(self, mailbox_id): log.debug(f"error deleting mailbox with id '{mailbox_id}': {result}") return result - def query_email(self, filter=None, limit=None): + def query_email(self, filter=None, limit=None, collapse_threads=True): """ Perform an email query using the provided filter, and return the found email ids. """ method = EmailQuery( - collapse_threads=True, + collapse_threads=collapse_threads, filter=filter, limit=limit, ) - log.debug(f'querying email with filter: {filter} and limit: {limit}') + log.debug(f'querying email with filter: {filter}, limit: {limit}, collapse_threads: {collapse_threads}') try: result = self.client.request(method) @@ -586,25 +586,33 @@ def wait_for_message_to_arrive(self, subject): Check the inbox for a message to arrive with the given subject. If the message hasn't arrived yet wait for it; return the id of the message after it has arrived (or -1 if it never arrived). """ - max_checks = 60 + max_wait_seconds = 7 * 60 wait_seconds = 5 + max_checks = (max_wait_seconds // wait_seconds) + 1 arrived_msg_id = 0 + mailbox_search = self.get_mailbox_by_name('Inbox') + assert mailbox_search, 'expected to get the inbox mailbox' + inbox_id = mailbox_search[0].id + assert inbox_id, 'expected to get the inbox mailbox id' + for checks in range(1, max_checks + 1): + if checks > 1: + time.sleep(wait_seconds) + log.debug( - f'waiting {wait_seconds} seconds for message to arrive in test_acct_1 inbox ' - f'(check {checks} of {max_checks})' + f'checking for message to arrive in {self.username.split("@")[0]} inbox {inbox_id} ' + f'(check {checks} of {max_checks}, timeout {max_wait_seconds} seconds)' ) - time.sleep(wait_seconds) search_filter = { - 'inMailbox': 'a', + 'inMailbox': inbox_id, 'subject': subject, } - found_email_ids = self.query_email(filter=search_filter) + found_email_ids = self.query_email(filter=search_filter, collapse_threads=False) - if len(found_email_ids) == 1: + if found_email_ids: arrived_msg_id = found_email_ids[0] break diff --git a/test/integration/imap/test_messaging.py b/test/integration/imap/test_messaging.py index 736ba61..438fa67 100644 --- a/test/integration/imap/test_messaging.py +++ b/test/integration/imap/test_messaging.py @@ -284,7 +284,7 @@ def test_delete_message(self, imap): msg_subject = imap.fetch_message_details(test_msg)['Subject'] log.debug(f'message to be deleted has this subject: {msg_subject}') - imap.delete_messages(test_msg) + imap.delete_messages([test_msg]) # search for deleted message and verify still there; flag was already checked in delete_messages above found_msg = imap.search_messages('SUBJECT', msg_subject) @@ -300,7 +300,7 @@ def test_expunge_message(self, imap): msg_subject = imap.fetch_message_details(test_msg)['Subject'] log.debug(f'message to be deleted has this subject: {msg_subject}') - imap.delete_messages(test_msg) + imap.delete_messages([test_msg]) # search for deleted message and verify still there; flag was already checked in delete_messages above found_msg = imap.search_messages('SUBJECT', msg_subject)