test: migrate service async tests

This commit is contained in:
lda
2026-06-04 19:12:12 +07:00 Unverified
parent f9673a4ad0
commit e001b524d6
8 changed files with 163 additions and 213 deletions
+29 -37
View File
@@ -1,6 +1,5 @@
from __future__ import annotations
import asyncio
from typing import Any, cast
from wf_authoring import build_async_registry
@@ -19,7 +18,7 @@ from ..test_support import (
)
def test_service_records_tool_call_events() -> None:
async def test_service_records_tool_call_events() -> None:
from wf_core import END, RunStatus
from ..test_support import input_binding, output_binding
@@ -31,7 +30,7 @@ def test_service_records_tool_call_events() -> None:
)
service.register_adapter("demo", FakeAdapter())
asyncio.run(service.refresh_connection_catalog("demo.personal"))
await service.refresh_connection_catalog("demo.personal")
plan = raw_plan(
name="tool_event_plan",
@@ -59,7 +58,7 @@ def test_service_records_tool_call_events() -> None:
edges=[{"from": "echo", "outcome": "ok", "to": END}],
)
run = asyncio.run(service.run_workflow_from_plan(plan, {"text": "hello"}))
run = await service.run_workflow_from_plan(plan, {"text": "hello"})
assert run.status == RunStatus.COMPLETED
tool_events = [
@@ -73,7 +72,7 @@ def test_service_records_tool_call_events() -> None:
assert tool_events[1].payload["outcome"] == "ok"
def test_service_rejects_text_binding_for_raw_mcp_content_contract() -> None:
async def test_service_rejects_text_binding_for_raw_mcp_content_contract() -> None:
from wf_core import END
from ..test_support import input_binding, output_binding
@@ -84,7 +83,7 @@ def test_service_rejects_text_binding_for_raw_mcp_content_contract() -> None:
ConnectionConfig(id="demo.personal", server="demo", account="personal")
)
service.register_adapter("demo", ContentOnlyOutputAdapter())
asyncio.run(service.refresh_connection_catalog("demo.personal"))
await service.refresh_connection_catalog("demo.personal")
plan = raw_plan(
name="raw_content_contract",
input_schema={
@@ -127,14 +126,14 @@ def test_service_rejects_text_binding_for_raw_mcp_content_contract() -> None:
)
def test_service_can_inspect_resources_and_prompts() -> None:
async def test_service_can_inspect_resources_and_prompts() -> None:
service = WfMcpService(store=FileStore(local_temp_root() / "inspect_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"))
await service.refresh_connection_catalog("demo.personal")
resources = service.list_resources(connection_id="demo.personal")
prompts = service.list_prompts(connection_id="demo.personal")
@@ -153,7 +152,7 @@ def test_service_can_inspect_resources_and_prompts() -> None:
assert prompt.arguments[0]["name"] == "text"
def test_service_reports_connection_statuses() -> None:
async def test_service_reports_connection_statuses() -> None:
import shutil
store = local_temp_root() / "status_store"
@@ -180,7 +179,7 @@ def test_service_reports_connection_statuses() -> None:
}
]
asyncio.run(service.refresh_connection_catalog("demo.personal"))
await service.refresh_connection_catalog("demo.personal")
after = service.connection_statuses()
assert after[0]["has_snapshot"] is True
assert after[0]["node_count"] == 1
@@ -188,7 +187,7 @@ def test_service_reports_connection_statuses() -> None:
assert after[0]["prompt_count"] == 1
def test_service_can_proxy_resource_reads_and_prompt_gets() -> None:
async def test_service_can_proxy_resource_reads_and_prompt_gets() -> None:
import shutil
store = local_temp_root() / "proxy_store"
@@ -199,16 +198,12 @@ def test_service_can_proxy_resource_reads_and_prompt_gets() -> None:
)
service.register_adapter("demo", FakeAdapter())
asyncio.run(service.refresh_connection_catalog("demo.personal"))
await service.refresh_connection_catalog("demo.personal")
resource_result = asyncio.run(
service.read_resource("demo.personal.resource.welcome")
)
prompt_result = asyncio.run(
service.render_prompt(
"demo.personal.prompt.summarize",
arguments={"text": "hello world"},
)
resource_result = await service.read_resource("demo.personal.resource.welcome")
prompt_result = await service.render_prompt(
"demo.personal.prompt.summarize",
arguments={"text": "hello world"},
)
assert (
@@ -227,22 +222,20 @@ def test_service_can_proxy_resource_reads_and_prompt_gets() -> None:
assert "prompt_get_completed" in event_kinds
def test_service_can_invoke_raw_method_and_notification() -> None:
async def test_service_can_invoke_raw_method_and_notification() -> None:
service = WfMcpService(store=FileStore(local_temp_root() / "raw_store"))
service.register_connection(
ConnectionConfig(id="demo.personal", server="demo", account="personal")
)
service.register_adapter("demo", FakeAdapter())
result = asyncio.run(
service.invoke_method("demo.personal", "demo.echo", params={"text": "hello"})
result = await service.invoke_method(
"demo.personal", "demo.echo", params={"text": "hello"}
)
asyncio.run(
service.send_notification(
"demo.personal",
"notifications/progress",
params={"progress": 1},
)
await service.send_notification(
"demo.personal",
"notifications/progress",
params={"progress": 1},
)
assert result == {"echoed": "hello"}
@@ -253,7 +246,7 @@ def test_service_can_invoke_raw_method_and_notification() -> None:
assert "raw_notification_completed" in event_kinds
def test_generated_specs_use_injected_tool_executor() -> None:
async def test_generated_specs_use_injected_tool_executor() -> None:
class RecordingExecutor:
def __init__(self) -> None:
self.payloads: list[dict[str, Any]] = []
@@ -278,21 +271,20 @@ def test_generated_specs_use_injected_tool_executor() -> None:
)
service.register_adapter("demo", FakeAdapter())
asyncio.run(service.refresh_connection_catalog("demo.personal"))
await service.refresh_connection_catalog("demo.personal")
spec = service._get_qualified_spec("demo.personal.echo_tool")
handler = build_async_registry(spec)[spec.name]
async def run_node() -> dict[str, Any]:
return await handler({"text": "hello"}, RuntimeContext(current_node_id="echo"))
result = asyncio.run(run_node())
result = await handler(
{"text": "hello"}, RuntimeContext(current_node_id="echo")
)
assert result["outcome"] == "ok"
assert result["output"]["echoed"] == "hello"
assert executor.payloads == [{"text": "hello"}]
def test_service_records_catalog_refresh_failures() -> None:
async def test_service_records_catalog_refresh_failures() -> None:
service = WfMcpService(store=FileStore(local_temp_root() / "refresh_fail_store"))
service.register_connection(
ConnectionConfig(id="demo.personal", server="demo", account="personal")
@@ -300,7 +292,7 @@ def test_service_records_catalog_refresh_failures() -> None:
service.register_adapter("demo", FailingDiscoveryAdapter())
try:
asyncio.run(service.refresh_connection_catalog("demo.personal"))
await service.refresh_connection_catalog("demo.personal")
except PermissionError as exc:
assert str(exc) == "Access is denied"
else: