225 lines
7.9 KiB
Python
225 lines
7.9 KiB
Python
import logging
|
|
import time
|
|
from unittest import TestCase
|
|
|
|
from . import SocketIO, LoggingNamespace, find_callback
|
|
from .transports import TIMEOUT_IN_SECONDS
|
|
|
|
|
|
HOST = 'localhost'
|
|
PORT = 8000
|
|
DATA = 'xxx'
|
|
PAYLOAD = {'xxx': 'yyy'}
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
|
|
|
|
class BaseMixin(object):
|
|
|
|
def setUp(self):
|
|
self.called_on_response = False
|
|
|
|
def tearDown(self):
|
|
del self.socketIO
|
|
|
|
def on_response(self, *args):
|
|
for arg in args:
|
|
if isinstance(arg, dict):
|
|
self.assertEqual(arg, PAYLOAD)
|
|
else:
|
|
self.assertEqual(arg, DATA)
|
|
self.called_on_response = True
|
|
|
|
def test_disconnect(self):
|
|
'Disconnect'
|
|
self.socketIO.define(LoggingNamespace)
|
|
self.assertTrue(self.socketIO.connected)
|
|
self.socketIO.disconnect()
|
|
self.assertFalse(self.socketIO.connected)
|
|
# Use context manager
|
|
with SocketIO(HOST, PORT, Namespace) as self.socketIO:
|
|
namespace = self.socketIO.get_namespace()
|
|
self.assertFalse(namespace.called_on_disconnect)
|
|
self.assertTrue(self.socketIO.connected)
|
|
self.assertTrue(namespace.called_on_disconnect)
|
|
self.assertFalse(self.socketIO.connected)
|
|
|
|
def test_message(self):
|
|
'Message'
|
|
namespace = self.socketIO.define(Namespace)
|
|
self.socketIO.message()
|
|
self.socketIO.wait(self.wait_time_in_seconds)
|
|
self.assertEqual(namespace.response, 'message_response')
|
|
|
|
def test_message_with_data(self):
|
|
'Message with data'
|
|
namespace = self.socketIO.define(Namespace)
|
|
self.socketIO.message(DATA)
|
|
self.socketIO.wait(self.wait_time_in_seconds)
|
|
self.assertEqual(namespace.response, DATA)
|
|
|
|
def test_message_with_payload(self):
|
|
'Message with payload'
|
|
namespace = self.socketIO.define(Namespace)
|
|
self.socketIO.message(PAYLOAD)
|
|
self.socketIO.wait(self.wait_time_in_seconds)
|
|
self.assertEqual(namespace.response, PAYLOAD)
|
|
|
|
def test_message_with_callback(self):
|
|
'Message with callback'
|
|
self.socketIO.define(LoggingNamespace)
|
|
self.socketIO.message(callback=self.on_response)
|
|
self.socketIO.wait_for_callbacks(seconds=self.wait_time_in_seconds)
|
|
self.assertTrue(self.called_on_response)
|
|
|
|
def test_message_with_callback_with_data(self):
|
|
'Message with callback with data'
|
|
self.socketIO.define(LoggingNamespace)
|
|
self.socketIO.message(DATA, self.on_response)
|
|
self.socketIO.wait_for_callbacks(seconds=self.wait_time_in_seconds)
|
|
self.assertTrue(self.called_on_response)
|
|
|
|
def test_emit(self):
|
|
'Emit'
|
|
namespace = self.socketIO.define(Namespace)
|
|
self.socketIO.emit('emit')
|
|
self.socketIO.wait(self.wait_time_in_seconds)
|
|
self.assertEqual(namespace.args_by_event, {
|
|
'emit_response': (),
|
|
})
|
|
|
|
def test_emit_with_payload(self):
|
|
'Emit with payload'
|
|
namespace = self.socketIO.define(Namespace)
|
|
self.socketIO.emit('emit_with_payload', PAYLOAD)
|
|
self.socketIO.wait(self.wait_time_in_seconds)
|
|
self.assertEqual(namespace.args_by_event, {
|
|
'emit_with_payload_response': (PAYLOAD,),
|
|
})
|
|
|
|
def test_emit_with_multiple_payloads(self):
|
|
'Emit with multiple payloads'
|
|
namespace = self.socketIO.define(Namespace)
|
|
self.socketIO.emit('emit_with_multiple_payloads', PAYLOAD, PAYLOAD)
|
|
self.socketIO.wait(self.wait_time_in_seconds)
|
|
self.assertEqual(namespace.args_by_event, {
|
|
'emit_with_multiple_payloads_response': (PAYLOAD, PAYLOAD),
|
|
})
|
|
|
|
def test_emit_with_callback(self):
|
|
'Emit with callback'
|
|
self.socketIO.define(LoggingNamespace)
|
|
self.socketIO.emit('emit_with_callback', self.on_response)
|
|
self.socketIO.wait_for_callbacks(seconds=self.wait_time_in_seconds)
|
|
self.assertTrue(self.called_on_response)
|
|
|
|
def test_emit_with_callback_with_payload(self):
|
|
'Emit with callback with payload'
|
|
self.socketIO.define(LoggingNamespace)
|
|
self.socketIO.emit(
|
|
'emit_with_callback_with_payload', self.on_response)
|
|
self.socketIO.wait_for_callbacks(seconds=self.wait_time_in_seconds)
|
|
self.assertTrue(self.called_on_response)
|
|
|
|
def test_emit_with_callback_with_multiple_payloads(self):
|
|
'Emit with callback with multiple payloads'
|
|
self.socketIO.define(LoggingNamespace)
|
|
self.socketIO.emit(
|
|
'emit_with_callback_with_multiple_payloads', self.on_response)
|
|
self.socketIO.wait_for_callbacks(seconds=self.wait_time_in_seconds)
|
|
self.assertTrue(self.called_on_response)
|
|
|
|
def test_emit_with_event(self):
|
|
'Emit to trigger an event'
|
|
self.socketIO.on('emit_with_event_response', self.on_response)
|
|
self.socketIO.emit('emit_with_event', PAYLOAD)
|
|
self.socketIO.wait(self.wait_time_in_seconds)
|
|
self.assertTrue(self.called_on_response)
|
|
|
|
def test_ack(self):
|
|
'Trigger server callback'
|
|
namespace = self.socketIO.define(Namespace)
|
|
self.socketIO.emit('ack', PAYLOAD)
|
|
self.socketIO.wait(self.wait_time_in_seconds)
|
|
self.assertEqual(namespace.args_by_event, {
|
|
'ack_response': (PAYLOAD,),
|
|
'ack_callback_response': (PAYLOAD,),
|
|
})
|
|
|
|
def test_wait_with_disconnect(self):
|
|
'Exit loop when the client wants to disconnect'
|
|
self.socketIO.define(Namespace)
|
|
self.socketIO.emit('wait_with_disconnect')
|
|
timeout_in_seconds = 5
|
|
start_time = time.time()
|
|
self.socketIO.wait(timeout_in_seconds)
|
|
self.assertTrue(time.time() - start_time < timeout_in_seconds)
|
|
|
|
def test_namespace_emit(self):
|
|
'Behave differently in different namespaces'
|
|
main_namespace = self.socketIO.define(Namespace)
|
|
chat_namespace = self.socketIO.define(Namespace, '/chat')
|
|
news_namespace = self.socketIO.define(Namespace, '/news')
|
|
news_namespace.emit('emit_with_payload', PAYLOAD)
|
|
self.socketIO.wait(self.wait_time_in_seconds)
|
|
self.assertEqual(main_namespace.args_by_event, {})
|
|
self.assertEqual(chat_namespace.args_by_event, {})
|
|
self.assertEqual(news_namespace.args_by_event, {
|
|
'emit_with_payload_response': (PAYLOAD,),
|
|
})
|
|
|
|
def test_namespace_ack(self):
|
|
'Trigger server callback'
|
|
chat_namespace = self.socketIO.define(Namespace, '/chat')
|
|
chat_namespace.emit('ack', PAYLOAD)
|
|
self.socketIO.wait(self.wait_time_in_seconds)
|
|
self.assertEqual(chat_namespace.args_by_event, {
|
|
'ack_response': (PAYLOAD,),
|
|
'ack_callback_response': (PAYLOAD,),
|
|
})
|
|
|
|
|
|
class Test_WebsocketTransport(TestCase, BaseMixin):
|
|
|
|
def setUp(self):
|
|
super(Test_WebsocketTransport, self).setUp()
|
|
self.socketIO = SocketIO(HOST, PORT, transports=['websocket'])
|
|
self.wait_time_in_seconds = 0.1
|
|
|
|
|
|
class Test_XHR_PollingTransport(TestCase, BaseMixin):
|
|
|
|
def setUp(self):
|
|
super(Test_XHR_PollingTransport, self).setUp()
|
|
self.socketIO = SocketIO(HOST, PORT, transports=['xhr-polling'])
|
|
self.wait_time_in_seconds = TIMEOUT_IN_SECONDS + 1
|
|
|
|
|
|
class Test_JSONP_PollingTransport(TestCase, BaseMixin):
|
|
|
|
def setUp(self):
|
|
super(Test_JSONP_PollingTransport, self).setUp()
|
|
self.socketIO = SocketIO(HOST, PORT, transports=['jsonp-polling'])
|
|
self.wait_time_in_seconds = TIMEOUT_IN_SECONDS + 1
|
|
|
|
|
|
class Namespace(LoggingNamespace):
|
|
|
|
def initialize(self):
|
|
self.response = None
|
|
self.args_by_event = {}
|
|
self.called_on_disconnect = False
|
|
|
|
def on_disconnect(self):
|
|
self.called_on_disconnect = True
|
|
|
|
def on_message(self, data):
|
|
self.response = data
|
|
|
|
def on_event(self, event, *args):
|
|
callback, args = find_callback(args)
|
|
if callback:
|
|
callback(*args)
|
|
self.args_by_event[event] = args
|
|
|
|
def on_wait_with_disconnect_response(self):
|
|
self.disconnect()
|