Reconcile iCalendar replies from mail

This commit is contained in:
2026-08-02 16:38:45 +02:00
parent 5a3b13e26e
commit ff3aa066ae
4 changed files with 213 additions and 8 deletions
+62
View File
@@ -8,6 +8,7 @@ from sqlalchemy.orm import Session, sessionmaker
from sqlalchemy.pool import StaticPool
from govoplan_core.db.base import Base
from govoplan_core.core.calendar import CalendarInvitationRef
from govoplan_mail.backend.bounce_processing import (
SqlMailBounceProcessingProvider,
parse_delivery_status,
@@ -57,6 +58,24 @@ Body
--dsn--
"""
CALENDAR_REPLY = b"""From: Ada <ada@example.test>
To: organizer@example.test
Message-ID: <calendar-reply-1@example.test>
Subject: Accepted: Planning
MIME-Version: 1.0
Content-Type: text/calendar; method=REPLY; charset=utf-8
BEGIN:VCALENDAR
VERSION:2.0
METHOD:REPLY
BEGIN:VEVENT
UID:invitation-1@govoplan.local
DTSTART:20260805T090000Z
ATTENDEE;PARTSTAT=ACCEPTED:mailto:ada@example.test
END:VEVENT
END:VCALENDAR
"""
class MailBounceProcessingTests(unittest.TestCase):
def setUp(self) -> None:
@@ -181,6 +200,49 @@ class MailBounceProcessingTests(unittest.TestCase):
),
)
def test_calendar_reply_is_forwarded_without_becoming_a_bounce(self) -> None:
class CalendarProvider:
def __init__(self) -> None:
self.calls = []
def record_icalendar_reply(self, session, **kwargs):
self.calls.append((session, kwargs))
return (
CalendarInvitationRef(
event_id="event-1",
calendar_id="calendar-1",
uid="invitation-1@govoplan.local",
correlation_id="campaign:version-1:entry-1",
source_module="campaigns",
source_resource_type="campaign_version",
source_resource_id="version-1",
),
)
calendar = CalendarProvider()
provider = SqlMailBounceProcessingProvider()
with (
self.SessionLocal() as session,
patch(
"govoplan_mail.backend.bounce_processing.calendar_invitation_provider",
return_value=calendar,
),
):
observations = provider.process_raw_message(
session,
tenant_id="tenant-1",
profile_id="profile-1",
folder="INBOX",
uid="43",
raw_message=CALENDAR_REPLY,
)
self.assertEqual((), observations)
self.assertEqual(1, len(calendar.calls))
forwarded = calendar.calls[0][1]
self.assertIn("METHOD:REPLY", forwarded["icalendar"])
self.assertEqual("43", forwarded["evidence"]["mailbox_uid"])
if __name__ == "__main__":
unittest.main()