Add durable search event indexing contract

This commit is contained in:
2026-08-04 03:03:15 +02:00
parent 14351b0c94
commit 7117673ecc
5 changed files with 183 additions and 1 deletions
+3 -1
View File
@@ -250,6 +250,7 @@ class ModuleSystemTests(unittest.TestCase):
"postbox",
"approvals",
"reporting",
"search",
),
)
self.assertEqual(manifests["dashboard"].dependencies, ())
@@ -3517,7 +3518,7 @@ finally:
"version_max_exclusive": "0.2.0",
}, modules["files"]["requires_interfaces"])
self.assertEqual(
["campaigns", "encryption"],
["campaigns", "encryption", "search"],
modules["files"]["optional_dependencies"],
)
self.assertIn({"name": "mail.campaign_delivery", "version": "0.2.0"}, modules["mail"]["provides_interfaces"])
@@ -3581,6 +3582,7 @@ finally:
"postbox",
"approvals",
"reporting",
"search",
],
modules["campaigns"]["optional_dependencies"],
)
+68
View File
@@ -46,6 +46,10 @@ class PlatformEventWorkerTests(unittest.TestCase):
"govoplan_core.celery_app._workflow_trigger_dispatcher",
return_value=None,
),
patch(
"govoplan_core.celery_app._search_index_coordinator",
return_value=None,
),
patch(
"govoplan_core.db.session.get_database",
return_value=database,
@@ -77,6 +81,70 @@ class PlatformEventWorkerTests(unittest.TestCase):
session.commit.assert_called_once_with()
self.assertEqual(1, result["delivered"])
def test_dispatch_uses_a_durable_search_consumer_and_processes_changes(self) -> None:
session = MagicMock()
database = MagicMock()
database.SessionLocal.return_value.__enter__.return_value = session
outbox = MagicMock()
outbox.dispatch_pending.return_value = {
"selected": 1,
"delivered": 1,
"retrying": 0,
"quarantined": 0,
"dispatched": 1,
"observer_failed": 0,
}
search = MagicMock()
search.process_changes.return_value = {
"selected": 1,
"applied": 1,
"retrying": 0,
"quarantined": 0,
}
with (
patch(
"govoplan_core.celery_app._platform_registry",
return_value=MagicMock(),
),
patch(
"govoplan_core.celery_app._platform_event_outbox",
return_value=outbox,
),
patch(
"govoplan_core.celery_app._dataflow_trigger_dispatcher",
return_value=None,
),
patch(
"govoplan_core.celery_app._workflow_trigger_dispatcher",
return_value=None,
),
patch(
"govoplan_core.celery_app._search_index_coordinator",
return_value=search,
),
patch(
"govoplan_core.db.session.get_database",
return_value=database,
),
):
result = dispatch_platform_events.run(25)
consumer = outbox.dispatch_pending.call_args.kwargs["consumers"][0]
self.assertEqual("search.indexing.v1", consumer.consumer_id)
self.assertEqual(frozenset({"*"}), consumer.event_types)
event = PlatformEvent(type="files.file.updated", module_id="files")
delivery_key = consumer.delivery_key(event)
consumer.handler(event, delivery_key)
search.ingest_event.assert_called_once_with(
session,
event=event,
delivery_key=delivery_key,
)
search.process_changes.assert_called_once_with(session, limit=25)
self.assertEqual(1, result["search_changes"]["applied"])
session.commit.assert_called_once_with()
def test_retention_task_uses_the_configured_terminal_window(self) -> None:
session = MagicMock()
database = MagicMock()