test_extractoutput.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. """Tests for the extractoutput preprocessor"""
  2. # Copyright (c) IPython Development Team.
  3. # Distributed under the terms of the Modified BSD License.
  4. import json
  5. from .base import PreprocessorTestsBase
  6. from ..extractoutput import ExtractOutputPreprocessor
  7. class TestExtractOutput(PreprocessorTestsBase):
  8. """Contains test functions for extractoutput.py"""
  9. def build_preprocessor(self):
  10. """Make an instance of a preprocessor"""
  11. preprocessor = ExtractOutputPreprocessor()
  12. preprocessor.extract_output_types = {'text/plain', 'image/png', 'application/pdf'}
  13. preprocessor.enabled = True
  14. return preprocessor
  15. def test_constructor(self):
  16. """Can a ExtractOutputPreprocessor be constructed?"""
  17. self.build_preprocessor()
  18. def test_output(self):
  19. """Test the output of the ExtractOutputPreprocessor"""
  20. nb = self.build_notebook()
  21. res = self.build_resources()
  22. preprocessor = self.build_preprocessor()
  23. nb, res = preprocessor(nb, res)
  24. # Check if text was extracted.
  25. output = nb.cells[0].outputs[1]
  26. self.assertIn('filenames', output.metadata)
  27. self.assertIn('text/plain', output.metadata.filenames)
  28. text_filename = output.metadata.filenames['text/plain']
  29. # Check if png was extracted.
  30. output = nb.cells[0].outputs[6]
  31. self.assertIn('filenames', output.metadata)
  32. self.assertIn('image/png', output.metadata.filenames)
  33. png_filename = output.metadata.filenames['image/png']
  34. # Check that pdf was extracted
  35. output = nb.cells[0].outputs[7]
  36. self.assertIn('filenames', output.metadata)
  37. self.assertIn('application/pdf', output.metadata.filenames)
  38. pdf_filename = output.metadata.filenames['application/pdf']
  39. # Verify text output
  40. self.assertIn(text_filename, res['outputs'])
  41. self.assertEqual(res['outputs'][text_filename], b'b')
  42. # Verify png output
  43. self.assertIn(png_filename, res['outputs'])
  44. self.assertEqual(res['outputs'][png_filename], b'g')
  45. # Verify pdf output
  46. self.assertIn(pdf_filename, res['outputs'])
  47. self.assertEqual(res['outputs'][pdf_filename], b'h')
  48. def test_json_extraction(self):
  49. nb = self.build_notebook(with_json_outputs=True)
  50. res = self.build_resources()
  51. preprocessor = self.build_preprocessor()
  52. preprocessor.extract_output_types = {'application/json'}
  53. nb, res = preprocessor(nb, res)
  54. reference = self.build_notebook(with_json_outputs=True).cells[0].outputs
  55. # Verify cell untouched
  56. self.assertEqual(
  57. [out.get('data') for out in nb.cells[0].outputs],
  58. [out.get('data') for out in reference]
  59. )
  60. outputs = sorted(res['outputs'].values())
  61. reference_files = []
  62. for out in reference:
  63. try:
  64. data = out['data']['application/json']
  65. reference_files.append(json.dumps(data).encode())
  66. except KeyError:
  67. pass
  68. # Verify equivalence of extracted outputs.
  69. self.assertEqual(sorted(outputs), sorted(reference_files))