"""Tests for the extractoutput preprocessor""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import json from .base import PreprocessorTestsBase from ..extractoutput import ExtractOutputPreprocessor class TestExtractOutput(PreprocessorTestsBase): """Contains test functions for extractoutput.py""" def build_preprocessor(self): """Make an instance of a preprocessor""" preprocessor = ExtractOutputPreprocessor() preprocessor.extract_output_types = {'text/plain', 'image/png', 'application/pdf'} preprocessor.enabled = True return preprocessor def test_constructor(self): """Can a ExtractOutputPreprocessor be constructed?""" self.build_preprocessor() def test_output(self): """Test the output of the ExtractOutputPreprocessor""" nb = self.build_notebook() res = self.build_resources() preprocessor = self.build_preprocessor() nb, res = preprocessor(nb, res) # Check if text was extracted. output = nb.cells[0].outputs[1] self.assertIn('filenames', output.metadata) self.assertIn('text/plain', output.metadata.filenames) text_filename = output.metadata.filenames['text/plain'] # Check if png was extracted. output = nb.cells[0].outputs[6] self.assertIn('filenames', output.metadata) self.assertIn('image/png', output.metadata.filenames) png_filename = output.metadata.filenames['image/png'] # Check that pdf was extracted output = nb.cells[0].outputs[7] self.assertIn('filenames', output.metadata) self.assertIn('application/pdf', output.metadata.filenames) pdf_filename = output.metadata.filenames['application/pdf'] # Verify text output self.assertIn(text_filename, res['outputs']) self.assertEqual(res['outputs'][text_filename], b'b') # Verify png output self.assertIn(png_filename, res['outputs']) self.assertEqual(res['outputs'][png_filename], b'g') # Verify pdf output self.assertIn(pdf_filename, res['outputs']) self.assertEqual(res['outputs'][pdf_filename], b'h') def test_json_extraction(self): nb = self.build_notebook(with_json_outputs=True) res = self.build_resources() preprocessor = self.build_preprocessor() preprocessor.extract_output_types = {'application/json'} nb, res = preprocessor(nb, res) reference = self.build_notebook(with_json_outputs=True).cells[0].outputs # Verify cell untouched self.assertEqual( [out.get('data') for out in nb.cells[0].outputs], [out.get('data') for out in reference] ) outputs = sorted(res['outputs'].values()) reference_files = [] for out in reference: try: data = out['data']['application/json'] reference_files.append(json.dumps(data).encode()) except KeyError: pass # Verify equivalence of extracted outputs. self.assertEqual(sorted(outputs), sorted(reference_files))