]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
In the event of an error when setting the mail account folder, attempt to list the...
authorTrenton Holmes <trenton.holmes@psware.com>
Tue, 19 Apr 2022 15:32:34 +0000 (08:32 -0700)
committerTrenton Holmes <trenton.holmes@psware.com>
Tue, 19 Apr 2022 15:32:34 +0000 (08:32 -0700)
src/paperless_mail/mail.py
src/paperless_mail/tests/test_mail.py

index 5df29e2b0d4425150993dda47b64b6a790007201..471d861e14bb7c404e085d14765b4bf5f9944c20 100644 (file)
@@ -190,6 +190,20 @@ class MailAccountHandler(LoggingMixin):
         try:
             M.folder.set(rule.folder)
         except MailboxFolderSelectError:
+
+            self.log(
+                "error",
+                f"Unable to access folder {rule.folder}, attempting folder listing",
+            )
+            try:
+                for folder_info in M.folder.list():
+                    self.log("info", f"Located folder: {str(folder_info)}")
+            except Exception:
+                self.log(
+                    "error",
+                    "Exception during folder listing, unable to provide list folders",
+                )
+
             raise MailError(
                 f"Rule {rule}: Folder {rule.folder} "
                 f"does not exist in account {rule.account}",
index 9335bcd753c65fc823db1b32ec34df4ad325c76c..a638fc894bb9d0654481329676111548d086c8c8 100644 (file)
@@ -15,6 +15,7 @@ from django.test import TestCase
 from documents.models import Correspondent
 from documents.tests.utils import DirectoriesMixin
 from imap_tools import EmailAddress
+from imap_tools import FolderInfo
 from imap_tools import MailboxFolderSelectError
 from imap_tools import MailMessage
 from imap_tools import MailMessageFlags
@@ -53,13 +54,12 @@ class BogusMailBox(ContextManager):
     def __init__(self):
         self.messages: List[MailMessage] = []
         self.messages_spam: List[MailMessage] = []
+        self.folder = BogusFolderManager()
 
     def login(self, username, password):
         if not (username == "admin" and password == "secret"):
             raise Exception()
 
-    folder = BogusFolderManager()
-
     def fetch(self, criteria, mark_seen, charset=""):
         msg = self.messages
 
@@ -621,6 +621,72 @@ class TestMail(DirectoriesMixin, TestCase):
         self.assertEqual(len(self.bogus_mailbox.messages), 2)
         self.assertEqual(len(self.bogus_mailbox.messages_spam), 1)
 
+    def test_error_folder_set(self):
+        """
+        GIVEN:
+            - Mail rule with non-existent folder
+        THEN:
+            - Should call list to output all folders in the account
+            - Should not process any messages
+        """
+        account = MailAccount.objects.create(
+            name="test2",
+            imap_server="",
+            username="admin",
+            password="secret",
+        )
+        _ = MailRule.objects.create(
+            name="testrule",
+            account=account,
+            action=MailRule.AttachmentAction.MOVE,
+            action_parameter="spam",
+            filter_subject="Claim",
+            order=1,
+            folder="uuuhhhh",  # Invalid folder name
+        )
+
+        self.bogus_mailbox.folder.list = mock.Mock(
+            return_value=[FolderInfo("SomeFoldername", "|", ())],
+        )
+
+        self.mail_account_handler.handle_mail_account(account)
+
+        self.bogus_mailbox.folder.list.assert_called_once()
+        self.assertEqual(self.async_task.call_count, 0)
+
+    def test_error_folder_set_error_listing(self):
+        """
+        GIVEN:
+            - Mail rule with non-existent folder
+            - Mail account folder listing raises exception
+        THEN:
+            - Should not process any messages
+        """
+        account = MailAccount.objects.create(
+            name="test2",
+            imap_server="",
+            username="admin",
+            password="secret",
+        )
+        _ = MailRule.objects.create(
+            name="testrule",
+            account=account,
+            action=MailRule.AttachmentAction.MOVE,
+            action_parameter="spam",
+            filter_subject="Claim",
+            order=1,
+            folder="uuuhhhh",  # Invalid folder name
+        )
+
+        self.bogus_mailbox.folder.list = mock.Mock(
+            side_effect=MailboxFolderSelectError(None, "uhm"),
+        )
+
+        self.mail_account_handler.handle_mail_account(account)
+
+        self.bogus_mailbox.folder.list.assert_called_once()
+        self.assertEqual(self.async_task.call_count, 0)
+
     @mock.patch("paperless_mail.mail.MailAccountHandler.get_correspondent")
     def test_error_skip_mail(self, m):
         def get_correspondent_fake(message, rule):