summaryrefslogtreecommitdiff
path: root/test/test_settings.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_settings.py')
-rwxr-xr-xtest/test_settings.py167
1 files changed, 167 insertions, 0 deletions
diff --git a/test/test_settings.py b/test/test_settings.py
new file mode 100755
index 000000000..c18d613de
--- /dev/null
+++ b/test/test_settings.py
@@ -0,0 +1,167 @@
+#!/usr/bin/env python
+
+# Author: David Goodger
+# Contact: goodger@python.org
+# Revision: $Revision$
+# Date: $Date$
+# Copyright: This module has been placed in the public domain.
+
+"""
+Tests of runtime settings.
+"""
+
+import sys
+import os
+import docutils_difflib
+import pprint
+import warnings
+import unittest
+from types import StringType
+import DocutilsTestSupport # must be imported before docutils
+from docutils import frontend, utils
+from docutils.writers import html4css1, pep_html
+from docutils.parsers import rst
+
+
+warnings.filterwarnings(action='ignore',
+ category=frontend.ConfigDeprecationWarning)
+
+def fixpath(path):
+ return os.path.abspath(os.path.join(*(path.split('/'))))
+
+
+class ConfigFileTests(unittest.TestCase):
+
+ config_files = {'old': fixpath('data/config_old.txt'),
+ 'one': fixpath('data/config_1.txt'),
+ 'two': fixpath('data/config_2.txt'),
+ 'list': fixpath('data/config_list.txt'),
+ 'list2': fixpath('data/config_list_2.txt'),
+ 'error': fixpath('data/config_error_handler.txt')}
+
+ settings = {
+ 'old': {'datestamp': '%Y-%m-%d %H:%M UTC',
+ 'generator': 1,
+ 'no_random': 1,
+ 'python_home': 'http://www.python.org',
+ 'source_link': 1,
+ 'stylesheet': None,
+ 'stylesheet_path': fixpath('data/stylesheets/pep.css'),
+ 'template': fixpath('data/pep-html-template')},
+ 'one': {'datestamp': '%Y-%m-%d %H:%M UTC',
+ 'generator': 1,
+ 'no_random': 1,
+ 'python_home': 'http://www.python.org',
+ 'record_dependencies': utils.DependencyList(),
+ 'source_link': 1,
+ 'stylesheet': None,
+ 'stylesheet_path': fixpath('data/stylesheets/pep.css'),
+ 'tab_width': 8,
+ 'template': fixpath('data/pep-html-template'),
+ 'trim_footnote_reference_space': 1},
+ 'two': {'footnote_references': 'superscript',
+ 'generator': 0,
+ 'record_dependencies': utils.DependencyList(),
+ 'stylesheet': None,
+ 'stylesheet_path': fixpath('data/test.css'),
+ 'trim_footnote_reference_space': None},
+ 'list': {'expose_internals': ['a', 'b', 'c', 'd', 'e']},
+ 'list2': {'expose_internals': ['a', 'b', 'c', 'd', 'e', 'f']},
+ 'error': {'error_encoding': 'ascii',
+ 'error_encoding_error_handler': 'strict'},
+ }
+
+ compare = docutils_difflib.Differ().compare
+ """Comparison method shared by all tests."""
+
+ def setUp(self):
+ self.option_parser = frontend.OptionParser(
+ components=(pep_html.Writer, rst.Parser), read_config_files=None)
+
+ def files_settings(self, *names):
+ settings = frontend.Values()
+ for name in names:
+ settings.update(self.option_parser.get_config_file_settings(
+ self.config_files[name]), self.option_parser)
+ return settings.__dict__
+
+ def expected_settings(self, *names):
+ expected = {}
+ for name in names:
+ expected.update(self.settings[name])
+ return expected
+
+ def compare_output(self, result, expected):
+ """`result` and `expected` should both be dicts."""
+ self.assert_(result.has_key('record_dependencies'))
+ if not expected.has_key('record_dependencies'):
+ # Delete it if we don't want to test it.
+ del result['record_dependencies']
+ result = pprint.pformat(result) + '\n'
+ expected = pprint.pformat(expected) + '\n'
+ try:
+ self.assertEquals(result, expected)
+ except AssertionError:
+ print >>sys.stderr, '\n%s\n' % (self,)
+ print >>sys.stderr, '-: expected\n+: result'
+ print >>sys.stderr, ''.join(self.compare(expected.splitlines(1),
+ result.splitlines(1)))
+ raise
+
+ def test_nofiles(self):
+ self.compare_output(self.files_settings(),
+ self.expected_settings())
+
+ def test_old(self):
+ self.compare_output(self.files_settings('old'),
+ self.expected_settings('old'))
+
+ def test_one(self):
+ self.compare_output(self.files_settings('one'),
+ self.expected_settings('one'))
+
+ def test_multiple(self):
+ self.compare_output(self.files_settings('one', 'two'),
+ self.expected_settings('one', 'two'))
+
+ def test_old_and_new(self):
+ self.compare_output(self.files_settings('old', 'two'),
+ self.expected_settings('old', 'two'))
+
+ def test_list(self):
+ self.compare_output(self.files_settings('list'),
+ self.expected_settings('list'))
+
+ def test_list2(self):
+ self.compare_output(self.files_settings('list', 'list2'),
+ self.expected_settings('list2'))
+
+ def test_error_handler(self):
+ self.compare_output(self.files_settings('error'),
+ self.expected_settings('error'))
+
+
+class ConfigEnvVarFileTests(ConfigFileTests):
+
+ """
+ Repeats the tests of `ConfigFileTests` using the ``DOCUTILSCONFIG``
+ environment variable and the standard Docutils config file mechanism.
+ """
+
+ def setUp(self):
+ ConfigFileTests.setUp(self)
+ self.orig_environ = os.environ
+ os.environ = os.environ.copy()
+
+ def files_settings(self, *names):
+ files = [self.config_files[name] for name in names]
+ os.environ['DOCUTILSCONFIG'] = os.pathsep.join(files)
+ settings = self.option_parser.get_standard_config_settings()
+ return settings.__dict__
+
+ def tearDown(self):
+ os.environ = self.orig_environ
+
+
+if __name__ == '__main__':
+ unittest.main()