summaryrefslogtreecommitdiffstats
path: root/tests/test_sphinx/test_sphinx_builds.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_sphinx/test_sphinx_builds.py')
-rw-r--r--tests/test_sphinx/test_sphinx_builds.py565
1 files changed, 565 insertions, 0 deletions
diff --git a/tests/test_sphinx/test_sphinx_builds.py b/tests/test_sphinx/test_sphinx_builds.py
new file mode 100644
index 0000000..beba484
--- /dev/null
+++ b/tests/test_sphinx/test_sphinx_builds.py
@@ -0,0 +1,565 @@
+"""Uses sphinx's pytest fixture to run builds.
+
+see conftest.py for fixture usage
+
+NOTE: sphinx 3 & 4 regress against different output files,
+the major difference being sphinx 4 uses docutils 0.17,
+which uses semantic HTML tags
+(e.g. converting `<div class="section">` to `<section>`)
+"""
+import os
+import re
+
+import pytest
+import sphinx
+from docutils import VersionInfo, __version_info__
+
+SOURCE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "sourcedirs"))
+
+
+@pytest.mark.sphinx(
+ buildername="html",
+ srcdir=os.path.join(SOURCE_DIR, "basic"),
+ freshenv=True,
+ confoverrides={"myst_enable_extensions": ["dollarmath"]},
+)
+def test_basic(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+):
+ """basic test."""
+ app.build()
+
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ try:
+ get_sphinx_app_doctree(
+ app,
+ docname="content",
+ regress=True,
+ )
+ finally:
+ get_sphinx_app_doctree(
+ app,
+ docname="content",
+ resolve=True,
+ regress=True,
+ )
+ get_sphinx_app_output(
+ app,
+ filename="content.html",
+ regress_html=True,
+ regress_ext=f".sphinx{sphinx.version_info[0]}.html",
+ )
+
+ assert app.env.metadata["content"] == {
+ "author": "Chris Sewell",
+ "authors": ["Chris Sewell", "Chris Hodgraf"],
+ "organization": "EPFL",
+ "address": "1 Cedar Park Close\nThundersley\nEssex\n",
+ "contact": "https://example.com",
+ "version": "1.0",
+ "revision": "1.1",
+ "status": "good",
+ "date": "2/12/1985",
+ "copyright": "MIT",
+ "other": "Something else",
+ "other_dict": '{"key": "value"}',
+ "wordcount": {"minutes": 0, "words": 57},
+ }
+
+
+@pytest.mark.sphinx(
+ buildername="html",
+ srcdir=os.path.join(SOURCE_DIR, "references"),
+ freshenv=True,
+ confoverrides={"myst_enable_extensions": ["dollarmath"]},
+)
+def test_references(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+):
+ """Test reference resolution."""
+ app.build()
+
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ try:
+ get_sphinx_app_doctree(app, docname="index", regress=True)
+ finally:
+ try:
+ get_sphinx_app_doctree(app, docname="index", resolve=True, regress=True)
+ finally:
+ get_sphinx_app_output(
+ app,
+ filename="index.html",
+ regress_html=True,
+ replace={"Permalink to this headline": "Permalink to this heading"},
+ )
+
+
+@pytest.mark.sphinx(
+ buildername="singlehtml",
+ srcdir=os.path.join(SOURCE_DIR, "references_singlehtml"),
+ freshenv=True,
+ confoverrides={"nitpicky": True},
+)
+def test_references_singlehtml(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+):
+ """Test reference resolution for singlehtml builds."""
+ app.build()
+
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ # try:
+ # get_sphinx_app_doctree(app, docname="index", regress=True)
+ # finally:
+ # get_sphinx_app_doctree(app, docname="index", resolve=True, regress=True)
+
+ try:
+ get_sphinx_app_doctree(
+ app,
+ docname="other/other",
+ regress=True,
+ replace={"other\\other.md": "other/other.md"},
+ )
+ finally:
+ get_sphinx_app_doctree(
+ app,
+ docname="other/other",
+ resolve=True,
+ regress=True,
+ replace={"other\\other.md": "other/other.md"},
+ )
+
+ get_sphinx_app_output(
+ app,
+ filename="index.html",
+ buildername="singlehtml",
+ regress_html=True,
+ replace={"Permalink to this headline": "Permalink to this heading"},
+ )
+
+
+@pytest.mark.sphinx(
+ buildername="html",
+ srcdir=os.path.join(SOURCE_DIR, "heading_slug_func"),
+ freshenv=True,
+)
+def test_heading_slug_func(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+):
+ """Test heading_slug_func configuration."""
+ app.build()
+
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ try:
+ get_sphinx_app_doctree(app, docname="index", regress=True)
+ finally:
+ get_sphinx_app_doctree(app, docname="index", resolve=True, regress=True)
+ get_sphinx_app_output(
+ app,
+ filename="index.html",
+ regress_html=True,
+ replace={"Permalink to this headline": "Permalink to this heading"},
+ )
+
+
+@pytest.mark.sphinx(
+ buildername="html",
+ srcdir=os.path.join(SOURCE_DIR, "extended_syntaxes"),
+ freshenv=True,
+)
+def test_extended_syntaxes(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+ monkeypatch,
+):
+ """test setting addition configuration values."""
+ from myst_parser.mdit_to_docutils.sphinx_ import SphinxRenderer
+
+ monkeypatch.setattr(SphinxRenderer, "_random_label", lambda self: "mock-uuid")
+ app.build()
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ try:
+ get_sphinx_app_doctree(
+ app,
+ docname="index",
+ regress=True,
+ )
+ finally:
+ get_sphinx_app_output(
+ app,
+ filename="index.html",
+ regress_html=True,
+ replace={"Permalink to this headline": "Permalink to this heading"},
+ )
+
+
+@pytest.mark.sphinx(
+ buildername="html", srcdir=os.path.join(SOURCE_DIR, "includes"), freshenv=True
+)
+def test_includes(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+):
+ """Test of include directive."""
+ app.build()
+
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ try:
+ get_sphinx_app_doctree(
+ app,
+ docname="index",
+ regress=True,
+ # fix for Windows CI
+ replace={
+ r"subfolder\example2.jpg": "subfolder/example2.jpg",
+ r"subfolder\\example2.jpg": "subfolder/example2.jpg",
+ r"subfolder\\\\example2.jpg": "subfolder/example2.jpg",
+ },
+ )
+ finally:
+ get_sphinx_app_output(
+ app,
+ filename="index.html",
+ regress_html=True,
+ replace={
+ "Permalink to this headline": "Permalink to this heading",
+ r"'subfolder\\example2'": "'subfolder/example2'",
+ r'uri="subfolder\\example2"': 'uri="subfolder/example2"',
+ "_images/example21.jpg": "_images/example2.jpg",
+ },
+ )
+
+
+@pytest.mark.skipif(
+ __version_info__ < VersionInfo(0, 17, 0, "final", 0, True),
+ reason="parser option added in docutils 0.17",
+)
+@pytest.mark.sphinx(
+ buildername="html",
+ srcdir=os.path.join(SOURCE_DIR, "include_from_rst"),
+ freshenv=True,
+)
+def test_include_from_rst(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+):
+ """Test of include directive inside RST file."""
+ app.build()
+
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ get_sphinx_app_doctree(
+ app,
+ docname="index",
+ regress=True,
+ regress_ext=".xml",
+ )
+
+
+@pytest.mark.skipif(
+ __version_info__ < VersionInfo(0, 19, 0, "final", 0, True),
+ reason="Footnote HTML changed in docutils 0.19",
+)
+@pytest.mark.sphinx(
+ buildername="html", srcdir=os.path.join(SOURCE_DIR, "footnotes"), freshenv=True
+)
+def test_footnotes(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+):
+ """Test of include directive."""
+ app.build()
+
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ try:
+ get_sphinx_app_doctree(app, docname="footnote_md", regress=True)
+ finally:
+ get_sphinx_app_output(
+ app,
+ filename="footnote_md.html",
+ regress_html=True,
+ regress_ext=f".sphinx{sphinx.version_info[0]}.html",
+ )
+
+
+@pytest.mark.sphinx(
+ buildername="html",
+ srcdir=os.path.join(SOURCE_DIR, "commonmark_only"),
+ freshenv=True,
+)
+def test_commonmark_only(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+):
+ """test setting addition configuration values."""
+ app.build()
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert "lexer name '{note}'" in warnings
+
+ try:
+ get_sphinx_app_doctree(app, docname="index", regress=True)
+ finally:
+ get_sphinx_app_output(
+ app,
+ filename="index.html",
+ regress_html=True,
+ replace={"Permalink to this headline": "Permalink to this heading"},
+ )
+
+
+@pytest.mark.sphinx(
+ buildername="html",
+ srcdir=os.path.join(SOURCE_DIR, "substitutions"),
+ freshenv=True,
+)
+def test_substitutions(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+ file_regression,
+):
+ """test setting addition configuration values."""
+ app.build()
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ try:
+ get_sphinx_app_doctree(app, docname="index", regress=True)
+ file_regression.check(
+ get_sphinx_app_doctree(app, docname="other").pformat(),
+ extension=".other.xml",
+ )
+ finally:
+ get_sphinx_app_output(app, filename="index.html", regress_html=True)
+
+
+@pytest.mark.sphinx(
+ buildername="gettext", srcdir=os.path.join(SOURCE_DIR, "gettext"), freshenv=True
+)
+def test_gettext(
+ app,
+ status,
+ warning,
+ get_sphinx_app_output,
+ file_regression,
+):
+ """Test gettext message extraction."""
+ app.build()
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ output = get_sphinx_app_output(app, filename="index.pot", buildername="gettext")
+ output = re.sub(r"POT-Creation-Date: [0-9: +-]+", "POT-Creation-Date: ", output)
+ output = re.sub(r"Copyright \(C\) [0-9]{4}", "Copyright (C) XXXX", output)
+
+ file_regression.check(output, extension=".pot")
+
+
+@pytest.mark.sphinx(
+ buildername="html",
+ srcdir=os.path.join(SOURCE_DIR, "gettext"),
+ freshenv=True,
+ confoverrides={"language": "fr", "gettext_compact": False, "locale_dirs": ["."]},
+)
+def test_gettext_html(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+):
+ """Test gettext message extraction."""
+ app.build()
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ try:
+ get_sphinx_app_doctree(
+ app,
+ docname="index",
+ regress=True,
+ )
+ finally:
+ get_sphinx_app_doctree(
+ app,
+ docname="index",
+ resolve=True,
+ regress=True,
+ )
+ get_sphinx_app_output(
+ app,
+ filename="index.html",
+ regress_html=True,
+ regress_ext=f".sphinx{sphinx.version_info[0]}.html",
+ )
+
+
+@pytest.mark.sphinx(
+ buildername="gettext",
+ srcdir=os.path.join(SOURCE_DIR, "gettext"),
+ freshenv=True,
+ confoverrides={
+ "gettext_additional_targets": [
+ "index",
+ "literal-block",
+ "doctest-block",
+ "raw",
+ "image",
+ ],
+ },
+)
+def test_gettext_additional_targets(
+ app,
+ status,
+ warning,
+ get_sphinx_app_output,
+ file_regression,
+):
+ """Test gettext message extraction."""
+ app.build()
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ output = get_sphinx_app_output(app, filename="index.pot", buildername="gettext")
+ output = re.sub(r"POT-Creation-Date: [0-9: +-]+", "POT-Creation-Date: ", output)
+ output = re.sub(r"Copyright \(C\) [0-9]{4}", "Copyright (C) XXXX", output)
+
+ file_regression.check(output, extension=".pot")
+
+
+@pytest.mark.sphinx(
+ buildername="html",
+ srcdir=os.path.join(SOURCE_DIR, "mathjax"),
+ freshenv=True,
+ confoverrides={"myst_enable_extensions": ["dollarmath"]},
+)
+def test_mathjax_warning(
+ app,
+ status,
+ warning,
+):
+ """Test mathjax config override warning."""
+ app.build()
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert (
+ "overridden by myst-parser: 'other' -> 'tex2jax_process|mathjax_process|math|output_area'"
+ in warnings
+ )
+
+
+@pytest.mark.sphinx(
+ buildername="html",
+ srcdir=os.path.join(SOURCE_DIR, "fieldlist"),
+ freshenv=True,
+)
+def test_fieldlist_extension(
+ app,
+ status,
+ warning,
+ get_sphinx_app_doctree,
+ get_sphinx_app_output,
+):
+ """test setting addition configuration values."""
+ app.build()
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""
+
+ try:
+ get_sphinx_app_doctree(
+ app,
+ docname="index",
+ regress=True,
+ # changed in:
+ # https://www.sphinx-doc.org/en/master/changes.html#release-4-4-0-released-jan-17-2022
+ replace={
+ (
+ '<literal_strong py:class="True" '
+ 'py:module="True" refspecific="True">'
+ ): "<literal_strong>"
+ },
+ )
+ finally:
+ get_sphinx_app_output(
+ app,
+ filename="index.html",
+ regress_html=True,
+ regress_ext=f".sphinx{sphinx.version_info[0]}.html",
+ )
+
+
+@pytest.mark.sphinx(
+ buildername="texinfo",
+ srcdir=os.path.join(SOURCE_DIR, "texi_table"),
+ freshenv=True,
+)
+def test_texinfo_table(
+ app,
+ status,
+ warning,
+):
+ """Test that tables can be built with the Texinfo builder."""
+ app.build()
+ assert "build succeeded" in status.getvalue() # Build succeeded
+ warnings = warning.getvalue().strip()
+ assert warnings == ""