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