feat: strengthen module contracts and shared WebUI runtime

This commit is contained in:
2026-07-29 14:16:28 +02:00
parent 53e947935a
commit 68328f3d8e
57 changed files with 4358 additions and 371 deletions

View File

@@ -0,0 +1,119 @@
from __future__ import annotations
import unittest
from govoplan_core.core.modules import ModuleContext, ModuleManifest
from govoplan_core.core.postbox import (
CAPABILITY_POSTBOX_ACCESS,
CAPABILITY_POSTBOX_DELIVERY,
CAPABILITY_POSTBOX_DIRECTORY,
CAPABILITY_POSTBOX_EVIDENCE,
CAPABILITY_POSTBOX_MESSAGES,
PostboxAccessProvider,
PostboxDeliveryProvider,
PostboxDirectoryProvider,
PostboxEvidenceProvider,
PostboxMessagesProvider,
postbox_access_provider,
postbox_delivery_provider,
postbox_directory_provider,
postbox_evidence_provider,
postbox_messages_provider,
)
from govoplan_core.core.registry import PlatformRegistry
class _PostboxProvider:
def list_visible_postboxes(self, session, *, tenant_id, actor):
del session, tenant_id, actor
return ()
def resolve_postbox(self, session, *, tenant_id, target, materialize=False):
del session, tenant_id, target, materialize
return None
def delivery_catalog(self, session, *, tenant_id):
del session, tenant_id
return None
def explain_access(self, session, *, tenant_id, postbox_id, actor, action):
del session, tenant_id, postbox_id, actor, action
return None
def list_messages(
self,
session,
*,
tenant_id,
postbox_ids,
actor,
limit=100,
offset=0,
):
del session, tenant_id, postbox_ids, actor, limit, offset
return ()
def get_message(self, session, *, tenant_id, message_id, actor):
del session, tenant_id, message_id, actor
return None
def mark_message(self, session, *, tenant_id, message_id, actor, state):
del session, tenant_id, message_id, actor, state
return None
def deliver(self, session, request):
del session, request
return None
def link_evidence(self, session, *, tenant_id, message_id, attachment):
del session, tenant_id, message_id, attachment
return None
class PostboxContractTests(unittest.TestCase):
def test_protocols_and_registry_helpers_resolve_without_module_imports(self) -> None:
provider = _PostboxProvider()
self.assertIsInstance(provider, PostboxDirectoryProvider)
self.assertIsInstance(provider, PostboxAccessProvider)
self.assertIsInstance(provider, PostboxMessagesProvider)
self.assertIsInstance(provider, PostboxDeliveryProvider)
self.assertIsInstance(provider, PostboxEvidenceProvider)
registry = PlatformRegistry()
registry.register(
ModuleManifest(
id="postbox_contract_test",
name="Postbox contract test",
version="test",
capability_factories={
name: lambda context: provider
for name in (
CAPABILITY_POSTBOX_DIRECTORY,
CAPABILITY_POSTBOX_ACCESS,
CAPABILITY_POSTBOX_MESSAGES,
CAPABILITY_POSTBOX_DELIVERY,
CAPABILITY_POSTBOX_EVIDENCE,
)
},
)
)
registry.configure_capability_context(
ModuleContext(registry=registry, settings=object())
)
self.assertIs(provider, postbox_directory_provider(registry))
self.assertIs(provider, postbox_access_provider(registry))
self.assertIs(provider, postbox_messages_provider(registry))
self.assertIs(provider, postbox_delivery_provider(registry))
self.assertIs(provider, postbox_evidence_provider(registry))
empty = PlatformRegistry()
self.assertIsNone(postbox_directory_provider(empty))
self.assertIsNone(postbox_access_provider(empty))
self.assertIsNone(postbox_messages_provider(empty))
self.assertIsNone(postbox_delivery_provider(empty))
self.assertIsNone(postbox_evidence_provider(empty))
if __name__ == "__main__":
unittest.main()