diff --git a/tests/test_standalone.py b/tests/test_standalone.py index f630bb44..cc55548d 100644 --- a/tests/test_standalone.py +++ b/tests/test_standalone.py @@ -1,10 +1,11 @@ +import logging import sys from pathlib import Path import pytest from tornado import testing -from jupyter_server_proxy.standalone import _default_address_and_port, make_proxy_app +from jupyter_server_proxy.standalone import StandaloneProxyServer """ Test if address and port are identified correctly @@ -13,60 +14,62 @@ def test_address_and_port_with_http_address(monkeypatch): monkeypatch.setenv("JUPYTERHUB_SERVICE_URL", "http://localhost/") - address, port = _default_address_and_port() + proxy_server = StandaloneProxyServer() - assert address == "localhost" - assert port == 80 + assert proxy_server.address == "localhost" + assert proxy_server.port == 80 def test_address_and_port_with_https_address(monkeypatch): monkeypatch.setenv("JUPYTERHUB_SERVICE_URL", "https://localhost/") - address, port = _default_address_and_port() + proxy_server = StandaloneProxyServer() - assert address == "localhost" - assert port == 443 + assert proxy_server.address == "localhost" + assert proxy_server.port == 443 def test_address_and_port_with_address_and_port(monkeypatch): monkeypatch.setenv("JUPYTERHUB_SERVICE_URL", "http://localhost:7777/") - address, port = _default_address_and_port() - - assert address == "localhost" - assert port == 7777 - - -def make_app(unix_socket: bool, skip_authentication: bool): - command = [ - sys.executable, - str(Path(__file__).parent / "resources" / "httpinfo.py"), - "--port={port}", - "--unix-socket={unix_socket}", - ] - - return make_proxy_app( - command=command, - prefix="/some/prefix", - port=0, - unix_socket=unix_socket, - environment={}, - mappath={}, - timeout=60, - skip_authentication=skip_authentication, - debug=True, - websocket_max_message_size=0, - ) - - -class TestStandaloneProxyRedirect(testing.AsyncHTTPTestCase): + proxy_server = StandaloneProxyServer() + + assert proxy_server.address == "localhost" + assert proxy_server.port == 7777 + + +class _TestStandaloneBase(testing.AsyncHTTPTestCase): + runTest = None # Required for Tornado 6.1 + + unix_socket: bool + skip_authentication: bool + + def get_app(self): + command = [ + sys.executable, + str(Path(__file__).parent / "resources" / "httpinfo.py"), + "--port={port}", + "--unix-socket={unix_socket}", + ] + + proxy_server = StandaloneProxyServer( + command=command, + base_url="/some/prefix", + unix_socket=self.unix_socket, + timeout=60, + skip_authentication=self.skip_authentication, + log_level=logging.DEBUG, + ) + + return proxy_server.create_app() + + +class TestStandaloneProxyRedirect(_TestStandaloneBase): """ Ensure requests are proxied to the application. We need to disable authentication here, as we do not want to be redirected to the JupyterHub Login. """ - runTest = None # Required for Tornado 6.1 - - def get_app(self): - return make_app(False, True) + unix_socket = False + skip_authentication = True def test_add_slash(self): response = self.fetch("/some/prefix", follow_redirects=False) @@ -74,7 +77,7 @@ def test_add_slash(self): assert response.code == 301 assert response.headers.get("Location") == "/some/prefix/" - def test_without_prefix(self): + def test_wrong_prefix(self): response = self.fetch("/some/other/prefix") assert response.code == 404 @@ -92,11 +95,9 @@ def test_on_prefix(self): @pytest.mark.skipif( sys.platform == "win32", reason="Unix socket not supported on Windows" ) -class TestStandaloneProxyWithUnixSocket(testing.AsyncHTTPTestCase): - runTest = None # Required for Tornado 6.1 - - def get_app(self): - return make_app(True, True) +class TestStandaloneProxyWithUnixSocket(_TestStandaloneBase): + unix_socket = True + skip_authentication = True def test_with_unix_socket(self): response = self.fetch("/some/prefix/") @@ -108,15 +109,13 @@ def test_with_unix_socket(self): assert "X-Proxycontextpath: /some/prefix/" in body -class TestStandaloneProxyLogin(testing.AsyncHTTPTestCase): +class TestStandaloneProxyLogin(_TestStandaloneBase): """ Ensure we redirect to JupyterHub login when authentication is enabled """ - runTest = None # Required for Tornado 6.1 - - def get_app(self): - return make_app(False, False) + unix_socket = False + skip_authentication = False def test_redirect_to_login_url(self): response = self.fetch("/some/prefix/", follow_redirects=False)