From a52e35b52b2f40c3b8b75cb94033a9e390eae44d Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Tue, 21 Jul 2026 03:16:45 +0200 Subject: [PATCH] Make calendar outbox invariants explicit --- src/govoplan_calendar/backend/outbox.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/govoplan_calendar/backend/outbox.py b/src/govoplan_calendar/backend/outbox.py index a17806d..c31ebce 100644 --- a/src/govoplan_calendar/backend/outbox.py +++ b/src/govoplan_calendar/backend/outbox.py @@ -980,7 +980,9 @@ def execute_calendar_outbox_operation( ) return operation except CalDAVPreconditionFailed as exc: - assert client is not None + if client is None: + _fail_operation(session, operation=operation, source=source, error=exc) + return operation try: matched, remote_etag = _remote_matches_operation(client, operation) except Exception: @@ -1142,7 +1144,8 @@ def retry_calendar_outbox_operation( unavailable_reason = _operation_source_unavailable_reason(operation, source) if unavailable_reason: raise ValueError(unavailable_reason) - assert source is not None + if source is None: + raise RuntimeError("Calendar outbox source availability invariant was violated") operation.status = "pending" operation.attempt_count = 0 operation.available_at = utcnow() @@ -1186,7 +1189,8 @@ def reconcile_calendar_outbox_operation( unavailable_reason = _operation_source_unavailable_reason(operation, source) if unavailable_reason: raise ValueError(unavailable_reason) - assert source is not None + if source is None: + raise RuntimeError("Calendar outbox source availability invariant was violated") if client_factory is None: from govoplan_calendar.backend.service import caldav_client_for_source @@ -1248,7 +1252,8 @@ def discard_calendar_outbox_operation( source is None or source.tenant_id != operation.tenant_id ): raise ValueError(unavailable_reason) - assert source is not None + if source is None: + raise RuntimeError("Calendar outbox source availability invariant was violated") now = utcnow() unresolved_chain = ( session.query(CalendarOutboxOperation)