#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Test file for: pptx2tif.py import os import sys from pathlib import Path import pytest # Add scripts/python to path for imports ROOT_DIR = Path(__file__).resolve().parent.parent.parent sys.path.insert(0, str(ROOT_DIR / "scripts" / "python")) # Check for dependencies try: from pptx2tif import check_libreoffice_installed HAS_SCRIPT = True except ImportError: HAS_SCRIPT = False try: from pptx2tif import ( batch_convert_pptx_to_tif, convert_pptx_to_tif, convert_pptx_to_tif_libreoffice, ) HAS_FULL_SCRIPT = True except ImportError: HAS_FULL_SCRIPT = False # Tests for check_libreoffice_installed (safe to call) @pytest.mark.skipif(not HAS_SCRIPT, reason="pptx2tif.py not importable") def test_check_libreoffice_installed_returns_bool(): """Test that check_libreoffice_installed returns a boolean.""" result = check_libreoffice_installed() assert isinstance(result, bool) # Tests for convert_pptx_to_tif_libreoffice @pytest.mark.skipif(not HAS_FULL_SCRIPT, reason="pptx2tif functions not importable") def test_convert_pptx_missing_file_raises(): """Test that FileNotFoundError is raised for missing input.""" with pytest.raises(FileNotFoundError, match="PowerPoint file not found"): convert_pptx_to_tif_libreoffice("/nonexistent/file.pptx") # Tests for batch_convert_pptx_to_tif @pytest.mark.skipif(not HAS_FULL_SCRIPT, reason="pptx2tif functions not importable") def test_batch_convert_missing_dir_raises(): """Test that ValueError is raised for missing directory.""" with pytest.raises(ValueError, match="Directory not found"): batch_convert_pptx_to_tif("/nonexistent/directory") @pytest.mark.skipif(not HAS_FULL_SCRIPT, reason="pptx2tif functions not importable") def test_batch_convert_empty_dir_returns_empty_list(tmp_path): """Test that empty directory returns empty list.""" result = batch_convert_pptx_to_tif(str(tmp_path)) assert result == [] # Tests for convert_pptx_to_tif (auto method selection) @pytest.mark.skipif(not HAS_FULL_SCRIPT, reason="pptx2tif functions not importable") def test_convert_auto_method_no_tools_raises(): """Test that RuntimeError is raised when no conversion tools available.""" # This test assumes neither LibreOffice nor python-pptx+PIL are available # It will only fail if we have the tools, which is acceptable try: convert_pptx_to_tif("/fake/file.pptx", method="auto") except (RuntimeError, FileNotFoundError) as e: # Either no tools (RuntimeError) or file not found is acceptable assert "not found" in str(e).lower() or "no suitable" in str(e).lower() @pytest.mark.skipif(not HAS_FULL_SCRIPT, reason="pptx2tif functions not importable") def test_convert_pptx_invalid_method_raises(): """Test that ValueError is raised for invalid method.""" with pytest.raises(ValueError, match="Unknown conversion method"): convert_pptx_to_tif("/fake/file.pptx", method="invalid_method") @pytest.mark.skipif(not HAS_FULL_SCRIPT, reason="pptx2tif functions not importable") def test_convert_pptx_path_object_support(tmp_path): """Test that Path objects are supported for input/output.""" # Create a fake pptx file fake_pptx = tmp_path / "test.pptx" fake_pptx.write_bytes(b"fake pptx content") output_dir = tmp_path / "output" # This should handle Path objects without error # It will fail due to invalid pptx, but that's after path handling try: convert_pptx_to_tif(fake_pptx, output_dir, method="auto") except (RuntimeError, FileNotFoundError, Exception) as e: # We're just testing that Path objects don't cause TypeError # Any other error is acceptable assert not isinstance(e, TypeError) @pytest.mark.skipif(not HAS_FULL_SCRIPT, reason="pptx2tif functions not importable") def test_batch_convert_recursive_flag(tmp_path): """Test that recursive flag is handled.""" # Create subdirectory structure subdir = tmp_path / "subdir" subdir.mkdir() # This should not raise an error for valid directory result = batch_convert_pptx_to_tif(str(tmp_path), recursive=True) assert isinstance(result, list) @pytest.mark.skipif(not HAS_FULL_SCRIPT, reason="pptx2tif functions not importable") def test_convert_pptx_string_path_support(tmp_path): """Test that string paths are supported.""" fake_pptx = tmp_path / "test.pptx" fake_pptx.write_bytes(b"fake") # Should handle string paths try: convert_pptx_to_tif(str(fake_pptx), method="auto") except (RuntimeError, FileNotFoundError, Exception) as e: # We're testing path handling, not actual conversion assert not isinstance(e, TypeError) # Integration-style tests (will skip if dependencies missing) @pytest.mark.skipif(not HAS_FULL_SCRIPT, reason="pptx2tif functions not importable") def test_module_imports_successfully(): """Test that the module imports without errors.""" # If we got here, imports succeeded assert HAS_FULL_SCRIPT is True @pytest.mark.skipif(not HAS_SCRIPT, reason="pptx2tif.py not importable") def test_check_libreoffice_handles_exceptions(): """Test that check_libreoffice_installed handles exceptions gracefully.""" # This should never raise an exception try: result = check_libreoffice_installed() assert result in [True, False] except Exception as e: pytest.fail(f"check_libreoffice_installed raised unexpected exception: {e}") if __name__ == "__main__": import pytest pytest.main([os.path.abspath(__file__), "-v"])