You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.5 KiB
Python
115 lines
3.5 KiB
Python
# Copyright (c) Jupyter Development Team.
|
|
# Distributed under the terms of the Modified BSD License.
|
|
|
|
import urllib.parse
|
|
|
|
import pytest
|
|
from jupyter_server.utils import url_path_join
|
|
from jupyterlab_server import LabConfig
|
|
from tornado.escape import url_escape
|
|
from traitlets import Unicode
|
|
|
|
from jupyterlab.labapp import LabApp
|
|
|
|
|
|
def mkdir(tmp_path, *parts):
|
|
path = tmp_path.joinpath(*parts)
|
|
if not path.exists():
|
|
path.mkdir(parents=True)
|
|
return path
|
|
|
|
|
|
app_settings_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "app_settings"))
|
|
user_settings_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "user_settings"))
|
|
schemas_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "schemas"))
|
|
workspaces_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "workspaces"))
|
|
|
|
|
|
@pytest.fixture
|
|
def make_lab_app(
|
|
jp_root_dir, jp_template_dir, app_settings_dir, user_settings_dir, schemas_dir, workspaces_dir
|
|
):
|
|
def _make_lab_app(**kwargs):
|
|
class TestLabApp(LabApp):
|
|
base_url = "/lab"
|
|
extension_url = "/lab"
|
|
default_url = Unicode("/", help="The default URL to redirect to from `/`")
|
|
lab_config = LabConfig(
|
|
app_name="JupyterLab Test App",
|
|
static_dir=str(jp_root_dir),
|
|
templates_dir=str(jp_template_dir),
|
|
app_url="/lab",
|
|
app_settings_dir=str(app_settings_dir),
|
|
user_settings_dir=str(user_settings_dir),
|
|
schemas_dir=str(schemas_dir),
|
|
workspaces_dir=str(workspaces_dir),
|
|
)
|
|
|
|
app = TestLabApp()
|
|
return app
|
|
|
|
# Create the index files.
|
|
index = jp_template_dir.joinpath("index.html")
|
|
index.write_text(
|
|
"""
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>{{page_config['appName'] | e}}</title>
|
|
</head>
|
|
<body>
|
|
{# Copy so we do not modify the page_config with updates. #}
|
|
{% set page_config_full = page_config.copy() %}
|
|
|
|
{# Set a dummy variable - we just want the side effect of the update. #}
|
|
{% set _ = page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %}
|
|
|
|
<script id="jupyter-config-data" type="application/json">
|
|
{{ page_config_full | tojson }}
|
|
</script>
|
|
<script src="{{page_config['fullStaticUrl'] | e}}/bundle.js" main="index"></script>
|
|
|
|
<script type="text/javascript">
|
|
/* Remove token from URL. */
|
|
(function () {
|
|
var parsedUrl = new URL(window.location.href);
|
|
if (parsedUrl.searchParams.get('token')) {
|
|
parsedUrl.searchParams.delete('token');
|
|
window.history.replaceState({ }, '', parsedUrl.href);
|
|
}
|
|
})();
|
|
</script>
|
|
</body>
|
|
</html>
|
|
"""
|
|
)
|
|
|
|
return _make_lab_app
|
|
|
|
|
|
@pytest.fixture
|
|
def labapp(jp_serverapp, make_lab_app):
|
|
app = make_lab_app()
|
|
app._link_jupyter_server_extension(jp_serverapp)
|
|
app.initialize()
|
|
return app
|
|
|
|
|
|
@pytest.fixture
|
|
def fetch_long(http_server_client, jp_auth_header, jp_base_url):
|
|
"""fetch fixture that handles auth, base_url, and path"""
|
|
|
|
def client_fetch(*parts, headers=None, params=None, **kwargs):
|
|
# Handle URL strings
|
|
path_url = url_escape(url_path_join(*parts), plus=False)
|
|
path_url = url_path_join(jp_base_url, path_url)
|
|
params_url = urllib.parse.urlencode(params or {})
|
|
url = path_url + "?" + params_url
|
|
# Add auth keys to header
|
|
headers = headers or {}
|
|
headers.update(jp_auth_header)
|
|
# Make request.
|
|
return http_server_client.fetch(url, headers=headers, request_timeout=250, **kwargs)
|
|
|
|
return client_fetch
|