mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-13 21:13:01 +00:00
Run tests with an encoded base_url
to ensure we get our escaping right Mostly revealed fixes needed in tests so far, not code, but should catch regressions.
This commit is contained in:
@@ -902,6 +902,7 @@ class JupyterHub(Application):
|
||||
self.proxy.log = self.log
|
||||
self.proxy.public_server.ip = self.ip
|
||||
self.proxy.public_server.port = self.port
|
||||
self.proxy.public_server.base_url = self.base_url
|
||||
self.proxy.api_server.ip = self.proxy_api_ip
|
||||
self.proxy.api_server.port = self.proxy_api_port
|
||||
self.proxy.api_server.base_url = '/api/routes/'
|
||||
|
@@ -117,6 +117,8 @@ class MockHub(JupyterHub):
|
||||
|
||||
last_activity_interval = 2
|
||||
|
||||
base_url = '/@/space%20word/'
|
||||
|
||||
@default('subdomain_host')
|
||||
def _subdomain_host_default(self):
|
||||
return os.environ.get('JUPYTERHUB_TEST_SUBDOMAIN_HOST', '')
|
||||
|
@@ -13,7 +13,7 @@ from .. import orm
|
||||
from ..user import User
|
||||
from ..utils import url_path_join as ujoin
|
||||
from . import mocking
|
||||
from .mocking import public_url, user_url
|
||||
from .mocking import public_host, public_url, user_url
|
||||
|
||||
|
||||
def check_db_locks(func):
|
||||
@@ -105,7 +105,7 @@ def test_auth_api(app):
|
||||
|
||||
|
||||
def test_referer_check(app, io_loop):
|
||||
url = ujoin(public_url(app), app.hub.server.base_url)
|
||||
url = ujoin(public_host(app), app.hub.server.base_url)
|
||||
host = urlparse(url).netloc
|
||||
user = find_user(app.db, 'admin')
|
||||
if user is None:
|
||||
@@ -351,7 +351,7 @@ def test_spawn(app, io_loop):
|
||||
status = io_loop.run_sync(app_user.spawner.poll)
|
||||
assert status is None
|
||||
|
||||
assert user.server.base_url == '/user/%s' % name
|
||||
assert user.server.base_url == ujoin(app.base_url, 'user/%s' % name)
|
||||
url = user_url(user, app)
|
||||
print(url)
|
||||
r = requests.get(url)
|
||||
|
@@ -12,7 +12,7 @@ from .mocking import FormSpawner, public_url, public_host, user_url
|
||||
from .test_api import api_request
|
||||
|
||||
def get_page(path, app, **kw):
|
||||
base_url = ujoin(public_url(app), app.hub.server.base_url)
|
||||
base_url = ujoin(public_host(app), app.hub.server.base_url)
|
||||
print(base_url)
|
||||
return requests.get(ujoin(base_url, path), **kw)
|
||||
|
||||
@@ -21,11 +21,11 @@ def test_root_no_auth(app, io_loop):
|
||||
routes = io_loop.run_sync(app.proxy.get_routes)
|
||||
print(routes)
|
||||
print(app.hub.server)
|
||||
url = public_url(app)
|
||||
url = ujoin(public_host(app), app.hub.server.base_url)
|
||||
print(url)
|
||||
r = requests.get(url)
|
||||
r.raise_for_status()
|
||||
assert r.url == ujoin(url, app.hub.server.base_url, 'login')
|
||||
assert r.url == ujoin(url, 'login')
|
||||
|
||||
def test_root_auth(app):
|
||||
cookies = app.login_user('river')
|
||||
@@ -80,7 +80,7 @@ def test_spawn_redirect(app, io_loop):
|
||||
r.raise_for_status()
|
||||
print(urlparse(r.url))
|
||||
path = urlparse(r.url).path
|
||||
assert path == '/user/%s' % name
|
||||
assert path == ujoin(app.base_url, 'user/%s' % name)
|
||||
|
||||
# should have started server
|
||||
status = io_loop.run_sync(u.spawner.poll)
|
||||
@@ -91,7 +91,7 @@ def test_spawn_redirect(app, io_loop):
|
||||
r.raise_for_status()
|
||||
print(urlparse(r.url))
|
||||
path = urlparse(r.url).path
|
||||
assert path == '/user/%s' % name
|
||||
assert path == ujoin(app.base_url, '/user/%s' % name)
|
||||
|
||||
def test_spawn_page(app):
|
||||
with mock.patch.dict(app.users.settings, {'spawner_class': FormSpawner}):
|
||||
@@ -102,7 +102,7 @@ def test_spawn_page(app):
|
||||
|
||||
def test_spawn_form(app, io_loop):
|
||||
with mock.patch.dict(app.users.settings, {'spawner_class': FormSpawner}):
|
||||
base_url = ujoin(public_url(app), app.hub.server.base_url)
|
||||
base_url = ujoin(public_host(app), app.hub.server.base_url)
|
||||
cookies = app.login_user('jones')
|
||||
orm_u = orm.User.find(app.db, 'jones')
|
||||
u = app.users[orm_u]
|
||||
@@ -123,7 +123,7 @@ def test_spawn_form(app, io_loop):
|
||||
|
||||
def test_spawn_form_with_file(app, io_loop):
|
||||
with mock.patch.dict(app.users.settings, {'spawner_class': FormSpawner}):
|
||||
base_url = ujoin(public_url(app), app.hub.server.base_url)
|
||||
base_url = ujoin(public_host(app), app.hub.server.base_url)
|
||||
cookies = app.login_user('jones')
|
||||
orm_u = orm.User.find(app.db, 'jones')
|
||||
u = app.users[orm_u]
|
||||
@@ -138,8 +138,6 @@ def test_spawn_form_with_file(app, io_loop):
|
||||
files={'hello': ('hello.txt', b'hello world\n')}
|
||||
)
|
||||
r.raise_for_status()
|
||||
print(u.spawner)
|
||||
print(u.spawner.user_options)
|
||||
assert u.spawner.user_options == {
|
||||
'energy': '511keV',
|
||||
'bounds': [-1, 1],
|
||||
@@ -158,21 +156,23 @@ def test_user_redirect(app):
|
||||
r.raise_for_status()
|
||||
print(urlparse(r.url))
|
||||
path = urlparse(r.url).path
|
||||
assert path == '/user/%s' % name
|
||||
assert path == ujoin(app.base_url, '/user/%s' % name)
|
||||
|
||||
r = get_page('/user/baduser/test.ipynb', app, cookies=cookies)
|
||||
r.raise_for_status()
|
||||
print(urlparse(r.url))
|
||||
path = urlparse(r.url).path
|
||||
assert path == '/user/%s/test.ipynb' % name
|
||||
assert path == ujoin(app.base_url, '/user/%s/test.ipynb' % name)
|
||||
|
||||
r = get_page('/user/baduser/test.ipynb', app)
|
||||
r.raise_for_status()
|
||||
print(urlparse(r.url))
|
||||
path = urlparse(r.url).path
|
||||
assert path == '/hub/login'
|
||||
assert path == ujoin(app.base_url, '/hub/login')
|
||||
query = urlparse(r.url).query
|
||||
assert query == urlencode({'next': '/hub/user/baduser/test.ipynb'})
|
||||
assert query == urlencode({
|
||||
'next': ujoin(app.base_url, '/hub/user/baduser/test.ipynb')
|
||||
})
|
||||
|
||||
|
||||
def test_login_fail(app):
|
||||
@@ -233,8 +233,7 @@ def test_login_no_whitelist_adds_user(app):
|
||||
|
||||
|
||||
def test_static_files(app):
|
||||
base_url = ujoin(public_url(app), app.hub.server.base_url)
|
||||
print(base_url)
|
||||
base_url = ujoin(public_host(app), app.hub.server.base_url)
|
||||
r = requests.get(ujoin(base_url, 'logo'))
|
||||
r.raise_for_status()
|
||||
assert r.headers['content-type'] == 'image/png'
|
||||
|
@@ -4,12 +4,12 @@ import json
|
||||
import os
|
||||
from queue import Queue
|
||||
from subprocess import Popen
|
||||
from urllib.parse import urlparse
|
||||
from urllib.parse import urlparse, unquote
|
||||
|
||||
from .. import orm
|
||||
from .mocking import MockHub
|
||||
from .test_api import api_request
|
||||
from ..utils import wait_for_http_server
|
||||
from ..utils import wait_for_http_server, url_path_join as ujoin
|
||||
|
||||
def test_external_proxy(request, io_loop):
|
||||
"""Test a proxy started before the Hub"""
|
||||
@@ -63,7 +63,7 @@ def test_external_proxy(request, io_loop):
|
||||
r.raise_for_status()
|
||||
|
||||
routes = io_loop.run_sync(app.proxy.get_routes)
|
||||
user_path = '/user/river'
|
||||
user_path = unquote(ujoin(app.base_url, 'user/river'))
|
||||
if app.subdomain_host:
|
||||
domain = urlparse(app.subdomain_host).hostname
|
||||
user_path = '/%s.%s' % (name, domain) + user_path
|
||||
@@ -136,14 +136,14 @@ def test_check_routes(app, io_loop):
|
||||
assert zoe is not None
|
||||
zoe = app.users[zoe]
|
||||
before = sorted(io_loop.run_sync(app.proxy.get_routes))
|
||||
assert zoe.proxy_path in before
|
||||
assert unquote(zoe.proxy_path) in before
|
||||
io_loop.run_sync(lambda : app.proxy.check_routes(app.users))
|
||||
io_loop.run_sync(lambda : proxy.delete_user(zoe))
|
||||
during = sorted(io_loop.run_sync(app.proxy.get_routes))
|
||||
assert zoe.proxy_path not in during
|
||||
assert unquote(zoe.proxy_path) not in during
|
||||
io_loop.run_sync(lambda : app.proxy.check_routes(app.users))
|
||||
after = sorted(io_loop.run_sync(app.proxy.get_routes))
|
||||
assert zoe.proxy_path in after
|
||||
assert unquote(zoe.proxy_path) in after
|
||||
assert before == after
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user