pythonasyncioeventletgeventlong-pollinglow-latencysocket-iosocketiosocketio-serverweb-serverwebsocket
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
7.2 KiB
216 lines
7.2 KiB
import asyncio
|
|
from unittest import mock
|
|
|
|
import pytest
|
|
|
|
from socketio import AsyncSimpleClient
|
|
from socketio.exceptions import DisconnectedError, SocketIOError, TimeoutError
|
|
|
|
|
|
class TestAsyncAsyncSimpleClient:
|
|
async def test_constructor(self):
|
|
client = AsyncSimpleClient(1, "2", a="3", b=4)
|
|
assert client.client_args == (1, "2")
|
|
assert client.client_kwargs == {"a": "3", "b": 4}
|
|
assert client.client is None
|
|
assert client.input_buffer == []
|
|
assert not client.connected
|
|
|
|
async def test_connect(self):
|
|
mock_client = mock.MagicMock()
|
|
original_client_class = AsyncSimpleClient.client_class
|
|
AsyncSimpleClient.client_class = mock_client
|
|
|
|
client = AsyncSimpleClient(123, a="b")
|
|
mock_client.return_value.connect = mock.AsyncMock()
|
|
|
|
await client.connect(
|
|
"url",
|
|
headers="h",
|
|
auth="a",
|
|
transports="t",
|
|
namespace="n",
|
|
socketio_path="s",
|
|
wait_timeout="w",
|
|
)
|
|
mock_client.assert_called_once_with(123, a="b")
|
|
assert client.client == mock_client()
|
|
mock_client().connect.assert_awaited_once_with(
|
|
"url",
|
|
headers="h",
|
|
auth="a",
|
|
transports="t",
|
|
namespaces=["n"],
|
|
socketio_path="s",
|
|
wait_timeout="w",
|
|
)
|
|
mock_client().event.call_count == 3
|
|
mock_client().on.assert_called_once_with("*", namespace="n")
|
|
assert client.namespace == "n"
|
|
assert not client.input_event.is_set()
|
|
|
|
AsyncSimpleClient.client_class = original_client_class
|
|
|
|
async def test_connect_context_manager(self):
|
|
mock_client = mock.MagicMock()
|
|
original_client_class = AsyncSimpleClient.client_class
|
|
AsyncSimpleClient.client_class = mock_client
|
|
|
|
async with AsyncSimpleClient(123, a="b") as client:
|
|
mock_client.return_value.connect = mock.AsyncMock()
|
|
|
|
await client.connect(
|
|
"url",
|
|
headers="h",
|
|
auth="a",
|
|
transports="t",
|
|
namespace="n",
|
|
socketio_path="s",
|
|
wait_timeout="w",
|
|
)
|
|
mock_client.assert_called_once_with(123, a="b")
|
|
assert client.client == mock_client()
|
|
mock_client().connect.assert_awaited_once_with(
|
|
"url",
|
|
headers="h",
|
|
auth="a",
|
|
transports="t",
|
|
namespaces=["n"],
|
|
socketio_path="s",
|
|
wait_timeout="w",
|
|
)
|
|
mock_client().event.call_count == 3
|
|
mock_client().on.assert_called_once_with("*", namespace="n")
|
|
assert client.namespace == "n"
|
|
assert not client.input_event.is_set()
|
|
|
|
AsyncSimpleClient.client_class = original_client_class
|
|
|
|
async def test_connect_twice(self):
|
|
client = AsyncSimpleClient(123, a="b")
|
|
client.client = mock.MagicMock()
|
|
client.connected = True
|
|
|
|
with pytest.raises(RuntimeError):
|
|
await client.connect("url")
|
|
|
|
async def test_properties(self):
|
|
client = AsyncSimpleClient()
|
|
client.client = mock.MagicMock(transport="websocket")
|
|
client.client.get_sid.return_value = "sid"
|
|
client.connected_event.set()
|
|
client.connected = True
|
|
|
|
assert client.sid == "sid"
|
|
assert client.transport == "websocket"
|
|
|
|
async def test_emit(self):
|
|
client = AsyncSimpleClient()
|
|
client.client = mock.MagicMock()
|
|
client.client.emit = mock.AsyncMock()
|
|
client.namespace = "/ns"
|
|
client.connected_event.set()
|
|
client.connected = True
|
|
|
|
await client.emit("foo", "bar")
|
|
client.client.emit.assert_awaited_once_with("foo", "bar", namespace="/ns")
|
|
|
|
async def test_emit_disconnected(self):
|
|
client = AsyncSimpleClient()
|
|
client.connected_event.set()
|
|
client.connected = False
|
|
with pytest.raises(DisconnectedError):
|
|
await client.emit("foo", "bar")
|
|
|
|
async def test_emit_retries(self):
|
|
client = AsyncSimpleClient()
|
|
client.connected_event.set()
|
|
client.connected = True
|
|
client.client = mock.MagicMock()
|
|
client.client.emit = mock.AsyncMock()
|
|
client.client.emit.side_effect = [SocketIOError(), None]
|
|
|
|
await client.emit("foo", "bar")
|
|
client.client.emit.assert_awaited_with("foo", "bar", namespace="/")
|
|
|
|
async def test_call(self):
|
|
client = AsyncSimpleClient()
|
|
client.client = mock.MagicMock()
|
|
client.client.call = mock.AsyncMock()
|
|
client.client.call.return_value = "result"
|
|
client.namespace = "/ns"
|
|
client.connected_event.set()
|
|
client.connected = True
|
|
|
|
assert await client.call("foo", "bar") == "result"
|
|
client.client.call.assert_awaited_once_with(
|
|
"foo", "bar", namespace="/ns", timeout=60
|
|
)
|
|
|
|
async def test_call_disconnected(self):
|
|
client = AsyncSimpleClient()
|
|
client.connected_event.set()
|
|
client.connected = False
|
|
with pytest.raises(DisconnectedError):
|
|
await client.call("foo", "bar")
|
|
|
|
async def test_call_retries(self):
|
|
client = AsyncSimpleClient()
|
|
client.connected_event.set()
|
|
client.connected = True
|
|
client.client = mock.MagicMock()
|
|
client.client.call = mock.AsyncMock()
|
|
client.client.call.side_effect = [SocketIOError(), "result"]
|
|
|
|
assert await client.call("foo", "bar") == "result"
|
|
client.client.call.assert_awaited_with("foo", "bar", namespace="/", timeout=60)
|
|
|
|
async def test_receive_with_input_buffer(self):
|
|
client = AsyncSimpleClient()
|
|
client.input_buffer = ["foo", "bar"]
|
|
assert await client.receive() == "foo"
|
|
assert await client.receive() == "bar"
|
|
|
|
async def test_receive_without_input_buffer(self):
|
|
client = AsyncSimpleClient()
|
|
client.connected_event.set()
|
|
client.connected = True
|
|
client.input_event = mock.MagicMock()
|
|
|
|
async def fake_wait(timeout=None):
|
|
client.input_buffer = ["foo"]
|
|
return True
|
|
|
|
client.input_event.wait = fake_wait
|
|
assert await client.receive() == "foo"
|
|
|
|
async def test_receive_with_timeout(self):
|
|
client = AsyncSimpleClient()
|
|
client.connected_event.set()
|
|
client.connected = True
|
|
client.input_event = mock.MagicMock()
|
|
|
|
async def fake_wait(timeout=None):
|
|
await asyncio.sleep(1)
|
|
|
|
client.input_event.wait = fake_wait
|
|
with pytest.raises(TimeoutError):
|
|
await client.receive(timeout=0.01)
|
|
|
|
async def test_receive_disconnected(self):
|
|
client = AsyncSimpleClient()
|
|
client.connected_event.set()
|
|
client.connected = False
|
|
with pytest.raises(DisconnectedError):
|
|
await client.receive()
|
|
|
|
async def test_disconnect(self):
|
|
client = AsyncSimpleClient()
|
|
mc = mock.MagicMock()
|
|
mc.disconnect = mock.AsyncMock()
|
|
client.client = mc
|
|
client.connected = True
|
|
await client.disconnect()
|
|
await client.disconnect()
|
|
mc.disconnect.assert_awaited_once_with()
|
|
assert client.client is None
|
|
|