Add module event producer coverage
This commit is contained in:
@@ -18,6 +18,7 @@ from govoplan_core.core.change_sequence import (
|
||||
sequence_entries_since,
|
||||
sequence_watermark_is_expired,
|
||||
)
|
||||
from govoplan_core.core.events import EventActorRef, EventBus, EventObjectRef, EventTenantRef, PlatformEvent, event_bus_context
|
||||
from govoplan_core.db.base import Base
|
||||
|
||||
|
||||
@@ -64,6 +65,46 @@ class ChangeSequenceTests(unittest.TestCase):
|
||||
finally:
|
||||
engine.dispose()
|
||||
|
||||
def test_record_change_publishes_module_change_event(self) -> None:
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
SessionLocal = sessionmaker(bind=engine)
|
||||
try:
|
||||
Base.metadata.create_all(bind=engine, tables=[ChangeSequenceEntry.__table__, ChangeSequenceRetentionFloor.__table__])
|
||||
seen: list[PlatformEvent] = []
|
||||
bus = EventBus()
|
||||
bus.subscribe("*", seen.append)
|
||||
cases = (
|
||||
("files", "files.assets", "file", "file-1", "created", "files.file.created"),
|
||||
("mail", "mail.profiles", "mail_profile", "profile-1", "updated", "mail.profile.updated"),
|
||||
("campaigns", "campaigns.jobs", "campaign_job", "job-1", "updated", "campaigns.campaign.job.updated"),
|
||||
)
|
||||
with SessionLocal() as session:
|
||||
with event_bus_context(bus):
|
||||
for module_id, collection, resource_type, resource_id, operation, _event_type in cases:
|
||||
record_change(
|
||||
session,
|
||||
tenant_id="tenant-1",
|
||||
module_id=module_id,
|
||||
collection=collection,
|
||||
resource_type=resource_type,
|
||||
resource_id=resource_id,
|
||||
operation=operation,
|
||||
actor_type="user",
|
||||
actor_id="user-1",
|
||||
payload={"scope_type": "tenant"},
|
||||
)
|
||||
|
||||
self.assertEqual([case[-1] for case in cases], [event.type for event in seen])
|
||||
event = seen[1]
|
||||
self.assertEqual("mail", event.module_id)
|
||||
self.assertEqual(EventActorRef(type="user", id="user-1"), event.actor)
|
||||
self.assertEqual(EventTenantRef(id="tenant-1"), event.tenant)
|
||||
self.assertEqual(EventObjectRef(type="mail_profile", id="profile-1"), event.resource)
|
||||
self.assertEqual("mail.profiles", event.payload["collection"])
|
||||
self.assertEqual({"scope_type": "tenant"}, event.payload["payload"])
|
||||
finally:
|
||||
engine.dispose()
|
||||
|
||||
def test_pruning_records_retention_floor_for_stale_watermarks(self) -> None:
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
SessionLocal = sessionmaker(bind=engine)
|
||||
|
||||
Reference in New Issue
Block a user