##// END OF EJS Templates
Merge pull request #7906 from minrk/skip-perm-test-windows...
Merge pull request #7906 from minrk/skip-perm-test-windows skip permission error -> 403 test on Windows

File last commit:

r20530:17a88b56
r20577:3924fe03 merge
Show More
test_execute.py
106 lines | 4.1 KiB | text/x-python | PythonLexer
Julia Evans
Add preprocessor to execute notebooks
r17074 """
Julia Evans
s/clearoutput/execute/
r17075 Module with tests for the execute preprocessor.
Julia Evans
Add preprocessor to execute notebooks
r17074 """
# Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
import copy
MinRK
merge separate input/expected notebooks for execute preprocessor
r17101 import glob
MinRK
Don't use nbformat.current in nbconvert
r18605 import io
Julia Evans
Start adding tests from runipy
r17082 import os
import re
Julia Evans
Add preprocessor to execute notebooks
r17074
MinRK
Don't use nbformat.current in nbconvert
r18605 from IPython import nbformat
Julia Evans
Add preprocessor to execute notebooks
r17074
from .base import PreprocessorTestsBase
from ..execute import ExecutePreprocessor
MinRK
strip ANSI colors from tracebacks when normalizing outputs
r17091 from IPython.nbconvert.filters import strip_ansi
addr_pat = re.compile(r'0x[0-9a-f]{7,9}')
Julia Evans
Add preprocessor to execute notebooks
r17074
class TestExecute(PreprocessorTestsBase):
"""Contains test functions for execute.py"""
Julia Evans
Refactor assert_notebooks_equal
r17084 @staticmethod
MinRK
update execute preprocessor for msg spec 5
r17092 def normalize_output(output):
Julia Evans
Refactor assert_notebooks_equal
r17084 """
MinRK
update execute preprocessor for msg spec 5
r17092 Normalizes outputs for comparison.
Julia Evans
Refactor assert_notebooks_equal
r17084 """
MinRK
update execute preprocessor for msg spec 5
r17092 output = dict(output)
if 'metadata' in output:
del output['metadata']
MinRK
move mime-bundle data to rich output.data...
r18589 if 'text' in output:
output['text'] = re.sub(addr_pat, '<HEXADDR>', output['text'])
if 'text/plain' in output.get('data', {}):
output['data']['text/plain'] = \
re.sub(addr_pat, '<HEXADDR>', output['data']['text/plain'])
MinRK
update execute preprocessor for msg spec 5
r17092 if 'traceback' in output:
MinRK
strip ANSI colors from tracebacks when normalizing outputs
r17091 tb = []
MinRK
update execute preprocessor for msg spec 5
r17092 for line in output['traceback']:
MinRK
strip ANSI colors from tracebacks when normalizing outputs
r17091 tb.append(strip_ansi(line))
MinRK
update execute preprocessor for msg spec 5
r17092 output['traceback'] = tb
MinRK
strip ANSI colors from tracebacks when normalizing outputs
r17091
MinRK
update execute preprocessor for msg spec 5
r17092 return output
Julia Evans
Start adding tests from runipy
r17082
def assert_notebooks_equal(self, expected, actual):
MinRK
update nbconvert to nbformat 4
r18580 expected_cells = expected['cells']
actual_cells = actual['cells']
MinRK
address review from takluyver...
r18602 self.assertEqual(len(expected_cells), len(actual_cells))
Julia Evans
Start adding tests from runipy
r17082
Julia Evans
Refactor assert_notebooks_equal
r17084 for expected_cell, actual_cell in zip(expected_cells, actual_cells):
expected_outputs = expected_cell.get('outputs', [])
actual_outputs = actual_cell.get('outputs', [])
MinRK
update execute preprocessor for msg spec 5
r17092 normalized_expected_outputs = list(map(self.normalize_output, expected_outputs))
normalized_actual_outputs = list(map(self.normalize_output, actual_outputs))
MinRK
address review from takluyver...
r18602 self.assertEqual(normalized_expected_outputs, normalized_actual_outputs)
Julia Evans
Start adding tests from runipy
r17082
MinRK
s/prompt_number/execution_count in nbformat 4
r18587 expected_execution_count = expected_cell.get('execution_count', None)
actual_execution_count = actual_cell.get('execution_count', None)
MinRK
address review from takluyver...
r18602 self.assertEqual(expected_execution_count, actual_execution_count)
Jessica B. Hamrick
Add test for prompt numbers
r17823
Julia Evans
Add preprocessor to execute notebooks
r17074
def build_preprocessor(self):
"""Make an instance of a preprocessor"""
preprocessor = ExecutePreprocessor()
preprocessor.enabled = True
return preprocessor
Julia Evans
Start adding tests from runipy
r17082
Julia Evans
Add preprocessor to execute notebooks
r17074 def test_constructor(self):
"""Can a ExecutePreprocessor be constructed?"""
self.build_preprocessor()
Julia Evans
Start adding tests from runipy
r17082
def test_run_notebooks(self):
"""Runs a series of test notebooks and compares them to their actual output"""
current_dir = os.path.dirname(__file__)
MinRK
merge separate input/expected notebooks for execute preprocessor
r17101 input_files = glob.glob(os.path.join(current_dir, 'files', '*.ipynb'))
Julia Evans
Start adding tests from runipy
r17082 for filename in input_files:
MinRK
Don't use nbformat.current in nbconvert
r18605 with io.open(os.path.join(current_dir, 'files', filename)) as f:
input_nb = nbformat.read(f, 4)
Julia Evans
Start adding tests from runipy
r17082 res = self.build_resources()
preprocessor = self.build_preprocessor()
Jessica B. Hamrick
Add test for prompt numbers
r17823 cleaned_input_nb = copy.deepcopy(input_nb)
MinRK
update nbconvert to nbformat 4
r18580 for cell in cleaned_input_nb.cells:
MinRK
s/prompt_number/execution_count in nbformat 4
r18587 if 'execution_count' in cell:
del cell['execution_count']
Jessica B. Hamrick
Add test for prompt numbers
r17823 cell['outputs'] = []
output_nb, _ = preprocessor(cleaned_input_nb, res)
Jessica B. Hamrick
Add test for when stdin is disabled
r20530
if os.path.basename(filename) == "Disable Stdin.ipynb":
# We need to special-case this particular notebook, because the
# traceback contains machine-specific stuff like where IPython
# is installed. It is sufficient here to just check that an error
# was thrown, and that it was a StdinNotImplementedError
self.assertEqual(len(output_nb['cells']), 1)
self.assertEqual(len(output_nb['cells'][0]['outputs']), 1)
output = output_nb['cells'][0]['outputs'][0]
self.assertEqual(output['output_type'], 'error')
self.assertEqual(output['ename'], 'StdinNotImplementedError')
self.assertEqual(output['evalue'], 'raw_input was called, but this frontend does not support input requests.')
else:
self.assert_notebooks_equal(output_nb, input_nb)