diff --git a/_unittests/ut_gdot/test_gdot_extension.py b/_unittests/ut_gdot/test_gdot_extension.py index d1ee7a3..dea0ff4 100644 --- a/_unittests/ut_gdot/test_gdot_extension.py +++ b/_unittests/ut_gdot/test_gdot_extension.py @@ -1,6 +1,8 @@ import unittest import logging +import os import sys +from contextlib import contextmanager from sphinx_runpython.process_rst import rst2html from sphinx_runpython.ext_test_case import ( ExtTestCase, @@ -10,6 +12,20 @@ ) +@contextmanager +def unittest_going(): + """Context manager that sets UNITTEST_GOING=1 for the duration of the block.""" + old = os.environ.get("UNITTEST_GOING", None) + os.environ["UNITTEST_GOING"] = "1" + try: + yield + finally: + if old is None: + os.environ.pop("UNITTEST_GOING", None) + else: + os.environ["UNITTEST_GOING"] = old + + class TestGDotExtension(ExtTestCase): def setUp(self): logger = logging.getLogger("gdot") @@ -146,6 +162,59 @@ def test_gdot4_png(self): return self.assertIn("png", content) + @ignore_warnings(PendingDeprecationWarning) + def test_gdot_unittest_going_svg(self): + """When UNITTEST_GOING=1, a dummy SVG containing 'DISABLED FOR TESTS' is rendered.""" + content = """ + before + + .. gdot:: + :format: svg + + digraph foo { + "bar" -> "baz"; + } + + after + """.replace(" ", "") + + with unittest_going(): + html = rst2html( + content, writer_name="html", new_extensions=["sphinx_runpython.gdot"] + ) + + self.assertIn("DISABLED FOR TESTS", html) + self.assertIn(" "baz"; + } + + after + """.replace(" ", "") + + with unittest_going(): + html = rst2html( + content, writer_name="html", new_extensions=["sphinx_runpython.gdot"] + ) + + self.assertIn("DISABLED FOR TESTS", html) + self.assertIn("' + 'DISABLED FOR TESTS' + "" +) + +_DUMMY_PNG_HTML = ( + 'DISABLED FOR TESTS' +) + + +def _emit_dummy_output(self, format: str = "svg"): + """Emit a placeholder graphic when ``UNITTEST_GOING=1`` is set.""" + self.body.append('
') + if format == "png": + self.body.append(_DUMMY_PNG_HTML) + else: + self.body.append(_DUMMY_SVG) + self.body.append("
\n") + raise nodes.SkipNode + + def render_dot_html( self, node: gdot_node, @@ -227,6 +251,9 @@ def render_dot_html( filename: str | None = None, format: str = "svg", ) -> tuple[str, str]: + if os.environ.get("UNITTEST_GOING", "0") == "1": + _emit_dummy_output(self, format=format) + if format not in {"png", "svg"}: logger = logging.getLogger(__name__) logger.warning(__("format must be either 'png' or 'svg', but is %r"), format) @@ -362,6 +389,8 @@ def visit_gdot_node_html(self, node): and the :epkg:`SVG` format. """ if node["format"].lower() == "png": + if os.environ.get("UNITTEST_GOING", "0") == "1": + _emit_dummy_output(self, format="png") from sphinx.ext.graphviz import html_visit_graphviz return html_visit_graphviz(self, node)