import os import unittest import six if six.PY3: from unittest import mock else: import mock import engineio class TestWSGIApp(unittest.TestCase): def test_wsgi_routing(self): mock_wsgi_app = mock.MagicMock() mock_eio_app = 'foo' m = engineio.WSGIApp(mock_eio_app, mock_wsgi_app) environ = {'PATH_INFO': '/foo'} start_response = "foo" m(environ, start_response) mock_wsgi_app.assert_called_once_with(environ, start_response) def test_eio_routing(self): mock_wsgi_app = 'foo' mock_eio_app = mock.Mock() mock_eio_app.handle_request = mock.MagicMock() m = engineio.WSGIApp(mock_eio_app, mock_wsgi_app) environ = {'PATH_INFO': '/engine.io/'} start_response = "foo" m(environ, start_response) mock_eio_app.handle_request.assert_called_once_with(environ, start_response) def test_static_files(self): root_dir = os.path.dirname(__file__) m = engineio.WSGIApp('foo', None, static_files={ '/': root_dir + '/index.html', '/foo': {'content_type': 'text/plain', 'filename': root_dir + '/index.html'}, '/static': root_dir, '/static/test/': root_dir + '/', }) def check_path(path, status_code, content_type, body): environ = {'PATH_INFO': path} start_response = mock.MagicMock() r = m(environ, start_response) self.assertEqual(r, [body.encode('utf-8')]) start_response.assert_called_once_with( status_code, [('Content-Type', content_type)]) check_path('/', '200 OK', 'text/html', '\n') check_path('/foo', '200 OK', 'text/plain', '\n') check_path('/static/index.html', '200 OK', 'text/html', '\n') check_path('/static/foo.bar', '404 Not Found', 'text/plain', 'Not Found') check_path('/static/test/index.html', '200 OK', 'text/html', '\n') check_path('/static/test/', '200 OK', 'text/html', '\n') check_path('/bar/foo', '404 Not Found', 'text/plain', 'Not Found') check_path('', '404 Not Found', 'text/plain', 'Not Found') m.static_files[''] = 'index.html' check_path('/static/test/', '200 OK', 'text/html', '\n') m.static_files[''] = {'filename': 'index.html'} check_path('/static/test/', '200 OK', 'text/html', '\n') m.static_files[''] = {'filename': 'index.html', 'content_type': 'image/gif'} check_path('/static/test/', '200 OK', 'image/gif', '\n') m.static_files[''] = {'filename': 'test.gif'} check_path('/static/test/', '404 Not Found', 'text/plain', 'Not Found') m.static_files = {} check_path('/static/test/index.html', '404 Not Found', 'text/plain', 'Not Found') def test_404(self): mock_wsgi_app = None mock_eio_app = mock.Mock() m = engineio.WSGIApp(mock_eio_app, mock_wsgi_app) environ = {'PATH_INFO': '/foo/bar'} start_response = mock.MagicMock() r = m(environ, start_response) self.assertEqual(r, [b'Not Found']) start_response.assert_called_once_with( "404 Not Found", [('Content-Type', 'text/plain')]) def test_custom_eio_path(self): mock_wsgi_app = None mock_eio_app = mock.Mock() mock_eio_app.handle_request = mock.MagicMock() m = engineio.WSGIApp(mock_eio_app, mock_wsgi_app, engineio_path='foo') environ = {'PATH_INFO': '/engine.io/'} start_response = mock.MagicMock() r = m(environ, start_response) self.assertEqual(r, [b'Not Found']) start_response.assert_called_once_with( "404 Not Found", [('Content-Type', 'text/plain')]) environ = {'PATH_INFO': '/foo/'} m(environ, start_response) mock_eio_app.handle_request.assert_called_once_with(environ, start_response) def test_custom_eio_path_slashes(self): mock_wsgi_app = None mock_eio_app = mock.Mock() mock_eio_app.handle_request = mock.MagicMock() m = engineio.WSGIApp(mock_eio_app, mock_wsgi_app, engineio_path='/foo/') environ = {'PATH_INFO': '/foo/'} start_response = mock.MagicMock() m(environ, start_response) mock_eio_app.handle_request.assert_called_once_with(environ, start_response) def test_custom_eio_path_leading_slash(self): mock_wsgi_app = None mock_eio_app = mock.Mock() mock_eio_app.handle_request = mock.MagicMock() m = engineio.WSGIApp(mock_eio_app, mock_wsgi_app, engineio_path='/foo') environ = {'PATH_INFO': '/foo/'} start_response = mock.MagicMock() m(environ, start_response) mock_eio_app.handle_request.assert_called_once_with(environ, start_response) def test_custom_eio_path_trailing_slash(self): mock_wsgi_app = None mock_eio_app = mock.Mock() mock_eio_app.handle_request = mock.MagicMock() m = engineio.WSGIApp(mock_eio_app, mock_wsgi_app, engineio_path='foo/') environ = {'PATH_INFO': '/foo/'} start_response = mock.MagicMock() m(environ, start_response) mock_eio_app.handle_request.assert_called_once_with(environ, start_response) def test_gunicorn_socket(self): mock_wsgi_app = None mock_eio_app = mock.Mock() m = engineio.WSGIApp(mock_eio_app, mock_wsgi_app) environ = {'gunicorn.socket': 123, 'PATH_INFO': '/foo/bar'} start_response = mock.MagicMock() m(environ, start_response) self.assertIn('eventlet.input', environ) self.assertEqual(environ['eventlet.input'].get_socket(), 123) def test_legacy_middleware_class(self): m = engineio.Middleware('eio', 'wsgi', 'eio_path') self.assertEqual(m.engineio_app, 'eio') self.assertEqual(m.wsgi_app, 'wsgi') self.assertEqual(m.static_files, {}) self.assertEqual(m.engineio_path, 'eio_path')