summaryrefslogtreecommitdiffstats
path: root/tests/test_setup_command.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_setup_command.py')
-rw-r--r--tests/test_setup_command.py137
1 files changed, 137 insertions, 0 deletions
diff --git a/tests/test_setup_command.py b/tests/test_setup_command.py
new file mode 100644
index 0000000..ef36467
--- /dev/null
+++ b/tests/test_setup_command.py
@@ -0,0 +1,137 @@
+"""Test setup_command for distutils."""
+
+import os
+import subprocess
+import sys
+from collections import namedtuple
+from textwrap import dedent
+
+import pytest
+
+import sphinx
+from sphinx.util.osutil import cd
+
+
+@pytest.fixture
+def setup_command(request, tempdir, rootdir):
+ """
+ Run `setup.py build_sphinx` with args and kwargs,
+ pass it to the test and clean up properly.
+ """
+ marker = request.node.get_closest_marker('setup_command')
+ args = marker.args if marker else []
+
+ pkgrootdir = tempdir / 'test-setup'
+ (rootdir / 'test-setup').copytree(pkgrootdir)
+
+ with cd(pkgrootdir):
+ pythonpath = os.path.dirname(os.path.dirname(sphinx.__file__))
+ if os.getenv('PYTHONPATH'):
+ pythonpath = os.getenv('PYTHONPATH') + os.pathsep + pythonpath
+ command = [sys.executable, 'setup.py', 'build_sphinx']
+ command.extend(args)
+
+ proc = subprocess.Popen(
+ command,
+ env=dict(os.environ, PYTHONPATH=pythonpath),
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ yield namedtuple('setup', 'pkgroot,proc')(pkgrootdir, proc)
+
+
+def test_build_sphinx(setup_command):
+ proc = setup_command.proc
+ out, err = proc.communicate()
+ print(out.decode())
+ print(err.decode())
+ assert proc.returncode == 0
+
+
+@pytest.mark.setup_command('-b', 'html,man')
+def test_build_sphinx_multiple_builders(setup_command):
+ proc = setup_command.proc
+ out, err = proc.communicate()
+ print(out.decode())
+ print(err.decode())
+ assert proc.returncode == 0
+
+
+@pytest.mark.setup_command('-b', 'html,bar')
+def test_build_sphinx_multiple_invalid_builders(setup_command):
+ proc = setup_command.proc
+ out, err = proc.communicate()
+ print(out.decode())
+ print(err.decode())
+ assert proc.returncode == 1
+
+
+@pytest.fixture
+def nonascii_srcdir(request, setup_command):
+ mb_name = '\u65e5\u672c\u8a9e'
+ srcdir = (setup_command.pkgroot / 'doc')
+ try:
+ (srcdir / mb_name).makedirs()
+ except UnicodeEncodeError:
+ from sphinx.testing.path import FILESYSTEMENCODING
+ pytest.skip(
+ 'non-ASCII filename not supported on this filesystem encoding: '
+ '%s' % FILESYSTEMENCODING)
+
+ (srcdir / mb_name / (mb_name + '.txt')).write_text(dedent("""
+ multi byte file name page
+ ==========================
+ """), encoding='utf8')
+
+ root_doc = srcdir / 'index.txt'
+ root_doc.write_bytes((root_doc.read_text(encoding='utf8') + dedent("""
+ .. toctree::
+
+ %(mb_name)s/%(mb_name)s
+ """ % locals())).encode())
+
+
+@pytest.mark.usefixtures('nonascii_srcdir')
+def test_build_sphinx_with_nonascii_path(setup_command):
+ proc = setup_command.proc
+ out, err = proc.communicate()
+ print(out.decode())
+ print(err.decode())
+ assert proc.returncode == 0
+
+
+@pytest.mark.setup_command('-b', 'linkcheck')
+def test_build_sphinx_return_nonzero_status(setup_command):
+ srcdir = (setup_command.pkgroot / 'doc')
+ (srcdir / 'contents.txt').write_text(
+ 'http://localhost.unexistentdomain/index.html',
+ encoding='utf8')
+ proc = setup_command.proc
+ out, err = proc.communicate()
+ print(out.decode())
+ print(err.decode())
+ assert proc.returncode != 0, 'expect non-zero status for setup.py'
+
+
+def test_build_sphinx_warning_return_zero_status(setup_command):
+ srcdir = (setup_command.pkgroot / 'doc')
+ (srcdir / 'contents.txt').write_text(
+ 'See :ref:`unexisting-reference-label`',
+ encoding='utf8')
+ proc = setup_command.proc
+ out, err = proc.communicate()
+ print(out.decode())
+ print(err.decode())
+ assert proc.returncode == 0
+
+
+@pytest.mark.setup_command('--warning-is-error')
+def test_build_sphinx_warning_is_error_return_nonzero_status(setup_command):
+ srcdir = (setup_command.pkgroot / 'doc')
+ (srcdir / 'contents.txt').write_text(
+ 'See :ref:`unexisting-reference-label`',
+ encoding='utf8')
+ proc = setup_command.proc
+ out, err = proc.communicate()
+ print(out.decode())
+ print(err.decode())
+ assert proc.returncode != 0, 'expect non-zero status for setup.py'