Reconcile iCalendar replies from mail
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user