#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Timestamp: 2026-02-08 # File: tests/python/test_compile_content.py """Tests for scitex_writer compile.content functionality.""" import shutil import subprocess import sys from pathlib import Path import pytest class TestContentModule: """Test content module can be imported.""" def test_content_import_from_compile_api(self): """Test that compile_content is importable from _compile.""" from scitex_writer._compile.content import compile_content assert callable(compile_content) def test_content_import_from_mcp_wrapper(self): """Test that _mcp.content thin wrapper works.""" from scitex_writer._mcp.content import compile_content assert callable(compile_content) def test_content_via_compile_module(self): """Test that content is accessible via compile module.""" from scitex_writer import compile assert callable(compile.content) class TestDocumentBuilder: """Test tex_snippet2full.py script functions.""" @pytest.fixture def scripts_dir(self): """Get scripts directory.""" return Path(__file__).resolve().parents[2] / "scripts" def test_document_builder_exists(self, scripts_dir): """Test that the document builder script exists.""" builder = scripts_dir / "python" / "tex_snippet2full.py" assert builder.exists() def test_shell_script_exists(self, scripts_dir): """Test that the compile shell script exists.""" compiler = scripts_dir / "shell" / "compile_content.sh" assert compiler.exists() def test_document_builder_light_mode(self, scripts_dir, tmp_path): """Test building a light mode document.""" builder = scripts_dir / "python" / "tex_snippet2full.py" body_file = tmp_path / "body.tex" body_file.write_text(r"\section{Test}" + "\n\nHello World\n") output_file = tmp_path / "output.tex" result = subprocess.run( [ sys.executable, str(builder), "--body-file", str(body_file), "--output", str(output_file), "--color-mode", "light", ], capture_output=True, text=True, ) assert result.returncode == 0 content = output_file.read_text() assert "\\documentclass" in content assert "\\begin{document}" in content assert "Hello World" in content # Light mode should not have color commands assert "MonacoBg" not in content def test_document_builder_dark_mode(self, scripts_dir, tmp_path): """Test building a dark mode document with Monaco colors.""" builder = scripts_dir / "python" / "tex_snippet2full.py" body_file = tmp_path / "body.tex" body_file.write_text("Dark mode test content\n") output_file = tmp_path / "output.tex" result = subprocess.run( [ sys.executable, str(builder), "--body-file", str(body_file), "--output", str(output_file), "--color-mode", "dark", ], capture_output=True, text=True, ) assert result.returncode == 0 content = output_file.read_text() assert "MonacoBg" in content assert "1E1E1E" in content # Monaco background assert "MonacoFg" in content assert "D4D4D4" in content # Monaco foreground assert "\\pagecolor{MonacoBg}" in content assert "\\color{MonacoFg}" in content def test_document_builder_complete_document(self, scripts_dir, tmp_path): """Test injecting color into a complete document.""" builder = scripts_dir / "python" / "tex_snippet2full.py" body_file = tmp_path / "body.tex" body_file.write_text( "\\documentclass{article}\n\\begin{document}\nComplete doc\n\\end{document}\n" ) output_file = tmp_path / "output.tex" result = subprocess.run( [ sys.executable, str(builder), "--body-file", str(body_file), "--output", str(output_file), "--color-mode", "dark", "--complete-document", ], capture_output=True, text=True, ) assert result.returncode == 0 content = output_file.read_text() # Should inject after \begin{document} begin_pos = content.find("\\begin{document}") monaco_pos = content.find("MonacoBg") assert monaco_pos > begin_pos class TestContentCompilation: """Test content compilation (requires latexmk).""" @pytest.fixture def has_latexmk(self): """Check if latexmk is available.""" return shutil.which("latexmk") is not None def test_compile_simple_content(self, has_latexmk): """Test compiling simple LaTeX content.""" if not has_latexmk: pytest.skip("latexmk not available") from scitex_writer import compile content = r""" \documentclass{article} \begin{document} Hello, World! \end{document} """ result = compile.content(content, name="test_simple") assert result["success"] is True assert result["output_pdf"] is not None assert Path(result["output_pdf"]).exists() # Cleanup temp_dir = Path(result["temp_dir"]) if temp_dir.exists(): shutil.rmtree(temp_dir) def test_compile_body_only(self, has_latexmk): """Test compiling body-only content (auto-wrapped).""" if not has_latexmk: pytest.skip("latexmk not available") from scitex_writer import compile content = r""" \section{Introduction} This is the introduction. """ result = compile.content(content, name="test_body") assert result["success"] is True assert result["output_pdf"] is not None # Cleanup temp_dir = Path(result["temp_dir"]) if temp_dir.exists(): shutil.rmtree(temp_dir) def test_compile_with_dark_mode(self, has_latexmk): """Test compiling with dark mode.""" if not has_latexmk: pytest.skip("latexmk not available") from scitex_writer import compile content = r""" \documentclass{article} \usepackage{xcolor} \usepackage{pagecolor} \begin{document} Dark mode test. \end{document} """ result = compile.content(content, color_mode="dark", name="test_dark") assert result["success"] is True assert result["color_mode"] == "dark" # Cleanup temp_dir = Path(result["temp_dir"]) if temp_dir.exists(): shutil.rmtree(temp_dir) def test_compile_invalid_latex(self, has_latexmk): """Test compiling invalid LaTeX content.""" if not has_latexmk: pytest.skip("latexmk not available") from scitex_writer import compile content = r""" \documentclass{article} \begin{document} \invalid_command_that_does_not_exist \end{document} """ result = compile.content(content, name="test_invalid") assert result["success"] is False assert "error" in result # Cleanup if "temp_dir" in result: temp_dir = Path(result["temp_dir"]) if temp_dir.exists(): shutil.rmtree(temp_dir) def test_compile_timeout(self, has_latexmk): """Test compilation timeout.""" if not has_latexmk: pytest.skip("latexmk not available") from scitex_writer import compile # Very short timeout to trigger timeout error content = r""" \documentclass{article} \begin{document} Test \end{document} """ # Note: timeout=1 might be too short even for simple docs on slow systems # This test is more about verifying the timeout mechanism exists result = compile.content(content, timeout=1, name="test_timeout") # May succeed or timeout depending on system speed assert "success" in result class TestMcpToolRegistration: """Test MCP tool registration for content.""" def test_compile_content_tool_registered(self): """Test that compile_content tool is registered with MCP.""" import asyncio from scitex_writer._mcp import mcp try: tools = asyncio.run(mcp.get_tools()) tool_names = list(tools.keys()) except AttributeError: tool_names = [t.name for t in asyncio.run(mcp._list_tools())] assert "writer_compile_content" in tool_names # EOF