diff --git a/IPython/html/services/notebooks/tests/test_notebooks_api.py b/IPython/html/services/notebooks/tests/test_notebooks_api.py
index 842fa16..65b7f12 100644
--- a/IPython/html/services/notebooks/tests/test_notebooks_api.py
+++ b/IPython/html/services/notebooks/tests/test_notebooks_api.py
@@ -13,7 +13,7 @@ pjoin = os.path.join
import requests
from IPython.html.utils import url_path_join
-from IPython.html.tests.launchnotebook import NotebookTestBase
+from IPython.html.tests.launchnotebook import NotebookTestBase, assert_http_error
from IPython.nbformat.current import (new_notebook, write, read, new_worksheet,
new_heading_cell, to_notebook_json)
from IPython.utils.data import uniq_stable
@@ -119,13 +119,9 @@ class APITest(NotebookTestBase):
expected = { normalize('NFC', name) for name in expected }
self.assertEqual(nbnames, expected)
- def assert_404(self, name, path):
- try:
- self.nb_api.read(name, path)
- except requests.HTTPError as e:
- self.assertEqual(e.response.status_code, 404)
- else:
- assert False, "Reading a non-existent notebook should fail"
+ def test_list_nonexistant_dir(self):
+ with assert_http_error(404):
+ self.nb_api.list('nonexistant')
def test_get_contents(self):
for d, name in self.dirs_nbs:
@@ -136,7 +132,8 @@ class APITest(NotebookTestBase):
self.assertIsInstance(nb['content']['metadata'], dict)
# Name that doesn't exist - should be a 404
- self.assert_404('q.ipynb', 'foo')
+ with assert_http_error(404):
+ self.nb_api.read('q.ipynb', 'foo')
def _check_nb_created(self, resp, name, path):
self.assertEqual(resp.status_code, 201)
@@ -212,4 +209,5 @@ class APITest(NotebookTestBase):
self.assertEqual(saved['path'], 'foo/bar')
assert os.path.isfile(pjoin(self.notebook_dir.name,'foo','bar','a2.ipynb'))
assert not os.path.isfile(pjoin(self.notebook_dir.name, 'foo', 'a.ipynb'))
- self.assert_404('a.ipynb', 'foo')
\ No newline at end of file
+ with assert_http_error(404):
+ self.nb_api.read('a.ipynb', 'foo')
\ No newline at end of file
diff --git a/IPython/html/services/sessions/tests/test_sessions_api.py b/IPython/html/services/sessions/tests/test_sessions_api.py
index 743789e..e36cdd7 100644
--- a/IPython/html/services/sessions/tests/test_sessions_api.py
+++ b/IPython/html/services/sessions/tests/test_sessions_api.py
@@ -9,7 +9,7 @@ import shutil
pjoin = os.path.join
from IPython.html.utils import url_path_join
-from IPython.html.tests.launchnotebook import NotebookTestBase
+from IPython.html.tests.launchnotebook import NotebookTestBase, assert_http_error
from IPython.nbformat.current import new_notebook, write
class SessionAPI(object):
@@ -64,14 +64,6 @@ class SessionAPITest(NotebookTestBase):
self.sess_api.delete(session['id'])
shutil.rmtree(pjoin(self.notebook_dir.name, 'foo'))
- def assert_404(self, id):
- try:
- self.sess_api.get(id)
- except requests.HTTPError as e:
- self.assertEqual(e.response.status_code, 404)
- else:
- assert False, "Getting nonexistent session didn't give HTTP error"
-
def test_create(self):
sessions = self.sess_api.list().json()
self.assertEqual(len(sessions), 0)
@@ -101,7 +93,8 @@ class SessionAPITest(NotebookTestBase):
sessions = self.sess_api.list().json()
self.assertEqual(sessions, [])
- self.assert_404(sid)
+ with assert_http_error(404):
+ self.sess_api.get(sid)
def test_modify(self):
newsession = self.sess_api.create('nb1.ipynb', 'foo').json()
diff --git a/IPython/html/tests/launchnotebook.py b/IPython/html/tests/launchnotebook.py
index 661502c..078b7d0 100644
--- a/IPython/html/tests/launchnotebook.py
+++ b/IPython/html/tests/launchnotebook.py
@@ -3,12 +3,12 @@
import sys
import time
import requests
+from contextlib import contextmanager
from subprocess import Popen, PIPE
from unittest import TestCase
from IPython.utils.tempdir import TemporaryDirectory
-
class NotebookTestBase(TestCase):
"""A base class for tests that need a running notebook.
@@ -67,3 +67,15 @@ class NotebookTestBase(TestCase):
@classmethod
def base_url(cls):
return 'http://localhost:%i/' % cls.port
+
+
+@contextmanager
+def assert_http_error(status):
+ try:
+ yield
+ except requests.HTTPError as e:
+ real_status = e.response.status_code
+ assert real_status == status, \
+ "Expected status %d, got %d" % (real_status, status)
+ else:
+ assert False, "Expected HTTP error status"
\ No newline at end of file