5 changed files with 716 additions and 36 deletions
@ -0,0 +1,621 @@ |
|||
import sys |
|||
import unittest |
|||
|
|||
import six |
|||
if six.PY3: |
|||
from unittest import mock |
|||
else: |
|||
import mock |
|||
|
|||
from engineio import exceptions as engineio_exceptions |
|||
from socketio import exceptions |
|||
from socketio import packet |
|||
if six.PY3: |
|||
import asyncio |
|||
from asyncio import coroutine |
|||
from socketio import asyncio_client |
|||
from socketio import asyncio_namespace |
|||
else: |
|||
# mock coroutine so that Python 2 doesn't complain |
|||
def coroutine(f): |
|||
return f |
|||
|
|||
|
|||
def AsyncMock(*args, **kwargs): |
|||
"""Return a mock asynchronous function.""" |
|||
m = mock.MagicMock(*args, **kwargs) |
|||
|
|||
@coroutine |
|||
def mock_coro(*args, **kwargs): |
|||
return m(*args, **kwargs) |
|||
|
|||
mock_coro.mock = m |
|||
return mock_coro |
|||
|
|||
|
|||
def _run(coro): |
|||
"""Run the given coroutine.""" |
|||
return asyncio.get_event_loop().run_until_complete(coro) |
|||
|
|||
|
|||
@unittest.skipIf(sys.version_info < (3, 5), 'only for Python 3.5+') |
|||
class TestAsyncClient(unittest.TestCase): |
|||
def test_is_asyncio_based(self): |
|||
c = asyncio_client.AsyncClient() |
|||
self.assertEqual(c.is_asyncio_based(), True) |
|||
|
|||
def test_connect(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.connect = AsyncMock() |
|||
_run(c.connect('url', headers='headers', transports='transports', |
|||
namespaces=['/foo', '/', '/bar'], |
|||
socketio_path='path')) |
|||
self.assertEqual(c.connection_url, 'url') |
|||
self.assertEqual(c.connection_headers, 'headers') |
|||
self.assertEqual(c.connection_transports, 'transports') |
|||
self.assertEqual(c.connection_namespaces, ['/foo', '/', '/bar']) |
|||
self.assertEqual(c.socketio_path, 'path') |
|||
self.assertEqual(c.namespaces, ['/foo', '/bar']) |
|||
c.eio.connect.mock.assert_called_once_with( |
|||
'url', headers='headers', transports='transports', |
|||
engineio_path='path') |
|||
|
|||
def test_connect_default_namespaces(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.connect = AsyncMock() |
|||
c.on('foo', mock.MagicMock(), namespace='/foo') |
|||
c.on('bar', mock.MagicMock(), namespace='/') |
|||
_run(c.connect('url', headers='headers', transports='transports', |
|||
socketio_path='path')) |
|||
self.assertEqual(c.connection_url, 'url') |
|||
self.assertEqual(c.connection_headers, 'headers') |
|||
self.assertEqual(c.connection_transports, 'transports') |
|||
self.assertEqual(c.connection_namespaces, None) |
|||
self.assertEqual(c.socketio_path, 'path') |
|||
self.assertEqual(c.namespaces, ['/foo']) |
|||
c.eio.connect.mock.assert_called_once_with( |
|||
'url', headers='headers', transports='transports', |
|||
engineio_path='path') |
|||
|
|||
def test_connect_error(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.connect = AsyncMock( |
|||
side_effect=engineio_exceptions.ConnectionError('foo')) |
|||
c.on('foo', mock.MagicMock(), namespace='/foo') |
|||
c.on('bar', mock.MagicMock(), namespace='/') |
|||
self.assertRaises( |
|||
exceptions.ConnectionError, _run, c.connect( |
|||
'url', headers='headers', transports='transports', |
|||
socketio_path='path')) |
|||
|
|||
def test_wait_no_reconnect(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.wait = AsyncMock() |
|||
c.sleep = AsyncMock() |
|||
c._reconnect_task = None |
|||
_run(c.wait()) |
|||
c.eio.wait.mock.assert_called_once_with() |
|||
c.sleep.mock.assert_called_once_with(1) |
|||
|
|||
def test_wait_reconnect_failed(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.wait = AsyncMock() |
|||
c.sleep = AsyncMock() |
|||
states = ['disconnected'] |
|||
|
|||
@coroutine |
|||
def fake_wait(): |
|||
c.eio.state = states.pop(0) |
|||
|
|||
c._reconnect_task = fake_wait() |
|||
_run(c.wait()) |
|||
c.eio.wait.mock.assert_called_once_with() |
|||
c.sleep.mock.assert_called_once_with(1) |
|||
|
|||
def test_wait_reconnect_successful(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.wait = AsyncMock() |
|||
c.sleep = AsyncMock() |
|||
states = ['connected', 'disconnected'] |
|||
|
|||
@coroutine |
|||
def fake_wait(): |
|||
c.eio.state = states.pop(0) |
|||
c._reconnect_task = fake_wait() |
|||
|
|||
c._reconnect_task = fake_wait() |
|||
_run(c.wait()) |
|||
self.assertEqual(c.eio.wait.mock.call_count, 2) |
|||
self.assertEqual(c.sleep.mock.call_count, 2) |
|||
|
|||
def test_emit_no_arguments(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._send_packet = AsyncMock() |
|||
_run(c.emit('foo')) |
|||
expected_packet = packet.Packet(packet.EVENT, namespace='/', |
|||
data=['foo'], id=None, binary=False) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_emit_one_argument(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._send_packet = AsyncMock() |
|||
_run(c.emit('foo', 'bar')) |
|||
expected_packet = packet.Packet(packet.EVENT, namespace='/', |
|||
data=['foo', 'bar'], id=None, |
|||
binary=False) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_emit_one_argument_list(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._send_packet = AsyncMock() |
|||
_run(c.emit('foo', ['bar', 'baz'])) |
|||
expected_packet = packet.Packet(packet.EVENT, namespace='/', |
|||
data=['foo', ['bar', 'baz']], id=None, |
|||
binary=False) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_emit_two_arguments(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._send_packet = AsyncMock() |
|||
_run(c.emit('foo', ('bar', 'baz'))) |
|||
expected_packet = packet.Packet(packet.EVENT, namespace='/', |
|||
data=['foo', 'bar', 'baz'], id=None, |
|||
binary=False) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_emit_namespace(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._send_packet = AsyncMock() |
|||
_run(c.emit('foo', namespace='/foo')) |
|||
expected_packet = packet.Packet(packet.EVENT, namespace='/foo', |
|||
data=['foo'], id=None, binary=False) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_emit_with_callback(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._send_packet = AsyncMock() |
|||
c._generate_ack_id = mock.MagicMock(return_value=123) |
|||
_run(c.emit('foo', callback='cb')) |
|||
expected_packet = packet.Packet(packet.EVENT, namespace='/', |
|||
data=['foo'], id=123, binary=False) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
c._generate_ack_id.assert_called_once_with('/', 'cb') |
|||
|
|||
def test_emit_namespace_with_callback(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._send_packet = AsyncMock() |
|||
c._generate_ack_id = mock.MagicMock(return_value=123) |
|||
_run(c.emit('foo', namespace='/foo', callback='cb')) |
|||
expected_packet = packet.Packet(packet.EVENT, namespace='/foo', |
|||
data=['foo'], id=123, binary=False) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
c._generate_ack_id.assert_called_once_with('/foo', 'cb') |
|||
|
|||
def test_emit_binary(self): |
|||
c = asyncio_client.AsyncClient(binary=True) |
|||
c._send_packet = AsyncMock() |
|||
_run(c.emit('foo', b'bar')) |
|||
expected_packet = packet.Packet(packet.EVENT, namespace='/', |
|||
data=['foo', b'bar'], id=None, |
|||
binary=True) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_emit_not_binary(self): |
|||
c = asyncio_client.AsyncClient(binary=False) |
|||
c._send_packet = AsyncMock() |
|||
_run(c.emit('foo', 'bar')) |
|||
expected_packet = packet.Packet(packet.EVENT, namespace='/', |
|||
data=['foo', 'bar'], id=None, |
|||
binary=False) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_send(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.emit = AsyncMock() |
|||
_run(c.send('data', 'namespace', 'callback')) |
|||
c.emit.mock.assert_called_once_with( |
|||
'message', data='data', namespace='namespace', |
|||
callback='callback') |
|||
|
|||
def test_send_with_defaults(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.emit = AsyncMock() |
|||
_run(c.send('data')) |
|||
c.emit.mock.assert_called_once_with( |
|||
'message', data='data', namespace=None, callback=None) |
|||
|
|||
def test_disconnect(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._trigger_event = AsyncMock() |
|||
c._send_packet = AsyncMock() |
|||
_run(c.disconnect()) |
|||
c._trigger_event.mock.assert_called_once_with( |
|||
'disconnect', namespace='/') |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
expected_packet = packet.Packet(packet.DISCONNECT, namespace='/') |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_disconnect_namespaces(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.namespaces = ['/foo', '/bar'] |
|||
c._trigger_event = AsyncMock() |
|||
c._send_packet = AsyncMock() |
|||
_run(c.disconnect()) |
|||
self.assertEqual(c._trigger_event.mock.call_args_list, [ |
|||
mock.call('disconnect', namespace='/foo'), |
|||
mock.call('disconnect', namespace='/bar'), |
|||
mock.call('disconnect', namespace='/') |
|||
]) |
|||
self.assertEqual(c._send_packet.mock.call_count, 3) |
|||
expected_packet = packet.Packet(packet.DISCONNECT, namespace='/foo') |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
expected_packet = packet.Packet(packet.DISCONNECT, namespace='/bar') |
|||
self.assertEqual(c._send_packet.mock.call_args_list[1][0][0].encode(), |
|||
expected_packet.encode()) |
|||
expected_packet = packet.Packet(packet.DISCONNECT, namespace='/') |
|||
self.assertEqual(c._send_packet.mock.call_args_list[2][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_start_background_task(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.start_background_task = mock.MagicMock(return_value='foo') |
|||
self.assertEqual(c.start_background_task('foo', 'bar', baz='baz'), |
|||
'foo') |
|||
c.eio.start_background_task.assert_called_once_with('foo', 'bar', |
|||
baz='baz') |
|||
|
|||
def test_sleep(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.sleep = AsyncMock() |
|||
_run(c.sleep(1.23)) |
|||
c.eio.sleep.mock.assert_called_once_with(1.23) |
|||
|
|||
def test_send_packet(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.send = AsyncMock() |
|||
_run(c._send_packet(packet.Packet(packet.EVENT, 'foo', binary=False))) |
|||
c.eio.send.mock.assert_called_once_with('2"foo"', binary=False) |
|||
|
|||
def test_send_packet_binary(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.send = AsyncMock() |
|||
_run(c._send_packet(packet.Packet(packet.EVENT, b'foo', binary=True))) |
|||
self.assertTrue(c.eio.send.mock.call_args_list == [ |
|||
mock.call('51-{"_placeholder":true,"num":0}', binary=False), |
|||
mock.call(b'foo', binary=True) |
|||
] or c.eio.send.mock.call_args_list == [ |
|||
mock.call('51-{"num":0,"_placeholder":true}', binary=False), |
|||
mock.call(b'foo', binary=True) |
|||
]) |
|||
|
|||
def test_send_packet_default_binary_py3(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.eio.send = AsyncMock() |
|||
_run(c._send_packet(packet.Packet(packet.EVENT, 'foo'))) |
|||
c.eio.send.mock.assert_called_once_with('2"foo"', binary=False) |
|||
|
|||
def test_handle_connect(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._trigger_event = AsyncMock() |
|||
c._send_packet = AsyncMock() |
|||
_run(c._handle_connect('/')) |
|||
c._trigger_event.mock.assert_called_once_with('connect', namespace='/') |
|||
c._send_packet.mock.assert_not_called() |
|||
|
|||
def test_handle_connect_with_namespaces(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.namespaces = ['/foo', '/bar'] |
|||
c._trigger_event = AsyncMock() |
|||
c._send_packet = AsyncMock() |
|||
_run(c._handle_connect('/')) |
|||
c._trigger_event.mock.assert_called_once_with('connect', namespace='/') |
|||
self.assertEqual(c._send_packet.mock.call_count, 2) |
|||
expected_packet = packet.Packet(packet.CONNECT, namespace='/foo') |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
expected_packet = packet.Packet(packet.CONNECT, namespace='/bar') |
|||
self.assertEqual(c._send_packet.mock.call_args_list[1][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_handle_connect_namespace(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.namespaces = ['/foo'] |
|||
c._trigger_event = AsyncMock() |
|||
c._send_packet = AsyncMock() |
|||
_run(c._handle_connect('/foo')) |
|||
_run(c._handle_connect('/bar')) |
|||
self.assertEqual(c._trigger_event.mock.call_args_list, [ |
|||
mock.call('connect', namespace='/foo'), |
|||
mock.call('connect', namespace='/bar') |
|||
]) |
|||
c._send_packet.mock.assert_not_called() |
|||
self.assertEqual(c.namespaces, ['/foo', '/bar']) |
|||
|
|||
def test_handle_disconnect(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._trigger_event = AsyncMock() |
|||
_run(c._handle_disconnect('/')) |
|||
c._trigger_event.mock.assert_called_once_with( |
|||
'disconnect', namespace='/') |
|||
|
|||
def test_handle_disconnect_namespace(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.namespaces = ['/foo', '/bar'] |
|||
c._trigger_event = AsyncMock() |
|||
_run(c._handle_disconnect('/foo')) |
|||
c._trigger_event.mock.assert_called_once_with( |
|||
'disconnect', namespace='/foo') |
|||
self.assertEqual(c.namespaces, ['/bar']) |
|||
|
|||
def test_handle_disconnect_unknown_namespace(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.namespaces = ['/foo', '/bar'] |
|||
c._trigger_event = AsyncMock() |
|||
_run(c._handle_disconnect('/baz')) |
|||
c._trigger_event.mock.assert_called_once_with( |
|||
'disconnect', namespace='/baz') |
|||
self.assertEqual(c.namespaces, ['/foo', '/bar']) |
|||
|
|||
def test_handle_event(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._trigger_event = AsyncMock() |
|||
_run(c._handle_event('/', None, ['foo', ('bar', 'baz')])) |
|||
c._trigger_event.mock.assert_called_once_with( |
|||
'foo', '/', ('bar', 'baz')) |
|||
|
|||
def test_handle_event_with_id_no_arguments(self): |
|||
c = asyncio_client.AsyncClient(binary=True) |
|||
c._trigger_event = AsyncMock(return_value=None) |
|||
c._send_packet = AsyncMock() |
|||
_run(c._handle_event('/', 123, ['foo', ('bar', 'baz')])) |
|||
c._trigger_event.mock.assert_called_once_with( |
|||
'foo', '/', ('bar', 'baz')) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
expected_packet = packet.Packet(packet.ACK, namespace='/', id=123, |
|||
data=[], binary=None) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_handle_event_with_id_one_argument(self): |
|||
c = asyncio_client.AsyncClient(binary=True) |
|||
c._trigger_event = AsyncMock(return_value='ret') |
|||
c._send_packet = AsyncMock() |
|||
_run(c._handle_event('/', 123, ['foo', ('bar', 'baz')])) |
|||
c._trigger_event.mock.assert_called_once_with( |
|||
'foo', '/', ('bar', 'baz')) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
expected_packet = packet.Packet(packet.ACK, namespace='/', id=123, |
|||
data=['ret'], binary=None) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_handle_event_with_id_one_list_argument(self): |
|||
c = asyncio_client.AsyncClient(binary=True) |
|||
c._trigger_event = AsyncMock(return_value=['a', 'b']) |
|||
c._send_packet = AsyncMock() |
|||
_run(c._handle_event('/', 123, ['foo', ('bar', 'baz')])) |
|||
c._trigger_event.mock.assert_called_once_with( |
|||
'foo', '/', ('bar', 'baz')) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
expected_packet = packet.Packet(packet.ACK, namespace='/', id=123, |
|||
data=[['a', 'b']], binary=None) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_handle_event_with_id_two_arguments(self): |
|||
c = asyncio_client.AsyncClient(binary=True) |
|||
c._trigger_event = AsyncMock(return_value=('a', 'b')) |
|||
c._send_packet = AsyncMock() |
|||
_run(c._handle_event('/', 123, ['foo', ('bar', 'baz')])) |
|||
c._trigger_event.mock.assert_called_once_with( |
|||
'foo', '/', ('bar', 'baz')) |
|||
self.assertEqual(c._send_packet.mock.call_count, 1) |
|||
expected_packet = packet.Packet(packet.ACK, namespace='/', id=123, |
|||
data=['a', 'b'], binary=None) |
|||
self.assertEqual(c._send_packet.mock.call_args_list[0][0][0].encode(), |
|||
expected_packet.encode()) |
|||
|
|||
def test_handle_ack(self): |
|||
c = asyncio_client.AsyncClient() |
|||
mock_cb = mock.MagicMock() |
|||
c.callbacks['/foo'] = {123: mock_cb} |
|||
_run(c._handle_ack('/foo', 123, ['bar', 'baz'])) |
|||
mock_cb.assert_called_once_with('bar', 'baz') |
|||
self.assertNotIn(123, c.callbacks['/foo']) |
|||
|
|||
def test_handle_ack_async(self): |
|||
c = asyncio_client.AsyncClient() |
|||
mock_cb = AsyncMock() |
|||
c.callbacks['/foo'] = {123: mock_cb} |
|||
_run(c._handle_ack('/foo', 123, ['bar', 'baz'])) |
|||
mock_cb.mock.assert_called_once_with('bar', 'baz') |
|||
self.assertNotIn(123, c.callbacks['/foo']) |
|||
|
|||
def test_handle_ack_not_found(self): |
|||
c = asyncio_client.AsyncClient() |
|||
mock_cb = mock.MagicMock() |
|||
c.callbacks['/foo'] = {123: mock_cb} |
|||
_run(c._handle_ack('/foo', 124, ['bar', 'baz'])) |
|||
mock_cb.assert_not_called() |
|||
self.assertIn(123, c.callbacks['/foo']) |
|||
|
|||
def test_handle_error(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.namespaces = ['/foo', '/bar'] |
|||
c._handle_error('/bar') |
|||
self.assertEqual(c.namespaces, ['/foo']) |
|||
|
|||
def test_handle_error_unknown_namespace(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.namespaces = ['/foo', '/bar'] |
|||
c._handle_error('/baz') |
|||
self.assertEqual(c.namespaces, ['/foo', '/bar']) |
|||
|
|||
def test_trigger_event(self): |
|||
c = asyncio_client.AsyncClient() |
|||
handler = mock.MagicMock() |
|||
c.on('foo', handler) |
|||
_run(c._trigger_event('foo', '/', 1, '2')) |
|||
handler.assert_called_once_with(1, '2') |
|||
|
|||
def test_trigger_event_namespace(self): |
|||
c = asyncio_client.AsyncClient() |
|||
handler = AsyncMock() |
|||
c.on('foo', handler, namespace='/bar') |
|||
_run(c._trigger_event('foo', '/bar', 1, '2')) |
|||
handler.mock.assert_called_once_with(1, '2') |
|||
|
|||
def test_trigger_event_class_namespace(self): |
|||
c = asyncio_client.AsyncClient() |
|||
result = [] |
|||
|
|||
class MyNamespace(asyncio_namespace.AsyncClientNamespace): |
|||
def on_foo(self, a, b): |
|||
result.append(a) |
|||
result.append(b) |
|||
|
|||
c.register_namespace(MyNamespace('/')) |
|||
_run(c._trigger_event('foo', '/', 1, '2')) |
|||
self.assertEqual(result, [1, '2']) |
|||
|
|||
@mock.patch('socketio.client.random.random', side_effect=[1, 0, 0.5]) |
|||
def test_handle_reconnect(self, random): |
|||
c = asyncio_client.AsyncClient() |
|||
c._reconnect_task = 'foo' |
|||
c.sleep = AsyncMock() |
|||
c.connect = AsyncMock( |
|||
side_effect=[ValueError, exceptions.ConnectionError, None]) |
|||
_run(c._handle_reconnect()) |
|||
self.assertEqual(c.sleep.mock.call_count, 3) |
|||
self.assertEqual(c.sleep.mock.call_args_list, [ |
|||
mock.call(1.5), |
|||
mock.call(1.5), |
|||
mock.call(4.0) |
|||
]) |
|||
self.assertEqual(c._reconnect_task, None) |
|||
|
|||
@mock.patch('socketio.client.random.random', side_effect=[1, 0, 0.5]) |
|||
def test_handle_reconnect_max_delay(self, random): |
|||
c = asyncio_client.AsyncClient(reconnection_delay_max=3) |
|||
c._reconnect_task = 'foo' |
|||
c.sleep = AsyncMock() |
|||
c.connect = AsyncMock( |
|||
side_effect=[ValueError, exceptions.ConnectionError, None]) |
|||
_run(c._handle_reconnect()) |
|||
self.assertEqual(c.sleep.mock.call_count, 3) |
|||
self.assertEqual(c.sleep.mock.call_args_list, [ |
|||
mock.call(1.5), |
|||
mock.call(1.5), |
|||
mock.call(3.0) |
|||
]) |
|||
self.assertEqual(c._reconnect_task, None) |
|||
|
|||
@mock.patch('socketio.client.random.random', side_effect=[1, 0, 0.5]) |
|||
def test_handle_reconnect_max_attempts(self, random): |
|||
c = asyncio_client.AsyncClient(reconnection_attempts=2) |
|||
c._reconnect_task = 'foo' |
|||
c.sleep = AsyncMock() |
|||
c.connect = AsyncMock( |
|||
side_effect=[ValueError, exceptions.ConnectionError, None]) |
|||
_run(c._handle_reconnect()) |
|||
self.assertEqual(c.sleep.mock.call_count, 2) |
|||
self.assertEqual(c.sleep.mock.call_args_list, [ |
|||
mock.call(1.5), |
|||
mock.call(1.5) |
|||
]) |
|||
self.assertEqual(c._reconnect_task, 'foo') |
|||
|
|||
def test_handle_eio_message(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._handle_connect = AsyncMock() |
|||
c._handle_disconnect = AsyncMock() |
|||
c._handle_event = AsyncMock() |
|||
c._handle_ack = AsyncMock() |
|||
c._handle_error = mock.MagicMock() |
|||
|
|||
_run(c._handle_eio_message('0')) |
|||
c._handle_connect.mock.assert_called_with(None) |
|||
_run(c._handle_eio_message('0/foo')) |
|||
c._handle_connect.mock.assert_called_with('/foo') |
|||
_run(c._handle_eio_message('1')) |
|||
c._handle_disconnect.mock.assert_called_with(None) |
|||
_run(c._handle_eio_message('1/foo')) |
|||
c._handle_disconnect.mock.assert_called_with('/foo') |
|||
_run(c._handle_eio_message('2["foo"]')) |
|||
c._handle_event.mock.assert_called_with(None, None, ['foo']) |
|||
_run(c._handle_eio_message('3/foo,["bar"]')) |
|||
c._handle_ack.mock.assert_called_with('/foo', None, ['bar']) |
|||
_run(c._handle_eio_message('4')) |
|||
c._handle_error.assert_called_with(None) |
|||
_run(c._handle_eio_message('4/foo')) |
|||
c._handle_error.assert_called_with('/foo') |
|||
_run(c._handle_eio_message('51-{"_placeholder":true,"num":0}')) |
|||
self.assertEqual(c._binary_packet.packet_type, packet.BINARY_EVENT) |
|||
_run(c._handle_eio_message(b'foo')) |
|||
c._handle_event.mock.assert_called_with(None, None, b'foo') |
|||
_run(c._handle_eio_message( |
|||
'62-/foo,{"1":{"_placeholder":true,"num":1},' |
|||
'"2":{"_placeholder":true,"num":0}}')) |
|||
self.assertEqual(c._binary_packet.packet_type, packet.BINARY_ACK) |
|||
_run(c._handle_eio_message(b'bar')) |
|||
_run(c._handle_eio_message(b'foo')) |
|||
c._handle_ack.mock.assert_called_with('/foo', None, {'1': b'foo', |
|||
'2': b'bar'}) |
|||
self.assertRaises(ValueError, _run, c._handle_eio_message('9')) |
|||
|
|||
def test_eio_disconnect(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c._trigger_event = AsyncMock() |
|||
_run(c._handle_eio_disconnect()) |
|||
c._trigger_event.mock.assert_called_once_with( |
|||
'disconnect', namespace='/') |
|||
|
|||
def test_eio_disconnect_namespaces(self): |
|||
c = asyncio_client.AsyncClient() |
|||
c.namespaces = ['/foo', '/bar'] |
|||
c._trigger_event = AsyncMock() |
|||
_run(c._handle_eio_disconnect()) |
|||
c._trigger_event.mock.assert_any_call('disconnect', namespace='/foo') |
|||
c._trigger_event.mock.assert_any_call('disconnect', namespace='/bar') |
|||
c._trigger_event.mock.assert_any_call('disconnect', namespace='/') |
|||
|
|||
def test_eio_disconnect_reconnect(self): |
|||
c = asyncio_client.AsyncClient(reconnection=True) |
|||
c.start_background_task = mock.MagicMock() |
|||
c.eio.state = 'connected' |
|||
_run(c._handle_eio_disconnect()) |
|||
c.start_background_task.assert_called_once_with(c._handle_reconnect) |
|||
|
|||
def test_eio_disconnect_self_disconnect(self): |
|||
c = asyncio_client.AsyncClient(reconnection=True) |
|||
c.start_background_task = mock.MagicMock() |
|||
c.eio.state = 'disconnected' |
|||
_run(c._handle_eio_disconnect()) |
|||
c.start_background_task.assert_not_called() |
|||
|
|||
def test_eio_disconnect_no_reconnect(self): |
|||
c = asyncio_client.AsyncClient(reconnection=False) |
|||
c.start_background_task = mock.MagicMock() |
|||
c.eio.state = 'connected' |
|||
_run(c._handle_eio_disconnect()) |
|||
c.start_background_task.assert_not_called() |
Loading…
Reference in new issue