76 lines
3.2 KiB
Python
76 lines
3.2 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("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())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|