##// END OF EJS Templates
Merge Security Pull Request: security-doc...
Merge Security Pull Request: security-doc Document the notebook security and trust model.

File last commit:

r13947:f5361c44
r15998:0d38cf21 merge
Show More
test_nbconvert_handlers.py
129 lines | 4.8 KiB | text/x-python | PythonLexer
/ IPython / html / nbconvert / tests / test_nbconvert_handlers.py
Thomas Kluyver
Separate listing nbconvert exporters to /api/nbconvert
r13837 # coding: utf-8
Thomas Kluyver
Extract output preprocessor only extracts specified formats
r13921 import base64
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 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,
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 new_heading_cell, new_code_cell,
new_output)
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828
MinRK
skip nbconvert html tests without pandoc
r13947 from IPython.testing.decorators import onlyif_cmds_exist
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 class NbconvertAPI(object):
"""Wrapper for nbconvert API calls."""
def __init__(self, base_url):
self.base_url = base_url
Thomas Kluyver
Add menu entries for getting converted views of a notebook
r13829 def _req(self, verb, path, body=None, params=None):
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 response = requests.request(verb,
url_path_join(self.base_url, 'nbconvert', path),
Thomas Kluyver
Add menu entries for getting converted views of a notebook
r13829 data=body, params=params,
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 )
response.raise_for_status()
return response
Thomas Kluyver
Add menu entries for getting converted views of a notebook
r13829 def from_file(self, format, path, name, download=False):
return self._req('GET', url_path_join(format, path, name),
params={'download':download})
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828
def from_post(self, format, nbmodel):
body = json.dumps(nbmodel)
return self._req('POST', format, body)
Thomas Kluyver
Add GET /nbconvert to list available formats
r13835 def list_formats(self):
return self._req('GET', '')
Thomas Kluyver
Extract output preprocessor only extracts specified formats
r13921 png_green_pixel = base64.encodestring(b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00'
b'\x00\x00\x01\x00\x00x00\x01\x08\x02\x00\x00\x00\x90wS\xde\x00\x00\x00\x0cIDAT'
b'\x08\xd7c\x90\xfb\xcf\x00\x00\x02\\\x01\x1e.~d\x87\x00\x00\x00\x00IEND\xaeB`\x82')
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 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 ³'))
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 cc1 = new_code_cell(input=u'print(2*6)')
cc1.outputs.append(new_output(output_text=u'12'))
Thomas Kluyver
Extract output preprocessor only extracts specified formats
r13921 cc1.outputs.append(new_output(output_png=png_green_pixel, output_type='pyout'))
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 ws.cells.append(cc1)
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828
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)
MinRK
skip nbconvert html tests without pandoc
r13947 @onlyif_cmds_exist('pandoc')
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 def test_from_file(self):
r = self.nbconvert_api.from_file('html', 'foo', 'testnb.ipynb')
self.assertEqual(r.status_code, 200)
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830 self.assertIn(u'text/html', r.headers['Content-Type'])
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 self.assertIn(u'Created by test', r.text)
self.assertIn(u'print', r.text)
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 r = self.nbconvert_api.from_file('python', 'foo', 'testnb.ipynb')
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830 self.assertIn(u'text/x-python', r.headers['Content-Type'])
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 self.assertIn(u'print(2*6)', r.text)
MinRK
skip nbconvert html tests without pandoc
r13947 @onlyif_cmds_exist('pandoc')
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 def test_from_file_404(self):
with assert_http_error(404):
self.nbconvert_api.from_file('html', 'foo', 'thisdoesntexist.ipynb')
MinRK
skip nbconvert html tests without pandoc
r13947 @onlyif_cmds_exist('pandoc')
Thomas Kluyver
Add menu entries for getting converted views of a notebook
r13829 def test_from_file_download(self):
r = self.nbconvert_api.from_file('python', 'foo', 'testnb.ipynb', download=True)
content_disposition = r.headers['Content-Disposition']
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830 self.assertIn('attachment', content_disposition)
self.assertIn('testnb.py', content_disposition)
Thomas Kluyver
Add menu entries for getting converted views of a notebook
r13829
MinRK
skip nbconvert html tests without pandoc
r13947 @onlyif_cmds_exist('pandoc')
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 def test_from_file_zip(self):
r = self.nbconvert_api.from_file('latex', 'foo', 'testnb.ipynb', download=True)
self.assertIn(u'application/zip', r.headers['Content-Type'])
self.assertIn(u'.zip', r.headers['Content-Disposition'])
MinRK
skip nbconvert html tests without pandoc
r13947 @onlyif_cmds_exist('pandoc')
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 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)
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830 self.assertIn(u'text/html', r.headers['Content-Type'])
Thomas Kluyver
Add tests for nbconvert HTTP service
r13828 self.assertIn(u'Created by test', r.text)
self.assertIn(u'print', r.text)
r = self.nbconvert_api.from_post(format='python', nbmodel=nbmodel)
Thomas Kluyver
Add MIME types to nbconvert exporters
r13830 self.assertIn(u'text/x-python', r.headers['Content-Type'])
Thomas Kluyver
Add GET /nbconvert to list available formats
r13835 self.assertIn(u'print(2*6)', r.text)
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919
MinRK
skip nbconvert html tests without pandoc
r13947 @onlyif_cmds_exist('pandoc')
Thomas Kluyver
Serve nbconvert output as zip when it has multiple files
r13919 def test_from_post_zip(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='latex', nbmodel=nbmodel)
self.assertIn(u'application/zip', r.headers['Content-Type'])
self.assertIn(u'.zip', r.headers['Content-Disposition'])