From 52a4b7c18dac8f2dacedd6b784ffa29a6be6ee2d 2013-12-13 22:46:50
From: Thomas Kluyver <takowl@gmail.com>
Date: 2013-12-13 22:46:50
Subject: [PATCH] Add tests for nbconvert HTTP service

---

diff --git a/IPython/html/nbconvert/tests/__init__.py b/IPython/html/nbconvert/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/IPython/html/nbconvert/tests/__init__.py
diff --git a/IPython/html/nbconvert/tests/test_nbconvert_api.py b/IPython/html/nbconvert/tests/test_nbconvert_api.py
new file mode 100644
index 0000000..045ef0d
--- /dev/null
+++ b/IPython/html/nbconvert/tests/test_nbconvert_api.py
@@ -0,0 +1,83 @@
+import io
+import json
+import os
+from os.path import join as pjoin
+import shutil
+
+import requests
+
+from IPython.html.utils import url_path_join
+from IPython.html.tests.launchnotebook import NotebookTestBase, assert_http_error
+from IPython.nbformat.current import (new_notebook, write, new_worksheet,
+                                      new_heading_cell, new_code_cell)
+
+class NbconvertAPI(object):
+    """Wrapper for nbconvert 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, 'nbconvert', path),
+                data=body,
+        )
+        response.raise_for_status()
+        return response
+
+    def from_file(self, format, path, name):
+        return self._req('GET', url_path_join(format, path, name))
+
+    def from_post(self, format, nbmodel):
+        body = json.dumps(nbmodel)
+        return self._req('POST', format, body)
+
+class APITest(NotebookTestBase):
+    def setUp(self):
+        nbdir = self.notebook_dir.name
+        
+        if not os.path.isdir(pjoin(nbdir, 'foo')):
+            os.mkdir(pjoin(nbdir, 'foo'))
+        
+        nb = new_notebook(name='testnb')
+        
+        ws = new_worksheet()
+        nb.worksheets = [ws]
+        ws.cells.append(new_heading_cell(u'Created by test ³'))
+        ws.cells.append(new_code_cell(input=u'print(2*6)'))
+        
+        with io.open(pjoin(nbdir, 'foo', 'testnb.ipynb'), 'w',
+                     encoding='utf-8') as f:
+            write(nb, f, format='ipynb')
+
+        self.nbconvert_api = NbconvertAPI(self.base_url())
+
+    def tearDown(self):
+        nbdir = self.notebook_dir.name
+
+        for dname in ['foo']:
+            shutil.rmtree(pjoin(nbdir, dname), ignore_errors=True)
+    
+    def test_from_file(self):
+        r = self.nbconvert_api.from_file('html', 'foo', 'testnb.ipynb')
+        self.assertEqual(r.status_code, 200)
+        self.assertIn(u'Created by test', r.text)
+        self.assertIn(u'print', r.text)
+        
+        r = self.nbconvert_api.from_file('python', 'foo', 'testnb.ipynb')
+        self.assertIn(u'print(2*6)', r.text)
+
+    def test_from_file_404(self):
+        with assert_http_error(404):
+            self.nbconvert_api.from_file('html', 'foo', 'thisdoesntexist.ipynb')
+
+    def test_from_post(self):
+        nbmodel_url = url_path_join(self.base_url(), 'api/notebooks/foo/testnb.ipynb')
+        nbmodel = requests.get(nbmodel_url).json()
+        
+        r = self.nbconvert_api.from_post(format='html', nbmodel=nbmodel)
+        self.assertEqual(r.status_code, 200)
+        self.assertIn(u'Created by test', r.text)
+        self.assertIn(u'print', r.text)
+        
+        r = self.nbconvert_api.from_post(format='python', nbmodel=nbmodel)
+        self.assertIn(u'print(2*6)', r.text)
\ No newline at end of file