##// END OF EJS Templates
Merge pull request #7554 from jdfreder/interact-fix...
Merge pull request #7554 from jdfreder/interact-fix Use Output widget with Interact

File last commit:

r19570:c62c62f9
r20261:6bf6e5ac merge
Show More
test_sessions_api.py
124 lines | 3.9 KiB | text/x-python | PythonLexer
Zachary Sailer
add tests for session api
r13044 """Test the sessions web service API."""
Thomas Kluyver
Make sessions REST API test more robust....
r13401 import errno
Thomas Kluyver
Improve Session REST API tests
r13093 import io
Zachary Sailer
add tests for session api
r13044 import os
import json
import requests
Thomas Kluyver
Improve Session REST API tests
r13093 import shutil
Thomas Kluyver
Add a brief sleep after shutting down sessions in test teardown...
r19570 import time
Thomas Kluyver
Improve Session REST API tests
r13093
pjoin = os.path.join
Zachary Sailer
add tests for session api
r13044
Zachary Sailer
Code review changes....
r13048 from IPython.html.utils import url_path_join
Thomas Kluyver
Add failing test for listing nonexistant directory
r13099 from IPython.html.tests.launchnotebook import NotebookTestBase, assert_http_error
MinRK
don't use nbformat.current in IPython.html...
r18607 from IPython.nbformat.v4 import new_notebook
from IPython.nbformat import write
Thomas Kluyver
Improve Session REST API tests
r13093
class SessionAPI(object):
"""Wrapper for notebook API calls."""
def __init__(self, base_url):
self.base_url = base_url
def _req(self, verb, path, body=None):
response = requests.request(verb,
url_path_join(self.base_url, 'api/sessions', path), data=body)
if 400 <= response.status_code < 600:
try:
response.reason = response.json()['message']
except:
pass
response.raise_for_status()
return response
def list(self):
return self._req('GET', '')
def get(self, id):
return self._req('GET', id)
Min RK
remove notebook['name'] from sessions
r18751 def create(self, path, kernel_name='python'):
body = json.dumps({'notebook': {'path':path},
Thomas Kluyver
Add kernel name to sessions REST API...
r17222 'kernel': {'name': kernel_name}})
Thomas Kluyver
Improve Session REST API tests
r13093 return self._req('POST', '', body)
Min RK
remove notebook['name'] from sessions
r18751 def modify(self, id, path):
body = json.dumps({'notebook': {'path':path}})
Thomas Kluyver
Improve Session REST API tests
r13093 return self._req('PATCH', id, body)
def delete(self, id):
return self._req('DELETE', id)
Zachary Sailer
add tests for session api
r13044
class SessionAPITest(NotebookTestBase):
"""Test the sessions web service API"""
Thomas Kluyver
Improve Session REST API tests
r13093 def setUp(self):
nbdir = self.notebook_dir.name
Thomas Kluyver
Make sessions REST API test more robust....
r13401 try:
os.mkdir(pjoin(nbdir, 'foo'))
except OSError as e:
# Deleting the folder in an earlier test may have failed
if e.errno != errno.EEXIST:
raise
Thomas Kluyver
Improve Session REST API tests
r13093
Thomas Kluyver
Specify encoding in remainining instances of io.open
r13657 with io.open(pjoin(nbdir, 'foo', 'nb1.ipynb'), 'w',
encoding='utf-8') as f:
MinRK
update html/js to nbformat 4
r18584 nb = new_notebook()
Min RK
fix backward `f, nb` args for nbformat.write
r18613 write(nb, f, version=4)
Thomas Kluyver
Improve Session REST API tests
r13093
self.sess_api = SessionAPI(self.base_url())
def tearDown(self):
for session in self.sess_api.list().json():
self.sess_api.delete(session['id'])
Thomas Kluyver
Add a brief sleep after shutting down sessions in test teardown...
r19570 # This is necessary in some situations on Windows: without it, it
# fails to delete the directory because something is still using it. I
# think there is a brief period after the kernel terminates where
# Windows still treats its working directory as in use. On my Windows
# VM, 0.01s is not long enough, but 0.1s appears to work reliably.
# -- TK, 15 December 2014
time.sleep(0.1)
Thomas Kluyver
Make sessions REST API test more robust....
r13401 shutil.rmtree(pjoin(self.notebook_dir.name, 'foo'),
ignore_errors=True)
Thomas Kluyver
Improve Session REST API tests
r13093
def test_create(self):
sessions = self.sess_api.list().json()
self.assertEqual(len(sessions), 0)
Min RK
remove notebook['name'] from sessions
r18751 resp = self.sess_api.create('foo/nb1.ipynb')
Thomas Kluyver
Improve Session REST API tests
r13093 self.assertEqual(resp.status_code, 201)
newsession = resp.json()
self.assertIn('id', newsession)
Min RK
remove notebook['name'] from sessions
r18751 self.assertEqual(newsession['notebook']['path'], 'foo/nb1.ipynb')
Brian E. Granger
Improving tests and setting of Location header.
r13116 self.assertEqual(resp.headers['Location'], '/api/sessions/{0}'.format(newsession['id']))
Thomas Kluyver
Improve Session REST API tests
r13093
sessions = self.sess_api.list().json()
self.assertEqual(sessions, [newsession])
# Retrieve it
sid = newsession['id']
Thomas Kluyver
Fix session API tests
r13094 got = self.sess_api.get(sid).json()
Thomas Kluyver
Improve Session REST API tests
r13093 self.assertEqual(got, newsession)
def test_delete(self):
Min RK
remove notebook['name'] from sessions
r18751 newsession = self.sess_api.create('foo/nb1.ipynb').json()
Thomas Kluyver
Improve Session REST API tests
r13093 sid = newsession['id']
resp = self.sess_api.delete(sid)
self.assertEqual(resp.status_code, 204)
sessions = self.sess_api.list().json()
self.assertEqual(sessions, [])
Thomas Kluyver
Add failing test for listing nonexistant directory
r13099 with assert_http_error(404):
self.sess_api.get(sid)
Thomas Kluyver
Improve Session REST API tests
r13093
def test_modify(self):
Min RK
remove notebook['name'] from sessions
r18751 newsession = self.sess_api.create('foo/nb1.ipynb').json()
Thomas Kluyver
Improve Session REST API tests
r13093 sid = newsession['id']
Min RK
remove notebook['name'] from sessions
r18751 changed = self.sess_api.modify(sid, 'nb2.ipynb').json()
Thomas Kluyver
Improve Session REST API tests
r13093 self.assertEqual(changed['id'], sid)
Min RK
remove notebook['name'] from sessions
r18751 self.assertEqual(changed['notebook']['path'], 'nb2.ipynb')