Reuse shared IMAP message listing path
This commit is contained in:
@@ -18,6 +18,7 @@ from govoplan_mail.backend.sending.imap import (
|
||||
_select_readonly,
|
||||
_sequence_set,
|
||||
append_message_to_sent,
|
||||
list_imap_messages,
|
||||
)
|
||||
|
||||
|
||||
@@ -79,6 +80,91 @@ class ImapFolderParserTests(unittest.TestCase):
|
||||
|
||||
|
||||
class ImapMessagePaginationTests(unittest.TestCase):
|
||||
def test_mock_message_cursor_preserves_order_and_resets_when_stale(self):
|
||||
records = [
|
||||
{
|
||||
"id": "3",
|
||||
"kind": "smtp",
|
||||
"raw_eml": "Subject: Three\r\n\r\nBody",
|
||||
"size_bytes": 26,
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"kind": "smtp",
|
||||
"raw_eml": "Subject: Two\r\n\r\nBody",
|
||||
"size_bytes": 24,
|
||||
},
|
||||
]
|
||||
config = ImapConfig(host="mock.imap.local")
|
||||
|
||||
with patch(
|
||||
"govoplan_mail.backend.sending.imap.list_records",
|
||||
return_value=records,
|
||||
):
|
||||
page = list_imap_messages(
|
||||
imap_config=config,
|
||||
after_uid="3",
|
||||
expected_uidvalidity="mock-v1",
|
||||
limit=1,
|
||||
)
|
||||
reset_page = list_imap_messages(
|
||||
imap_config=config,
|
||||
after_uid="3",
|
||||
expected_uidvalidity="stale",
|
||||
limit=1,
|
||||
)
|
||||
|
||||
self.assertEqual([message.uid for message in page.messages], ["2"])
|
||||
self.assertEqual(page.offset, 1)
|
||||
self.assertFalse(page.cursor_reset)
|
||||
self.assertEqual([message.uid for message in reset_page.messages], ["3"])
|
||||
self.assertEqual(reset_page.offset, 0)
|
||||
self.assertTrue(reset_page.cursor_reset)
|
||||
|
||||
def test_real_message_listing_delegates_to_shared_client_path(self):
|
||||
class Client:
|
||||
logged_out = False
|
||||
|
||||
def logout(self):
|
||||
self.logged_out = True
|
||||
|
||||
client = Client()
|
||||
expected = object()
|
||||
config = ImapConfig(host="imap.example.org")
|
||||
|
||||
with (
|
||||
patch(
|
||||
"govoplan_mail.backend.sending.imap._open_imap",
|
||||
return_value=client,
|
||||
),
|
||||
patch(
|
||||
"govoplan_mail.backend.sending.imap._list_imap_messages_on_client",
|
||||
return_value=expected,
|
||||
) as list_on_client,
|
||||
):
|
||||
result = list_imap_messages(
|
||||
imap_config=config,
|
||||
folder=" Archive ",
|
||||
limit=25,
|
||||
offset=5,
|
||||
after_uid="42",
|
||||
expected_uidvalidity="7",
|
||||
)
|
||||
|
||||
self.assertIs(result, expected)
|
||||
self.assertTrue(client.logged_out)
|
||||
list_on_client.assert_called_once_with(
|
||||
client,
|
||||
host="imap.example.org",
|
||||
port=993,
|
||||
security="tls",
|
||||
folder="Archive",
|
||||
limit=25,
|
||||
offset=5,
|
||||
after_uid="42",
|
||||
expected_uidvalidity="7",
|
||||
)
|
||||
|
||||
def test_full_message_fetch_uses_partial_range_and_deployment_limit(self):
|
||||
class Client:
|
||||
command = ""
|
||||
|
||||
Reference in New Issue
Block a user