Skip to content

Commit ae6ae6a

Browse files
authored
Merge pull request #172 from datalayer-contrib/prepare_template
Ensure initialize_templates is called by _prepare_templates
2 parents 278b89b + 88d022d commit ae6ae6a

File tree

6 files changed

+68
-26
lines changed

6 files changed

+68
-26
lines changed

jupyter_server/extension/application.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ def _prepare_templates(self):
352352
self.settings.update({
353353
"{}_template_paths".format(self.extension_name): self.template_paths
354354
})
355+
self.initialize_templates()
355356

356357
@staticmethod
357358
def initialize_server(argv=[], load_other_extensions=True, **kwargs):

jupyter_server/pytest_plugin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ def mkdir(tmp_path, *parts):
5252
config_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "config"))
5353
runtime_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "runtime"))
5454
root_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "root_dir"))
55+
template_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "templates"))
5556
system_jupyter_path = pytest.fixture(
5657
lambda tmp_path: mkdir(tmp_path, "share", "jupyter")
5758
)

tests/extension/conftest.py

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from jupyter_core import paths
77
from jupyter_server.extension import serverextension
88
from jupyter_server.extension.serverextension import _get_config_dir
9-
from jupyter_server.extension.application import ExtensionApp
10-
from jupyter_server.extension.handler import ExtensionHandler
9+
from jupyter_server.extension.application import ExtensionApp, ExtensionAppJinjaMixin
10+
from jupyter_server.extension.handler import ExtensionHandler, ExtensionHandlerJinjaMixin
1111

1212
# ----------------- Mock Extension App ----------------------
1313

@@ -17,14 +17,21 @@ def get(self):
1717
self.finish(self.config.mock_trait)
1818

1919

20-
class MockExtensionApp(ExtensionApp):
20+
class MockExtensionTemplateHandler(ExtensionHandlerJinjaMixin, ExtensionHandler):
21+
22+
def get(self):
23+
self.write(self.render_template("index.html"))
24+
25+
26+
class MockExtensionApp(ExtensionAppJinjaMixin, ExtensionApp):
2127
extension_name = 'mockextension'
2228
mock_trait = Unicode('mock trait', config=True)
2329

2430
loaded = False
2531

2632
def initialize_handlers(self):
2733
self.handlers.append(('/mock', MockExtensionHandler))
34+
self.handlers.append(('/mock_template', MockExtensionTemplateHandler))
2835
self.loaded = True
2936

3037
@staticmethod
@@ -33,6 +40,36 @@ def _jupyter_server_extension_paths():
3340
'module': '_mockdestination/index'
3441
}]
3542

43+
@pytest.fixture
44+
def make_mock_extension_app(template_dir):
45+
def _make_mock_extension_app(**kwargs):
46+
kwargs.setdefault('template_paths', [str(template_dir)])
47+
return MockExtensionApp(**kwargs)
48+
49+
# TODO Should the index template creation be only be done only once?
50+
index = template_dir.joinpath("index.html")
51+
index.write_text("""
52+
<!DOCTYPE HTML>
53+
<html>
54+
<head>
55+
<meta charset="utf-8">
56+
<title>{% block title %}Jupyter Server 1{% endblock %}</title>
57+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
58+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
59+
{% block meta %}
60+
{% endblock %}
61+
</head>
62+
<body>
63+
<div id="site">
64+
{% block site %}
65+
{% endblock site %}
66+
</div>
67+
{% block after_site %}
68+
{% endblock after_site %}
69+
</body>
70+
</html>""")
71+
return _make_mock_extension_app
72+
3673

3774
@pytest.fixture
3875
def config_file(config_dir):
@@ -43,21 +80,21 @@ def config_file(config_dir):
4380

4481

4582
@pytest.fixture
46-
def extended_serverapp(serverapp):
83+
def extended_serverapp(serverapp, make_mock_extension_app):
4784
""""""
48-
m = MockExtensionApp()
85+
m = make_mock_extension_app()
4986
m.initialize(serverapp)
5087
return m
5188

5289

5390
@pytest.fixture
54-
def inject_mock_extension(environ, extension_environ):
91+
def inject_mock_extension(environ, extension_environ, make_mock_extension_app):
5592
"""Fixture that can be used to inject a mock Jupyter Server extension into the tests namespace.
5693
5794
Usage: inject_mock_extension({'extension_name': ExtensionClass})
5895
"""
5996
def ext(modulename="mockextension"):
60-
sys.modules[modulename] = e = MockExtensionApp()
97+
sys.modules[modulename] = e = make_mock_extension_app()
6198
return e
6299

63100
return ext

tests/extension/test_app.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,17 @@
33
from jupyter_server.serverapp import ServerApp
44
from jupyter_server.extension.application import ExtensionApp
55

6-
from .conftest import MockExtensionApp
76

8-
9-
def test_instance_creation():
10-
mock_extension = MockExtensionApp()
7+
def test_instance_creation(make_mock_extension_app, template_dir):
8+
mock_extension = make_mock_extension_app()
119
assert mock_extension.static_paths == []
12-
assert mock_extension.template_paths == []
10+
assert mock_extension.template_paths == [str(template_dir)]
1311
assert mock_extension.settings == {}
14-
assert mock_extension.handlers == []
12+
assert mock_extension.handlers == []
1513

1614

17-
def test_initialize(serverapp):
18-
mock_extension = MockExtensionApp()
15+
def test_initialize(serverapp, make_mock_extension_app):
16+
mock_extension = make_mock_extension_app()
1917
mock_extension.initialize(serverapp)
2018
# Check that settings and handlers were added to the mock extension.
2119
assert isinstance(mock_extension.serverapp, ServerApp)
@@ -35,24 +33,24 @@ def test_initialize(serverapp):
3533
'trait_name,trait_value',
3634
traits
3735
)
38-
def test_instance_creation_with_instance_args(trait_name, trait_value):
36+
def test_instance_creation_with_instance_args(trait_name, trait_value, make_mock_extension_app):
3937
kwarg = {}
4038
kwarg.setdefault(trait_name, trait_value)
41-
mock_extension = MockExtensionApp(**kwarg)
39+
mock_extension = make_mock_extension_app(**kwarg)
4240
assert getattr(mock_extension, trait_name) == trait_value
4341

4442

4543
@pytest.mark.parametrize(
4644
'trait_name,trait_value',
4745
traits
4846
)
49-
def test_instance_creation_with_argv(serverapp, trait_name, trait_value):
47+
def test_instance_creation_with_argv(serverapp, trait_name, trait_value, make_mock_extension_app):
5048
kwarg = {}
5149
kwarg.setdefault(trait_name, trait_value)
5250
argv = [
5351
'--MockExtensionApp.{name}={value}'.format(name=trait_name, value=trait_value)
5452
]
55-
mock_extension = MockExtensionApp()
53+
mock_extension = make_mock_extension_app()
5654
mock_extension.initialize(serverapp, argv=argv)
5755
assert getattr(mock_extension, trait_name) == trait_value
5856

tests/extension/test_entrypoint.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
from jupyter_core import paths
44
from jupyter_server.extension import serverextension
55

6-
from .conftest import MockExtensionApp
7-
86
# All test coroutines will be treated as marked.
97
pytestmark = pytest.mark.script_launch_mode('subprocess')
108

tests/extension/test_handler.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import pytest
22

33
from jupyter_server.serverapp import ServerApp
4-
from .conftest import MockExtensionApp
54

65
# ------------------ Start tests -------------------
76

@@ -14,9 +13,17 @@ async def test_handler(fetch, extended_serverapp):
1413
assert r.body.decode() == 'mock trait'
1514

1615

17-
async def test_handler_setting(fetch, serverapp):
16+
async def test_handler_template(fetch, extended_serverapp):
17+
r = await fetch(
18+
'mock_template',
19+
method='GET'
20+
)
21+
assert r.code == 200
22+
23+
24+
async def test_handler_setting(fetch, serverapp, make_mock_extension_app):
1825
# Configure trait in Mock Extension.
19-
m = MockExtensionApp(mock_trait='test mock trait')
26+
m = make_mock_extension_app(mock_trait='test mock trait')
2027
m.initialize(serverapp)
2128

2229
# Test that the extension trait was picked up by the webapp.
@@ -28,9 +35,9 @@ async def test_handler_setting(fetch, serverapp):
2835
assert r.body.decode() == 'test mock trait'
2936

3037

31-
async def test_handler_argv(fetch, serverapp):
38+
async def test_handler_argv(fetch, serverapp, make_mock_extension_app):
3239
# Configure trait in Mock Extension.
33-
m = MockExtensionApp()
40+
m = make_mock_extension_app()
3441
argv = ['--MockExtensionApp.mock_trait="test mock trait"']
3542
m.initialize(serverapp, argv=argv)
3643

0 commit comments

Comments
 (0)