Files
Copies/tests/test_utils_compile.py
T

78 lines
3.4 KiB
Python

import contextlib
import io
import subprocess
import tempfile
import unittest
from pathlib import Path
from unittest.mock import patch
from copienator import utils
class CompileToPdfTests(unittest.TestCase):
def test_strict_compilation_propagates_failure_with_context(self):
result = subprocess.CompletedProcess(args=[], returncode=1,
stdout="! Undefined control sequence.\nl.13 broken command\n")
with tempfile.TemporaryDirectory() as directory, \
patch.object(utils.subprocess, "run", return_value=result) as run:
with self.assertRaisesRegex(RuntimeError, "LaTeX failed") as error:
utils.compile_to_pdf("broken", Path(directory) / "out.pdf", strict=True)
self.assertIn("l.13 broken command", str(error.exception))
self.assertEqual(run.call_args.kwargs["errors"], "replace")
def test_warns_when_latex_fails_even_if_partial_pdf_exists(self):
with tempfile.TemporaryDirectory() as temporary:
output = Path(temporary) / "result.pdf"
def failed_run(*_args, **kwargs):
(Path(kwargs["cwd"]) / "text.pdf").write_bytes(b"partial")
return subprocess.CompletedProcess(
args=[], returncode=1,
stdout="! LaTeX Error: Something's wrong--perhaps a missing \\item.\n",
)
console = io.StringIO()
with patch.object(utils.subprocess, "run", side_effect=failed_run), \
contextlib.redirect_stdout(console):
utils.compile_to_pdf("broken", output)
self.assertEqual(output.read_bytes(), b"partial")
self.assertIn("Warning: LaTeX compilation reported errors", console.getvalue())
self.assertIn(utils.LATEX_WARNING_MARKER + str(output.resolve()), console.getvalue())
self.assertIn("a PDF was generated", console.getvalue())
self.assertIn("missing \\item", console.getvalue())
def test_says_no_pdf_was_generated_when_latex_fails(self):
with tempfile.TemporaryDirectory() as temporary:
output = Path(temporary) / "result.pdf"
result = subprocess.CompletedProcess(
args=[], returncode=1, stdout="! Undefined control sequence.\n"
)
console = io.StringIO()
with patch.object(utils.subprocess, "run", return_value=result), \
contextlib.redirect_stdout(console):
utils.compile_to_pdf("broken", output)
self.assertFalse(output.exists())
self.assertIn("no PDF was generated", console.getvalue())
self.assertIn("Undefined control sequence", console.getvalue())
def test_warns_when_no_pdf_is_produced(self):
with tempfile.TemporaryDirectory() as temporary:
output = Path(temporary) / "result.pdf"
result = subprocess.CompletedProcess(args=[], returncode=0, stdout="")
console = io.StringIO()
with patch.object(utils.subprocess, "run", return_value=result), \
contextlib.redirect_stdout(console):
utils.compile_to_pdf("valid", output)
self.assertFalse(output.exists())
self.assertIn("produced no PDF", console.getvalue())
self.assertIn(utils.LATEX_WARNING_MARKER + str(output.resolve()), console.getvalue())
if __name__ == "__main__":
unittest.main()