More! Events!

This commit is contained in:
lda
2026-05-13 16:17:53 +07:00 Verified
parent c1a25c7eb3
commit d90a8b3968
6 changed files with 130 additions and 10 deletions
+59 -2
View File
@@ -1,11 +1,14 @@
from __future__ import annotations
import asyncio
from collections.abc import Sequence
from wf_mcp.broker import WfMcpService
from wf_mcp.events import EventBus, InMemoryEventSink, make_event
from wf_mcp.events import EventBus, InMemoryEventSink, McpEvent, make_event
from wf_mcp.models import ConnectionConfig
from wf_mcp.storage import FileStore
from .test_support import local_temp_root
from .test_support import FakeAdapter, echo_tool, local_temp_root
def test_event_bus_fans_out_to_subscribers() -> None:
@@ -35,3 +38,57 @@ def test_service_records_events_through_event_bus() -> None:
assert service.list_events()[0].kind == "connection_registered"
assert sink.list_events()[0] is service.list_events()[0]
def test_register_specs_emits_tool_and_catalog_change_events() -> None:
service = WfMcpService(store=FileStore(local_temp_root() / "spec_change_store"))
service.register_connection(
ConnectionConfig(id="demo.personal", server="demo", account="personal")
)
service.register_specs("demo.personal", echo_tool)
events = service.list_events()
event_kinds = [event.kind for event in events]
tools_changed = [
event
for event in events
if event.kind == "tools_changed" and event.connection_id == "demo.personal"
]
catalog_changed = [
event
for event in events
if event.kind == "catalog_changed" and event.connection_id == "demo.personal"
]
assert "tools_changed" in event_kinds
assert "catalog_changed" in event_kinds
assert tools_changed[0].payload["node_count"] == 1
assert catalog_changed[0].payload["reason"] == "specs_registered"
def test_refresh_catalog_emits_capability_change_events() -> None:
service = WfMcpService(store=FileStore(local_temp_root() / "refresh_change_store"))
service.register_connection(
ConnectionConfig(id="demo.personal", server="demo", account="personal")
)
service.register_adapter("demo", FakeAdapter())
asyncio.run(service.refresh_connection_catalog("demo.personal"))
events = service.list_events()
tools_changed = _first_event(events, "tools_changed")
resources_changed = _first_event(events, "resources_changed")
prompts_changed = _first_event(events, "prompts_changed")
catalog_changed = _first_event(events, "catalog_changed")
assert tools_changed.connection_id == "demo.personal"
assert tools_changed.payload["node_count"] == 1
assert resources_changed.payload["resource_count"] == 1
assert prompts_changed.payload["prompt_count"] == 1
assert catalog_changed.payload["reason"] == "catalog_refresh"
def _first_event(events: Sequence[McpEvent], kind: str) -> McpEvent:
for event in events:
if event.kind == kind:
return event
raise AssertionError(f"expected event {kind!r}")