"""Test the sessions web service API.""" import os import sys import json from zmq.utils import jsonapi import requests from IPython.html.utils import url_path_join from IPython.html.tests.launchnotebook import NotebookTestBase class SessionAPITest(NotebookTestBase): """Test the sessions web service API""" def notebook_url(self): return url_path_join(super(SessionAPITest,self).base_url(), 'api/notebooks') def session_url(self): return super(SessionAPITest,self).base_url() + 'api/sessions' def mknb(self, name='', path='/'): url = self.notebook_url() + path return url, requests.post(url) def delnb(self, name, path='/'): url = self.notebook_url() + path + name r = requests.delete(url) return r.status_code def test_no_sessions(self): """Make sure there are no sessions running at the start""" url = self.session_url() r = requests.get(url) self.assertEqual(r.json(), []) def test_session_root_handler(self): # POST a session url, nb = self.mknb() notebook = nb.json() param = {'notebook_path': notebook['path'] + notebook['name']} r = requests.post(self.session_url(), params=param) data = r.json() assert isinstance(data, dict) self.assertIn('name', data) self.assertEqual(data['name'], notebook['name']) # GET sessions r = requests.get(self.session_url()) assert isinstance(r.json(), list) assert isinstance(r.json()[0], dict) self.assertEqual(r.json()[0]['id'], data['id']) # Clean up self.delnb('Untitled0.ipynb') sess_url = self.session_url() +'/'+data['id'] r = requests.delete(sess_url) self.assertEqual(r.status_code, 204) def test_session_handler(self): # Create a session url, nb = self.mknb() notebook = nb.json() param = {'notebook_path': notebook['path'] + notebook['name']} r = requests.post(self.session_url(), params=param) session = r.json() # GET a session sess_url = self.session_url() + '/' + session['id'] r = requests.get(sess_url) assert isinstance(r.json(), dict) self.assertEqual(r.json(), session) # PATCH a session data = {'notebook_path': 'test.ipynb'} r = requests.patch(sess_url, data=jsonapi.dumps(data)) # Patching the notebook webservice too (just for consistency) requests.patch(self.notebook_url() + '/Untitled0.ipynb', data=jsonapi.dumps({'name':'test.ipynb'})) assert isinstance(r.json(), dict) self.assertIn('name', r.json()) self.assertIn('id', r.json()) self.assertEqual(r.json()['name'], 'test.ipynb') self.assertEqual(r.json()['id'], session['id']) # DELETE a session r = requests.delete(sess_url) self.assertEqual(r.status_code, 204) r = requests.get(self.session_url()) self.assertEqual(r.json(), []) # Clean up r = self.delnb('test.ipynb') self.assertEqual(r, 204)