diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/__init__.py | 0 | ||||
-rw-r--r-- | tests/roots/test-basic/bar.rst | 2 | ||||
-rw-r--r-- | tests/roots/test-basic/conf.py | 4 | ||||
-rw-r--r-- | tests/roots/test-basic/foo.rst | 6 | ||||
-rw-r--r-- | tests/roots/test-basic/index.rst | 12 | ||||
-rw-r--r-- | tests/roots/test-empty/conf.py | 4 | ||||
-rw-r--r-- | tests/roots/test-empty/index.rst | 10 | ||||
-rw-r--r-- | tests/roots/test-missing-toctree/conf.py | 4 | ||||
-rw-r--r-- | tests/roots/test-missing-toctree/index.rst | 2 | ||||
-rw-r--r-- | tests/test_builders.py | 87 | ||||
-rw-r--r-- | tests/util.py | 61 |
11 files changed, 192 insertions, 0 deletions
diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/__init__.py diff --git a/tests/roots/test-basic/bar.rst b/tests/roots/test-basic/bar.rst new file mode 100644 index 0000000..1cccd3c --- /dev/null +++ b/tests/roots/test-basic/bar.rst @@ -0,0 +1,2 @@ +bar +=== diff --git a/tests/roots/test-basic/conf.py b/tests/roots/test-basic/conf.py new file mode 100644 index 0000000..e10f5e5 --- /dev/null +++ b/tests/roots/test-basic/conf.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-basic/foo.rst b/tests/roots/test-basic/foo.rst new file mode 100644 index 0000000..468a424 --- /dev/null +++ b/tests/roots/test-basic/foo.rst @@ -0,0 +1,6 @@ +foo +=== + +.. toctree:: + + bar diff --git a/tests/roots/test-basic/index.rst b/tests/roots/test-basic/index.rst new file mode 100644 index 0000000..0a4b347 --- /dev/null +++ b/tests/roots/test-basic/index.rst @@ -0,0 +1,12 @@ +test-basic +========== + +.. toctree:: + + foo + +Heading +------- + +Subheading +~~~~~~~~~~ diff --git a/tests/roots/test-empty/conf.py b/tests/roots/test-empty/conf.py new file mode 100644 index 0000000..e10f5e5 --- /dev/null +++ b/tests/roots/test-empty/conf.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-empty/index.rst b/tests/roots/test-empty/index.rst new file mode 100644 index 0000000..a69c08d --- /dev/null +++ b/tests/roots/test-empty/index.rst @@ -0,0 +1,10 @@ +test-empty +========== + +.. toctree:: + +Heading +------- + +Subheading +~~~~~~~~~~ diff --git a/tests/roots/test-missing-toctree/conf.py b/tests/roots/test-missing-toctree/conf.py new file mode 100644 index 0000000..e10f5e5 --- /dev/null +++ b/tests/roots/test-missing-toctree/conf.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' +exclude_patterns = ['_build'] diff --git a/tests/roots/test-missing-toctree/index.rst b/tests/roots/test-missing-toctree/index.rst new file mode 100644 index 0000000..a085e7f --- /dev/null +++ b/tests/roots/test-missing-toctree/index.rst @@ -0,0 +1,2 @@ +test-missing-toctree +==================== diff --git a/tests/test_builders.py b/tests/test_builders.py new file mode 100644 index 0000000..d3d3c51 --- /dev/null +++ b/tests/test_builders.py @@ -0,0 +1,87 @@ +import os + +import pytest +import sphinx +from sphinx import addnodes +try: + # Available from Sphinx 2.0 + from sphinx.builders.dirhtml import DirectoryHTMLBuilder + from sphinx.builders.singlehtml import SingleFileHTMLBuilder +except ImportError: + from sphinx.builders.html import ( + DirectoryHTMLBuilder, + SingleFileHTMLBuilder, + ) + +from .util import build_all + + +def test_basic(): + for (app, status, warning) in build_all('test-basic'): + assert app.env.get_doctree('index').traverse(addnodes.toctree) + content = open(os.path.join(app.outdir, 'index.html')).read() + + if isinstance(app.builder, DirectoryHTMLBuilder): + search = ( + '<div class="toctree-wrapper compound">\n' + '<ul>\n' + '<li class="toctree-l1">' + '<a class="reference internal" href="foo/">foo</a>' + '<ul>\n' + '<li class="toctree-l2">' + '<a class="reference internal" href="bar/">bar</a></li>\n' + '</ul>\n' + '</li>\n' + '</ul>\n' + '</div>' + ) + assert search in content + elif isinstance(app.builder, SingleFileHTMLBuilder): + search = ( + '<ul>\n' + '<li class="toctree-l1">' + '<a class="reference internal" href="index.html#document-foo">foo</a>' + '</li>\n' + '</ul>' + ) + assert search in content + else: + search = ( + '<div class="toctree-wrapper compound">\n' + '<ul>\n' + '<li class="toctree-l1">' + '<a class="reference internal" href="foo.html">foo</a>' + '<ul>\n' + '<li class="toctree-l2">' + '<a class="reference internal" href="bar.html">bar</a></li>\n' + '</ul>\n' + '</li>\n' + '</ul>\n' + '</div>' + ) + assert search in content, ('Missing search with builder {0}' + .format(app.builder.name)) + + +def test_empty(): + """Local TOC is showing, as toctree was empty""" + for (app, status, warning) in build_all('test-empty'): + assert app.env.get_doctree('index').traverse(addnodes.toctree) + content = open(os.path.join(app.outdir, 'index.html')).read() + global_toc = '<div class="toctree-wrapper compound">\n</div>' + local_toc = ( + '<div class="local-toc"><ul>\n' + '<li><a class="reference internal" href="#">test-empty</a></li>' + '</ul>\n</div>' + ) + assert global_toc in content + assert local_toc not in content + + +def test_missing_toctree(): + """Local TOC is showing, as toctree was missing""" + for (app, status, warning) in build_all('test-missing-toctree'): + assert app.env.get_doctree('index').traverse(addnodes.toctree) == [] + content = open(os.path.join(app.outdir, 'index.html')).read() + assert '<div class="toctree' not in content + assert '<div class="local-toc">' in content diff --git a/tests/util.py b/tests/util.py new file mode 100644 index 0000000..c9fdcc1 --- /dev/null +++ b/tests/util.py @@ -0,0 +1,61 @@ +from __future__ import print_function + +import os +import tempfile +import shutil +from contextlib import contextmanager + +import pytest +from sphinx.application import Sphinx + +try: + from StringIO import StringIO +except ImportError: + from io import StringIO + + +@contextmanager +def build(root, builder='html', **kwargs): + tmpdir = tempfile.mkdtemp() + + srcdir = os.path.join(os.path.dirname(__file__), 'roots', root) + destdir = os.path.join(tmpdir, builder) + doctreedir = os.path.join(tmpdir, 'doctree/') + + status = StringIO() + warning = StringIO() + + kwargs.update({ + 'status': status, + 'warning': warning, + }) + + confoverrides = kwargs.pop('confoverrides', {}) + confoverrides['html_theme'] = 'sphinx_rtd_theme' + extensions = confoverrides.get('extensions', []) + extensions.append('sphinx_rtd_theme') + extensions.append('readthedocs_ext.readthedocs') + confoverrides['extensions'] = extensions + kwargs['confoverrides'] = confoverrides + + try: + app = Sphinx(srcdir, srcdir, destdir, doctreedir, builder, **kwargs) + app.builder.build_all() + yield (app, status.getvalue(), warning.getvalue()) + except Exception as e: + print('# root:', root) + print('# builder:', builder) + print('# source:', srcdir) + print('# destination:', destdir) + print('# status:', '\n' + status.getvalue()) + print('# warning:', '\n' + warning.getvalue()) + raise + finally: + shutil.rmtree(tmpdir) + + +def build_all(root, **kwargs): + for builder in ['html', 'singlehtml', 'readthedocs', 'readthedocsdirhtml', + 'readthedocssinglehtml', 'readthedocssinglehtmllocalmedia']: + with build(root, builder, **kwargs) as ret: + yield ret |