Skip to content

Commit 16bdb42

Browse files
more unit tests
1 parent e626e6c commit 16bdb42

File tree

7 files changed

+148
-8
lines changed

7 files changed

+148
-8
lines changed

socketio/asgi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import engineio
22

33

4-
class ASGIApp(engineio.ASGIApp):
4+
class ASGIApp(engineio.ASGIApp): # pragma: no cover
55
"""ASGI application middleware for Socket.IO.
66
77
This middleware dispatches traffic to an Socket.IO application. It can

socketio/asyncio_namespace.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ async def emit(self, event, data=None, namespace=None, callback=None):
120120
121121
Note: this method is a coroutine.
122122
"""
123-
return await self.server.emit(event, data=data,
123+
return await self.client.emit(event, data=data,
124124
namespace=namespace or self.namespace,
125125
callback=callback)
126126

@@ -133,7 +133,7 @@ async def send(self, data, namespace=None, callback=None):
133133
134134
Note: this method is a coroutine.
135135
"""
136-
return await self.server.send(data,
136+
return await self.client.send(data,
137137
namespace=namespace or self.namespace,
138138
callback=callback)
139139

@@ -146,5 +146,5 @@ async def disconnect(self, namespace=None):
146146
147147
Note: this method is a coroutine.
148148
"""
149-
return await self.server.disconnect(
149+
return await self.client.disconnect(
150150
namespace=namespace or self.namespace)

socketio/namespace.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def send(self, data, room=None, skip_sid=None, namespace=None,
149149
that when the ``namespace`` argument is not given the namespace
150150
associated with the class is used.
151151
"""
152-
return self.server.send(data, namespace=namespace or self.namespace,
152+
return self.client.send(data, namespace=namespace or self.namespace,
153153
callback=callback)
154154

155155
def disconnect(self, namespace=None):
@@ -159,4 +159,4 @@ def disconnect(self, namespace=None):
159159
is that when the ``namespace`` argument is not given the namespace
160160
associated with the class is used.
161161
"""
162-
return self.server.disconnect(namespace=namespace or self.namespace)
162+
return self.client.disconnect(namespace=namespace or self.namespace)

socketio/tornado.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
try:
44
from engineio.async_drivers.tornado import get_tornado_handler as \
55
get_engineio_handler
6-
except ImportError:
6+
except ImportError: # pragma: no cover
77
from engineio.async_tornado import get_tornado_handler as \
88
get_engineio_handler
99

1010

11-
def get_tornado_handler(socketio_server):
11+
def get_tornado_handler(socketio_server): # pragma: no cover
1212
return get_engineio_handler(socketio_server.eio)

tests/test_asyncio_namespace.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,37 @@ def test_disconnect(self):
179179
ns.server.disconnect.mock.assert_called_with('sid', namespace='/foo')
180180
_run(ns.disconnect('sid', namespace='/bar'))
181181
ns.server.disconnect.mock.assert_called_with('sid', namespace='/bar')
182+
183+
def test_emit_client(self):
184+
ns = asyncio_namespace.AsyncClientNamespace('/foo')
185+
mock_client = mock.MagicMock()
186+
mock_client.emit = AsyncMock()
187+
ns._set_client(mock_client)
188+
_run(ns.emit('ev', data='data', callback='cb'))
189+
ns.client.emit.mock.assert_called_with(
190+
'ev', data='data', namespace='/foo', callback='cb')
191+
_run(ns.emit('ev', data='data', namespace='/bar', callback='cb'))
192+
ns.client.emit.mock.assert_called_with(
193+
'ev', data='data', namespace='/bar', callback='cb')
194+
195+
def test_send_client(self):
196+
ns = asyncio_namespace.AsyncClientNamespace('/foo')
197+
mock_client = mock.MagicMock()
198+
mock_client.send = AsyncMock()
199+
ns._set_client(mock_client)
200+
_run(ns.send(data='data', callback='cb'))
201+
ns.client.send.mock.assert_called_with(
202+
'data', namespace='/foo', callback='cb')
203+
_run(ns.send(data='data', namespace='/bar', callback='cb'))
204+
ns.client.send.mock.assert_called_with(
205+
'data', namespace='/bar', callback='cb')
206+
207+
def test_disconnect_client(self):
208+
ns = asyncio_namespace.AsyncClientNamespace('/foo')
209+
mock_client = mock.MagicMock()
210+
mock_client.disconnect = AsyncMock()
211+
ns._set_client(mock_client)
212+
_run(ns.disconnect())
213+
ns.client.disconnect.mock.assert_called_with(namespace='/foo')
214+
_run(ns.disconnect(namespace='/bar'))
215+
ns.client.disconnect.mock.assert_called_with(namespace='/bar')

tests/test_client.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ def test_logger(self):
7474
c = client.Client(logger=my_logger)
7575
self.assertEqual(c.logger, my_logger)
7676

77+
@mock.patch('socketio.client.Client._engineio_client_class')
78+
def test_engineio_logger(self, engineio_client_class):
79+
client.Client(engineio_logger='foo')
80+
engineio_client_class().assert_called_once_with(logger='foo')
81+
7782
def test_on_event(self):
7883
c = client.Client()
7984

@@ -629,3 +634,76 @@ def test_handle_reconnect_max_attempts(self, random):
629634
mock.call(1.5)
630635
])
631636
self.assertEqual(c._reconnect_task, 'foo')
637+
638+
def test_handle_eio_message(self):
639+
c = client.Client()
640+
c._handle_connect = mock.MagicMock()
641+
c._handle_disconnect = mock.MagicMock()
642+
c._handle_event = mock.MagicMock()
643+
c._handle_ack = mock.MagicMock()
644+
c._handle_error = mock.MagicMock()
645+
646+
c._handle_eio_message('0')
647+
c._handle_connect.assert_called_with(None)
648+
c._handle_eio_message('0/foo')
649+
c._handle_connect.assert_called_with('/foo')
650+
c._handle_eio_message('1')
651+
c._handle_disconnect.assert_called_with(None)
652+
c._handle_eio_message('1/foo')
653+
c._handle_disconnect.assert_called_with('/foo')
654+
c._handle_eio_message('2["foo"]')
655+
c._handle_event.assert_called_with(None, None, ['foo'])
656+
c._handle_eio_message('3/foo,["bar"]')
657+
c._handle_ack.assert_called_with('/foo', None, ['bar'])
658+
c._handle_eio_message('4')
659+
c._handle_error.assert_called_with(None)
660+
c._handle_eio_message('4/foo')
661+
c._handle_error.assert_called_with('/foo')
662+
c._handle_eio_message('51-{"_placeholder":true,"num":0}')
663+
self.assertEqual(c._binary_packet.packet_type, packet.BINARY_EVENT)
664+
c._handle_eio_message(b'foo')
665+
c._handle_event.assert_called_with(None, None, b'foo')
666+
c._handle_eio_message('62-/foo,{"1":{"_placeholder":true,"num":1},'
667+
'"2":{"_placeholder":true,"num":0}}')
668+
self.assertEqual(c._binary_packet.packet_type, packet.BINARY_ACK)
669+
c._handle_eio_message(b'bar')
670+
c._handle_eio_message(b'foo')
671+
c._handle_ack.assert_called_with('/foo', None, {'1': b'foo',
672+
'2': b'bar'})
673+
self.assertRaises(ValueError, c._handle_eio_message, '9')
674+
675+
def test_eio_disconnect(self):
676+
c = client.Client()
677+
c._trigger_event = mock.MagicMock()
678+
c._handle_eio_disconnect()
679+
c._trigger_event.assert_called_once_with('disconnect', namespace='/')
680+
681+
def test_eio_disconnect_namespaces(self):
682+
c = client.Client()
683+
c.namespaces = ['/foo', '/bar']
684+
c._trigger_event = mock.MagicMock()
685+
c._handle_eio_disconnect()
686+
c._trigger_event.assert_any_call('disconnect', namespace='/foo')
687+
c._trigger_event.assert_any_call('disconnect', namespace='/bar')
688+
c._trigger_event.assert_any_call('disconnect', namespace='/')
689+
690+
def test_eio_disconnect_reconnect(self):
691+
c = client.Client(reconnection=True)
692+
c.start_background_task = mock.MagicMock()
693+
c.eio.state = 'connected'
694+
c._handle_eio_disconnect()
695+
c.start_background_task.assert_called_once_with(c._handle_reconnect)
696+
697+
def test_eio_disconnect_self_disconnect(self):
698+
c = client.Client(reconnection=True)
699+
c.start_background_task = mock.MagicMock()
700+
c.eio.state = 'disconnected'
701+
c._handle_eio_disconnect()
702+
c.start_background_task.assert_not_called()
703+
704+
def test_eio_disconnect_no_reconnect(self):
705+
c = client.Client(reconnection=False)
706+
c.start_background_task = mock.MagicMock()
707+
c.eio.state = 'connected'
708+
c._handle_eio_disconnect()
709+
c.start_background_task.assert_not_called()

tests/test_namespace.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,31 @@ def test_disconnect(self):
127127
ns.server.disconnect.assert_called_with('sid', namespace='/foo')
128128
ns.disconnect('sid', namespace='/bar')
129129
ns.server.disconnect.assert_called_with('sid', namespace='/bar')
130+
131+
def test_emit_client(self):
132+
ns = namespace.ClientNamespace('/foo')
133+
ns._set_client(mock.MagicMock())
134+
ns.emit('ev', data='data', callback='cb')
135+
ns.client.emit.assert_called_with(
136+
'ev', data='data', namespace='/foo', callback='cb')
137+
ns.emit('ev', data='data', namespace='/bar', callback='cb')
138+
ns.client.emit.assert_called_with(
139+
'ev', data='data', namespace='/bar', callback='cb')
140+
141+
def test_send_client(self):
142+
ns = namespace.ClientNamespace('/foo')
143+
ns._set_client(mock.MagicMock())
144+
ns.send(data='data', callback='cb')
145+
ns.client.send.assert_called_with(
146+
'data', namespace='/foo', callback='cb')
147+
ns.send(data='data', namespace='/bar', callback='cb')
148+
ns.client.send.assert_called_with(
149+
'data', namespace='/bar', callback='cb')
150+
151+
def test_disconnect_client(self):
152+
ns = namespace.ClientNamespace('/foo')
153+
ns._set_client(mock.MagicMock())
154+
ns.disconnect()
155+
ns.client.disconnect.assert_called_with(namespace='/foo')
156+
ns.disconnect(namespace='/bar')
157+
ns.client.disconnect.assert_called_with(namespace='/bar')

0 commit comments

Comments
 (0)