Skip to content

Commit de60f6d

Browse files
committed
run Python tests with a token
exercises token auth
1 parent efdbef1 commit de60f6d

File tree

10 files changed

+76
-66
lines changed

10 files changed

+76
-66
lines changed

notebook/nbconvert/tests/test_nbconvert_handlers.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020

2121
class NbconvertAPI(object):
2222
"""Wrapper for nbconvert API calls."""
23-
def __init__(self, base_url):
24-
self.base_url = base_url
23+
def __init__(self, request):
24+
self.request = request
2525

2626
def _req(self, verb, path, body=None, params=None):
27-
response = requests.request(verb,
28-
url_path_join(self.base_url, 'nbconvert', path),
27+
response = self.request(verb,
28+
url_path_join('nbconvert', path),
2929
data=body, params=params,
3030
)
3131
response.raise_for_status()
@@ -69,7 +69,7 @@ def setUp(self):
6969
encoding='utf-8') as f:
7070
write(nb, f, version=4)
7171

72-
self.nbconvert_api = NbconvertAPI(self.base_url())
72+
self.nbconvert_api = NbconvertAPI(self.request)
7373

7474
def tearDown(self):
7575
nbdir = self.notebook_dir.name
@@ -109,8 +109,7 @@ def test_from_file_zip(self):
109109

110110
@onlyif_cmds_exist('pandoc')
111111
def test_from_post(self):
112-
nbmodel_url = url_path_join(self.base_url(), 'api/contents/foo/testnb.ipynb')
113-
nbmodel = requests.get(nbmodel_url).json()
112+
nbmodel = self.request('GET', 'api/contents/foo/testnb.ipynb').json()
114113

115114
r = self.nbconvert_api.from_post(format='html', nbmodel=nbmodel)
116115
self.assertEqual(r.status_code, 200)
@@ -124,8 +123,7 @@ def test_from_post(self):
124123

125124
@onlyif_cmds_exist('pandoc')
126125
def test_from_post_zip(self):
127-
nbmodel_url = url_path_join(self.base_url(), 'api/contents/foo/testnb.ipynb')
128-
nbmodel = requests.get(nbmodel_url).json()
126+
nbmodel = self.request('GET', 'api/contents/foo/testnb.ipynb').json()
129127

130128
r = self.nbconvert_api.from_post(format='latex', nbmodel=nbmodel)
131129
self.assertIn(u'application/zip', r.headers['Content-Type'])

notebook/services/config/tests/test_config_api.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111

1212
class ConfigAPI(object):
1313
"""Wrapper for notebook API calls."""
14-
def __init__(self, base_url):
15-
self.base_url = base_url
14+
def __init__(self, request):
15+
self.request = request
1616

1717
def _req(self, verb, section, body=None):
18-
response = requests.request(verb,
19-
url_path_join(self.base_url, 'api/config', section),
18+
response = self.request(verb,
19+
url_path_join('api/config', section),
2020
data=body,
2121
)
2222
response.raise_for_status()
@@ -34,7 +34,7 @@ def modify(self, section, values):
3434
class APITest(NotebookTestBase):
3535
"""Test the config web service API"""
3636
def setUp(self):
37-
self.config_api = ConfigAPI(self.base_url())
37+
self.config_api = ConfigAPI(self.request)
3838

3939
def test_create_retrieve_config(self):
4040
sample = {'foo': 'bar', 'baz': 73}

notebook/services/contents/tests/test_contents_api.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ def dirs_only(dir_model):
4444

4545
class API(object):
4646
"""Wrapper for contents API calls."""
47-
def __init__(self, base_url):
48-
self.base_url = base_url
47+
def __init__(self, request):
48+
self.request = request
4949

5050
def _req(self, verb, path, body=None, params=None):
51-
response = requests.request(verb,
52-
url_path_join(self.base_url, 'api/contents', path),
51+
response = self.request(verb,
52+
url_path_join('api/contents', path),
5353
data=body, params=params,
5454
)
5555
response.raise_for_status()
@@ -209,7 +209,7 @@ def setUp(self):
209209
blob = self._blob_for_name(name)
210210
self.make_blob(u'{}/{}.blob'.format(d, name), blob)
211211

212-
self.api = API(self.base_url())
212+
self.api = API(self.request)
213213

214214
def tearDown(self):
215215
for dname in (list(self.top_level_dirs) + self.hidden_dirs):

notebook/services/kernels/tests/test_kernels_api.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010

1111
class KernelAPI(object):
1212
"""Wrapper for kernel REST API requests"""
13-
def __init__(self, base_url):
14-
self.base_url = base_url
13+
def __init__(self, request):
14+
self.request = request
1515

1616
def _req(self, verb, path, body=None):
17-
response = requests.request(verb,
18-
url_path_join(self.base_url, 'api/kernels', path), data=body)
17+
response = self.request(verb,
18+
url_path_join('api/kernels', path), data=body)
1919

2020
if 400 <= response.status_code < 600:
2121
try:
@@ -48,7 +48,7 @@ def restart(self, id):
4848
class KernelAPITest(NotebookTestBase):
4949
"""Test the kernels web service API"""
5050
def setUp(self):
51-
self.kern_api = KernelAPI(self.base_url())
51+
self.kern_api = KernelAPI(self.request)
5252

5353
def tearDown(self):
5454
for k in self.kern_api.list().json():

notebook/services/kernelspecs/tests/test_kernelspecs_api.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@
2626

2727
class KernelSpecAPI(object):
2828
"""Wrapper for notebook API calls."""
29-
def __init__(self, base_url):
30-
self.base_url = base_url
29+
def __init__(self, request):
30+
self.request = request
3131

3232
def _req(self, verb, path, body=None):
33-
response = requests.request(verb,
34-
url_path_join(self.base_url, path),
33+
response = self.request(verb,
34+
path,
3535
data=body,
3636
)
3737
response.raise_for_status()
@@ -52,7 +52,7 @@ class APITest(NotebookTestBase):
5252
def setUp(self):
5353
self.create_spec('sample')
5454
self.create_spec('sample 2')
55-
self.ks_api = KernelSpecAPI(self.base_url())
55+
self.ks_api = KernelSpecAPI(self.request)
5656

5757
def create_spec(self, name):
5858
sample_kernel_dir = pjoin(self.data_dir.name, 'kernels', name)

notebook/services/nbconvert/tests/test_nbconvert_api.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55

66
class NbconvertAPI(object):
77
"""Wrapper for nbconvert API calls."""
8-
def __init__(self, base_url):
9-
self.base_url = base_url
8+
def __init__(self, request):
9+
self.request = request
1010

1111
def _req(self, verb, path, body=None, params=None):
12-
response = requests.request(verb,
13-
url_path_join(self.base_url, 'api/nbconvert', path),
12+
response = self.request(verb,
13+
url_path_join('api/nbconvert', path),
1414
data=body, params=params,
1515
)
1616
response.raise_for_status()
@@ -21,7 +21,7 @@ def list_formats(self):
2121

2222
class APITest(NotebookTestBase):
2323
def setUp(self):
24-
self.nbconvert_api = NbconvertAPI(self.base_url())
24+
self.nbconvert_api = NbconvertAPI(self.request)
2525

2626
def test_list_formats(self):
2727
formats = self.nbconvert_api.list_formats().json()

notebook/services/sessions/tests/test_sessions_api.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717

1818
class SessionAPI(object):
1919
"""Wrapper for notebook API calls."""
20-
def __init__(self, base_url):
21-
self.base_url = base_url
20+
def __init__(self, request):
21+
self.request = request
2222

2323
def _req(self, verb, path, body=None):
24-
response = requests.request(verb,
25-
url_path_join(self.base_url, 'api/sessions', path), data=body)
24+
response = self.request(verb,
25+
url_path_join('api/sessions', path), data=body)
2626

2727
if 400 <= response.status_code < 600:
2828
try:
@@ -92,7 +92,7 @@ def setUp(self):
9292
nb = new_notebook()
9393
write(nb, f, version=4)
9494

95-
self.sess_api = SessionAPI(self.base_url())
95+
self.sess_api = SessionAPI(self.request)
9696

9797
def tearDown(self):
9898
for session in self.sess_api.list().json():
@@ -152,7 +152,7 @@ def test_create_deprecated(self):
152152

153153
def test_create_with_kernel_id(self):
154154
# create a new kernel
155-
r = requests.post(url_path_join(self.base_url(), 'api/kernels'))
155+
r = self.request('POST', 'api/kernels')
156156
r.raise_for_status()
157157
kernel = r.json()
158158

@@ -220,7 +220,7 @@ def test_modify_kernel_name(self):
220220
self.assertNotEqual(after['kernel']['id'], before['kernel']['id'])
221221

222222
# check kernel list, to be sure previous kernel was cleaned up
223-
r = requests.get(url_path_join(self.base_url(), 'api/kernels'))
223+
r = self.request('GET', 'api/kernels')
224224
r.raise_for_status()
225225
kernel_list = r.json()
226226
self.assertEqual(kernel_list, [after['kernel']])
@@ -230,7 +230,7 @@ def test_modify_kernel_id(self):
230230
sid = before['id']
231231

232232
# create a new kernel
233-
r = requests.post(url_path_join(self.base_url(), 'api/kernels'))
233+
r = self.request('POST', 'api/kernels')
234234
r.raise_for_status()
235235
kernel = r.json()
236236

@@ -243,7 +243,7 @@ def test_modify_kernel_id(self):
243243
self.assertEqual(after['kernel']['id'], kernel['id'])
244244

245245
# check kernel list, to be sure previous kernel was cleaned up
246-
r = requests.get(url_path_join(self.base_url(), 'api/kernels'))
246+
r = self.request('GET', 'api/kernels')
247247
r.raise_for_status()
248248
kernel_list = r.json()
249249
self.assertEqual(kernel_list, [kernel])

notebook/tests/launchnotebook.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
from __future__ import print_function
44

5+
from binascii import hexlify
56
import os
6-
import sys
77
import time
88
import requests
99
from contextlib import contextmanager
@@ -22,6 +22,7 @@
2222

2323
import jupyter_core.paths
2424
from ..notebookapp import NotebookApp
25+
from ..utils import url_path_join
2526
from ipython_genutils.tempdir import TemporaryDirectory
2627

2728
MAX_WAITTIME = 30 # seconds to wait for notebook server to start
@@ -67,6 +68,20 @@ def wait_until_dead(cls):
6768
cls.notebook_thread.join(timeout=MAX_WAITTIME)
6869
if cls.notebook_thread.is_alive():
6970
raise TimeoutError("Undead notebook server")
71+
72+
@classmethod
73+
def request(self, verb, path, **kwargs):
74+
"""Send a request to my server
75+
76+
with authentication and everything.
77+
"""
78+
headers = kwargs.setdefault('headers', {})
79+
# kwargs.setdefault('allow_redirects', False)
80+
headers.setdefault('Authorization', 'token %s' % self.token)
81+
response = requests.request(verb,
82+
url_path_join(self.base_url(), path),
83+
**kwargs)
84+
return response
7085

7186
@classmethod
7287
def setup_class(cls):
@@ -84,6 +99,7 @@ def setup_class(cls):
8499
cls.data_dir = data_dir
85100
cls.runtime_dir = TemporaryDirectory()
86101
cls.notebook_dir = TemporaryDirectory()
102+
cls.token = hexlify(os.urandom(4)).decode('ascii')
87103

88104
started = Event()
89105
def start_thread():
@@ -97,7 +113,7 @@ def start_thread():
97113
notebook_dir=cls.notebook_dir.name,
98114
base_url=cls.url_prefix,
99115
config=cls.config,
100-
token='',
116+
token=cls.token,
101117
)
102118
# don't register signal handler during tests
103119
app.init_signal = lambda : None

0 commit comments

Comments
 (0)