diff options
Diffstat (limited to 'tests/test_setup_command.py')
-rw-r--r-- | tests/test_setup_command.py | 137 |
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' |