Partition durable events by tenant entitlement
This commit is contained in:
@@ -15,6 +15,7 @@ from govoplan_audit.backend.outbox import SqlAuditOutbox
|
||||
from govoplan_core.core.events import (
|
||||
DurableEventConsumer,
|
||||
EventActorRef,
|
||||
EventTenantRef,
|
||||
PlatformEvent,
|
||||
)
|
||||
from govoplan_core.core.institutional import (
|
||||
@@ -114,6 +115,82 @@ class AuditOutboxTests(unittest.TestCase):
|
||||
delivery.delivery_key,
|
||||
)
|
||||
|
||||
def test_dispatch_partitions_pending_events_by_tenant(self) -> None:
|
||||
Session = self._database()
|
||||
outbox = SqlAuditOutbox()
|
||||
seen: list[str] = []
|
||||
|
||||
with Session() as session:
|
||||
first = outbox.enqueue(
|
||||
session,
|
||||
PlatformEvent(
|
||||
type="files.file.created",
|
||||
module_id="files",
|
||||
tenant=EventTenantRef(id="tenant-1"),
|
||||
),
|
||||
)
|
||||
second = outbox.enqueue(
|
||||
session,
|
||||
PlatformEvent(
|
||||
type="files.file.created",
|
||||
module_id="files",
|
||||
tenant=EventTenantRef(id="tenant-2"),
|
||||
),
|
||||
)
|
||||
counts = outbox.dispatch_pending(
|
||||
session,
|
||||
tenant_id="tenant-1",
|
||||
consumers=(
|
||||
DurableEventConsumer(
|
||||
consumer_id="tests.tenant-filter.v1",
|
||||
handler=lambda event, _key: seen.append(
|
||||
event.tenant.id if event.tenant else "system"
|
||||
),
|
||||
),
|
||||
),
|
||||
observer=None,
|
||||
)
|
||||
|
||||
self.assertEqual(1, counts["selected"])
|
||||
self.assertEqual(["tenant-1"], seen)
|
||||
self.assertEqual("dispatched", first.status)
|
||||
self.assertEqual("pending", second.status)
|
||||
|
||||
def test_dispatch_can_select_only_tenantless_system_events(self) -> None:
|
||||
Session = self._database()
|
||||
outbox = SqlAuditOutbox()
|
||||
seen: list[str] = []
|
||||
|
||||
with Session() as session:
|
||||
system = outbox.enqueue(
|
||||
session,
|
||||
PlatformEvent(type="system.ready", module_id="core"),
|
||||
)
|
||||
tenant = outbox.enqueue(
|
||||
session,
|
||||
PlatformEvent(
|
||||
type="tenant.ready",
|
||||
module_id="tenancy",
|
||||
tenant=EventTenantRef(id="tenant-1"),
|
||||
),
|
||||
)
|
||||
counts = outbox.dispatch_pending(
|
||||
session,
|
||||
tenantless_only=True,
|
||||
consumers=(
|
||||
DurableEventConsumer(
|
||||
consumer_id="tests.system-filter.v1",
|
||||
handler=lambda event, _key: seen.append(event.type),
|
||||
),
|
||||
),
|
||||
observer=None,
|
||||
)
|
||||
|
||||
self.assertEqual(1, counts["selected"])
|
||||
self.assertEqual(["system.ready"], seen)
|
||||
self.assertEqual("dispatched", system.status)
|
||||
self.assertEqual("pending", tenant.status)
|
||||
|
||||
def test_outbox_preserves_institutional_context(self) -> None:
|
||||
Session = self._database()
|
||||
outbox = SqlAuditOutbox()
|
||||
|
||||
Reference in New Issue
Block a user