#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Tests for compilation script runner. Tests run_compile function with various options and document types. """ import pytest pytest.importorskip("git") from pathlib import Path from unittest.mock import patch from scitex_writer._compile._runner import _get_compile_script, run_compile class TestGetCompileScript: """Test suite for _get_compile_script helper function.""" def test_manuscript_script_path(self): """Test manuscript script path generation.""" project_dir = Path("/tmp/test-project") script = _get_compile_script(project_dir, "manuscript") assert script == project_dir / "scripts" / "shell" / "compile_manuscript.sh" def test_supplementary_script_path(self): """Test supplementary script path generation.""" project_dir = Path("/tmp/test-project") script = _get_compile_script(project_dir, "supplementary") assert script == project_dir / "scripts" / "shell" / "compile_supplementary.sh" def test_revision_script_path(self): """Test revision script path generation.""" project_dir = Path("/tmp/test-project") script = _get_compile_script(project_dir, "revision") assert script == project_dir / "scripts" / "shell" / "compile_revision.sh" class TestRunCompile: """Test suite for run_compile function.""" def test_signature(self): """Test function signature has expected parameters.""" import inspect sig = inspect.signature(run_compile) params = list(sig.parameters.keys()) assert "doc_type" in params assert "project_dir" in params assert "timeout" in params assert "track_changes" in params assert "no_figs" in params assert "ppt2tif" in params assert "crop_tif" in params assert "quiet" in params assert "verbose" in params assert "force" in params assert "log_callback" in params assert "progress_callback" in params def test_default_parameters(self): """Test default parameter values.""" import inspect sig = inspect.signature(run_compile) assert sig.parameters["timeout"].default == 300 assert sig.parameters["track_changes"].default is False assert sig.parameters["no_figs"].default is False assert sig.parameters["ppt2tif"].default is False assert sig.parameters["crop_tif"].default is False assert sig.parameters["quiet"].default is False assert sig.parameters["verbose"].default is False assert sig.parameters["force"].default is False assert sig.parameters["log_callback"].default is None assert sig.parameters["progress_callback"].default is None @patch("scitex_writer._compile._runner.validate_before_compile") @patch("scitex_writer._compile._runner._get_compile_script") @patch("scitex_writer._compile._runner._run_sh_command") @patch("scitex_writer._compile._runner._find_output_files") @patch("scitex_writer._compile._runner.parse_output") def test_manuscript_with_no_figs_option( self, mock_parse, mock_find_files, mock_run_sh, mock_get_script, mock_validate, ): """Test manuscript compilation with no_figs option.""" project_dir = Path("/tmp/test-project") script_path = project_dir / "scripts" / "shell" / "compile_manuscript.sh" mock_get_script.return_value = script_path mock_find_files.return_value = (None, None, None) mock_parse.return_value = ([], []) mock_run_sh.return_value = { "exit_code": 0, "stdout": "", "stderr": "", } with patch("pathlib.Path.exists", return_value=True): with patch("os.chdir"): with patch("pathlib.Path.cwd", return_value=project_dir): run_compile( "manuscript", project_dir, no_figs=True, ) # Verify _run_sh_command was called with correct command mock_run_sh.assert_called_once() call_args = mock_run_sh.call_args[0][0] assert str(script_path) in call_args assert "--no_figs" in call_args @patch("scitex_writer._compile._runner.validate_before_compile") @patch("scitex_writer._compile._runner._get_compile_script") @patch("scitex_writer._compile._runner._run_sh_command") @patch("scitex_writer._compile._runner._find_output_files") @patch("scitex_writer._compile._runner.parse_output") def test_manuscript_with_multiple_options( self, mock_parse, mock_find_files, mock_run_sh, mock_get_script, mock_validate, ): """Test manuscript compilation with multiple options.""" project_dir = Path("/tmp/test-project") script_path = project_dir / "scripts" / "shell" / "compile_manuscript.sh" mock_get_script.return_value = script_path mock_find_files.return_value = (None, None, None) mock_parse.return_value = ([], []) mock_run_sh.return_value = { "exit_code": 0, "stdout": "", "stderr": "", } with patch("pathlib.Path.exists", return_value=True): with patch("os.chdir"): with patch("pathlib.Path.cwd", return_value=project_dir): run_compile( "manuscript", project_dir, no_figs=True, ppt2tif=True, crop_tif=True, verbose=True, force=True, ) # Verify _run_sh_command was called with all options call_args = mock_run_sh.call_args[0][0] assert "--no_figs" in call_args assert "--ppt2tif" in call_args assert "--crop_tif" in call_args assert "--verbose" in call_args assert "--force" in call_args @patch("scitex_writer._compile._runner.validate_before_compile") @patch("scitex_writer._compile._runner._get_compile_script") @patch("scitex_writer._compile._runner._run_sh_command") @patch("scitex_writer._compile._runner._find_output_files") @patch("scitex_writer._compile._runner.parse_output") def test_supplementary_with_figs_option( self, mock_parse, mock_find_files, mock_run_sh, mock_get_script, mock_validate, ): """Test supplementary compilation with figs option.""" project_dir = Path("/tmp/test-project") script_path = project_dir / "scripts" / "shell" / "compile_supplementary.sh" mock_get_script.return_value = script_path mock_find_files.return_value = (None, None, None) mock_parse.return_value = ([], []) mock_run_sh.return_value = { "exit_code": 0, "stdout": "", "stderr": "", } with patch("pathlib.Path.exists", return_value=True): with patch("os.chdir"): with patch("pathlib.Path.cwd", return_value=project_dir): run_compile( "supplementary", project_dir, no_figs=False, # Include figures ) # Verify _run_sh_command was called with --figs option call_args = mock_run_sh.call_args[0][0] assert "--figs" in call_args @patch("scitex_writer._compile._runner.validate_before_compile") @patch("scitex_writer._compile._runner._get_compile_script") @patch("scitex_writer._compile._runner._run_sh_command") @patch("scitex_writer._compile._runner._find_output_files") @patch("scitex_writer._compile._runner.parse_output") def test_revision_with_track_changes( self, mock_parse, mock_find_files, mock_run_sh, mock_get_script, mock_validate, ): """Test revision compilation with track_changes option.""" project_dir = Path("/tmp/test-project") script_path = project_dir / "scripts" / "shell" / "compile_revision.sh" mock_get_script.return_value = script_path mock_find_files.return_value = (None, None, None) mock_parse.return_value = ([], []) mock_run_sh.return_value = { "exit_code": 0, "stdout": "", "stderr": "", } with patch("pathlib.Path.exists", return_value=True): with patch("os.chdir"): with patch("pathlib.Path.cwd", return_value=project_dir): run_compile( "revision", project_dir, track_changes=True, ) # Verify _run_sh_command was called with --track-changes option call_args = mock_run_sh.call_args[0][0] assert "--track-changes" in call_args # EOF if __name__ == "__main__": import os import pytest pytest.main([os.path.abspath(__file__)])