146 lines
4.4 KiB
Python
146 lines
4.4 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
from datetime import UTC, datetime
|
|
|
|
from govoplan_core.core.postbox import (
|
|
PostboxDeliveryCatalogRef,
|
|
PostboxDirectoryEntryRef,
|
|
PostboxDeliveryRequest,
|
|
PostboxDeliveryReceiptSummaryRef,
|
|
PostboxDeliveryResult,
|
|
PostboxTargetRef,
|
|
)
|
|
from govoplan_campaign.backend.integrations import (
|
|
PostboxCampaignIntegration,
|
|
PostboxDeliveryUnavailable,
|
|
)
|
|
|
|
|
|
class _PostboxDelivery:
|
|
def __init__(self) -> None:
|
|
self.requests = []
|
|
|
|
def deliver(self, session, request):
|
|
self.requests.append((session, request))
|
|
return PostboxDeliveryResult(
|
|
delivery_id="delivery-1",
|
|
postbox_id="postbox-1",
|
|
message_id="message-1",
|
|
address="intake@postbox",
|
|
status="accepted",
|
|
vacant=False,
|
|
holder_count=1,
|
|
)
|
|
|
|
def delivery_catalog(self, session, *, tenant_id):
|
|
return PostboxDeliveryCatalogRef()
|
|
|
|
def list_visible_postboxes(self, session, *, tenant_id, actor):
|
|
return ()
|
|
|
|
def resolve_postbox(
|
|
self,
|
|
session,
|
|
*,
|
|
tenant_id,
|
|
target,
|
|
materialize=False,
|
|
):
|
|
return PostboxDirectoryEntryRef(
|
|
id=target.postbox_id or "postbox-1",
|
|
tenant_id=tenant_id,
|
|
address="intake@postbox",
|
|
address_key="intake",
|
|
name="Intake",
|
|
status="active",
|
|
classification="internal",
|
|
)
|
|
|
|
def link_evidence(self, session, *, tenant_id, message_id, attachment):
|
|
del session, tenant_id, message_id, attachment
|
|
return None
|
|
|
|
def delivery_receipt_summaries(
|
|
self,
|
|
session,
|
|
*,
|
|
tenant_id,
|
|
producer_module,
|
|
delivery_ids,
|
|
):
|
|
del session
|
|
assert tenant_id == "tenant-1"
|
|
assert producer_module == "campaigns"
|
|
return {
|
|
delivery_id: PostboxDeliveryReceiptSummaryRef(
|
|
delivery_id=delivery_id,
|
|
message_id="message-1",
|
|
postbox_id="postbox-1",
|
|
delivery_status="accepted",
|
|
accepted_at=datetime(2026, 7, 30, tzinfo=UTC),
|
|
currently_readable=True,
|
|
read_receipt_count=1,
|
|
)
|
|
for delivery_id in delivery_ids
|
|
}
|
|
|
|
|
|
class PostboxCampaignIntegrationTests(unittest.TestCase):
|
|
def test_optional_delivery_boundary_is_typed_and_explicit(self) -> None:
|
|
delegate = _PostboxDelivery()
|
|
integration = PostboxCampaignIntegration(delegate, delegate, delegate)
|
|
request = PostboxDeliveryRequest(
|
|
tenant_id="tenant-1",
|
|
target=PostboxTargetRef(postbox_id="postbox-1"),
|
|
producer_module="campaigns",
|
|
producer_resource_type="campaign_job",
|
|
producer_resource_id="job-1",
|
|
idempotency_key="campaign-1:job-1:postbox-1",
|
|
subject="Decision",
|
|
)
|
|
|
|
result = integration.deliver(object(), request)
|
|
|
|
self.assertTrue(integration.available)
|
|
self.assertTrue(integration.receipt_evidence_available)
|
|
self.assertEqual("delivery-1", result.delivery_id)
|
|
self.assertEqual(request, delegate.requests[0][1])
|
|
summaries = integration.delivery_receipt_summaries(
|
|
object(),
|
|
tenant_id="tenant-1",
|
|
delivery_ids=["delivery-1"],
|
|
)
|
|
self.assertEqual(1, summaries["delivery-1"].read_receipt_count)
|
|
|
|
def test_missing_postbox_is_reported_without_importing_module_code(
|
|
self,
|
|
) -> None:
|
|
integration = PostboxCampaignIntegration()
|
|
request = PostboxDeliveryRequest(
|
|
tenant_id="tenant-1",
|
|
target=PostboxTargetRef(postbox_id="postbox-1"),
|
|
producer_module="campaigns",
|
|
producer_resource_type="campaign_job",
|
|
producer_resource_id="job-1",
|
|
idempotency_key="campaign-1:job-1:postbox-1",
|
|
subject="Decision",
|
|
)
|
|
|
|
self.assertFalse(integration.available)
|
|
self.assertFalse(integration.receipt_evidence_available)
|
|
self.assertEqual(
|
|
{},
|
|
integration.delivery_receipt_summaries(
|
|
object(),
|
|
tenant_id="tenant-1",
|
|
delivery_ids=["delivery-1"],
|
|
),
|
|
)
|
|
with self.assertRaises(PostboxDeliveryUnavailable):
|
|
integration.deliver(object(), request)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|