feat: add friendly error messages, MailDebugRecorder, clear-error endpoint, debug_logging column

Agent-Logs-Url: https://github.com/christianlouis/InboxConverge/sessions/5d2918de-630e-4a66-8355-1b036c620b1c

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-05-03 18:43:06 +00:00
committed by GitHub
parent 0026afe131
commit db893d05e9
8 changed files with 826 additions and 31 deletions
+12 -7
View File
@@ -172,7 +172,7 @@ class TestTestPop3Connection:
success, msg = await proc._test_pop3_connection()
assert success is False
assert "Authentication failed" in msg
assert "Authentication rejected" in msg or "authentication" in msg.lower()
@patch("app.services.mail_processor.poplib")
async def test_pop3_protocol_error(self, mock_poplib):
@@ -189,7 +189,7 @@ class TestTestPop3Connection:
success, msg = await proc._test_pop3_connection()
assert success is False
assert "POP3 protocol error" in msg
assert "POP3" in msg and "error" in msg.lower()
@patch("app.services.mail_processor.poplib")
async def test_pop3_generic_exception(self, mock_poplib):
@@ -204,7 +204,7 @@ class TestTestPop3Connection:
success, msg = await proc._test_pop3_connection()
assert success is False
assert "Connection failed" in msg
assert msg # must be non-empty
# ---------------------------------------------------------------------------
@@ -280,7 +280,7 @@ class TestTestImapConnection:
success, msg = await proc._test_imap_connection()
assert success is False
assert "Authentication failed" in msg
assert "Authentication" in msg or "rejected" in msg
@patch("app.services.mail_processor.aioimaplib")
async def test_imap_generic_exception(self, mock_aioimaplib):
@@ -292,7 +292,7 @@ class TestTestImapConnection:
success, msg = await proc._test_imap_connection()
assert success is False
assert "IMAP connection failed" in msg
assert msg # must be non-empty
# ---------------------------------------------------------------------------
@@ -498,13 +498,18 @@ class TestFetchPop3Emails:
@patch("app.services.mail_processor.poplib")
async def test_connection_failure_raises_mail_fetch_error(self, mock_poplib):
"""Connection failure raises MailFetchError."""
"""Connection failure raises MailFetchError with non-empty message."""
import poplib as real_poplib
mock_poplib.error_proto = real_poplib.error_proto
mock_poplib.POP3_SSL.side_effect = OSError("connection refused")
account = _make_account(protocol="pop3_ssl")
proc = MailProcessor(account, "secret")
with pytest.raises(MailFetchError, match="POP3 fetch error"):
with pytest.raises(MailFetchError) as exc_info:
await proc._fetch_pop3_emails(10, set())
# Message should be non-empty and describe the failure
assert str(exc_info.value)
@patch("app.services.mail_processor.poplib")
async def test_empty_mailbox(self, mock_poplib):