summaryrefslogtreecommitdiff
path: root/test/test_publisher.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_publisher.py')
-rwxr-xr-xtest/test_publisher.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/test/test_publisher.py b/test/test_publisher.py
new file mode 100755
index 000000000..708c3ef87
--- /dev/null
+++ b/test/test_publisher.py
@@ -0,0 +1,143 @@
+#!/usr/bin/env python
+
+# Author: Martin Blais
+# Contact: blais@furius.ca
+# Revision: $Revision$
+# Date: $Date$
+# Copyright: This module has been placed in the public domain.
+
+"""
+Test the `Publisher` facade and the ``publish_*`` convenience functions.
+"""
+
+import pickle
+from types import StringType, DictType
+import DocutilsTestSupport # must be imported before docutils
+import docutils
+from docutils import core, nodes, io
+
+
+test_document = """\
+Test Document
+=============
+
+This is a test document with a broken reference: nonexistent_
+"""
+pseudoxml_output = """\
+<document ids="test-document" names="test\ document" source="<string>" title="Test Document">
+ <title>
+ Test Document
+ <paragraph>
+ This is a test document with a broken reference: \n\
+ <problematic ids="id2" refid="id1">
+ nonexistent_
+ <section classes="system-messages">
+ <title>
+ Docutils System Messages
+ <system_message backrefs="id2" ids="id1" level="3" line="4" source="<string>" type="ERROR">
+ <paragraph>
+ Unknown target name: "nonexistent".
+"""
+exposed_pseudoxml_output = """\
+<document ids="test-document" internal:refnames="{u\'nonexistent\': [<reference: <#text: u\'nonexistent\'>>]}" names="test\ document" source="<string>" title="Test Document">
+ <title>
+ Test Document
+ <paragraph>
+ This is a test document with a broken reference: \n\
+ <problematic ids="id2" refid="id1">
+ nonexistent_
+ <section classes="system-messages">
+ <title>
+ Docutils System Messages
+ <system_message backrefs="id2" ids="id1" level="3" line="4" source="<string>" type="ERROR">
+ <paragraph>
+ Unknown target name: "nonexistent".
+"""
+
+
+class PublishDoctreeTestCase(DocutilsTestSupport.StandardTestCase, docutils.SettingsSpec):
+
+ settings_default_overrides = {
+ '_disable_config': 1,
+ 'warning_stream': io.NullOutput()}
+
+ def test_publish_doctree(self):
+ # Test `publish_doctree` and `publish_from_doctree`.
+
+ # Produce the document tree.
+ doctree = core.publish_doctree(
+ source=test_document, reader_name='standalone',
+ parser_name='restructuredtext', settings_spec=self,
+ settings_overrides={'expose_internals':
+ ['refnames', 'do_not_expose'],
+ 'report_level': 5})
+ self.assert_(isinstance(doctree, nodes.document))
+
+ # Confirm that transforms have been applied (in this case, the
+ # DocTitle transform):
+ self.assert_(isinstance(doctree[0], nodes.title))
+ self.assert_(isinstance(doctree[1], nodes.paragraph))
+ # Confirm that the Messages transform has not yet been applied:
+ self.assertEquals(len(doctree), 2)
+
+ # The `do_not_expose` attribute may not show up in the
+ # pseudoxml output because the expose_internals transform may
+ # not be applied twice.
+ doctree.do_not_expose = 'test'
+ # Write out the document:
+ output = core.publish_from_doctree(
+ doctree, writer_name='pseudoxml',
+ settings_spec=self,
+ settings_overrides={'expose_internals':
+ ['refnames', 'do_not_expose'],
+ 'report_level': 1})
+ self.assertEquals(output, exposed_pseudoxml_output)
+
+ # Test publishing parts using document as the source.
+ parts = core.publish_parts(
+ reader_name='doctree', source_class=io.DocTreeInput,
+ source=doctree, source_path='test', writer_name='html',
+ settings_spec=self)
+ self.assert_(isinstance(parts, DictType))
+
+ def test_publish_pickle(self):
+ # Test publishing a document tree with pickling and unpickling.
+
+ # Produce the document tree.
+ doctree = core.publish_doctree(
+ source=test_document,
+ reader_name='standalone',
+ parser_name='restructuredtext',
+ settings_spec=self)
+ self.assert_(isinstance(doctree, nodes.document))
+
+ # Pickle the document. Note: if this fails, some unpickleable
+ # reference has been added somewhere within the document tree.
+ # If so, you need to fix that.
+ #
+ # Note: Please do not remove this test, this is an important
+ # requirement, applications will be built on the assumption
+ # that we can pickle the document.
+
+ # Remove the reporter and the transformer before pickling.
+ doctree.reporter = None
+ doctree.transformer = None
+
+ doctree_pickled = pickle.dumps(doctree)
+ self.assert_(isinstance(doctree_pickled, StringType))
+ del doctree
+
+ # Unpickle the document.
+ doctree_zombie = pickle.loads(doctree_pickled)
+ self.assert_(isinstance(doctree_zombie, nodes.document))
+
+ # Write out the document:
+ output = core.publish_from_doctree(
+ doctree_zombie, writer_name='pseudoxml',
+ settings_spec=self)
+ self.assertEquals(output, pseudoxml_output)
+
+
+if __name__ == '__main__':
+ import unittest
+ unittest.main()