"""End-to-end test over WebSocket: server + client in the same event loop.""" from __future__ import annotations import pytest from aicc import AICCClient, Bridge from aicc.transport import WebSocketClientTransport, WebSocketServer @pytest.mark.asyncio async def test_websocket_roundtrip(): bridge = Bridge(name="ws-room") @bridge.tool(description="Echo a value.") async def echo(value: str = "") -> dict: return {"value": value} async with WebSocketServer(bridge, port=0) as server: # port=0 -> OS-assigned; read it back from the server object port = server._server.sockets[0].getsockname()[1] # type: ignore[union-attr] uri = f"ws://127.0.0.1:{port}" async with AICCClient(WebSocketClientTransport(uri)) as client: manifest = await client.handshake() assert manifest.world.name == "ws-room" res = await client.call_tool("echo", {"value": "hi"}) assert res.ok assert res.output == {"value": "hi"}