📝 新增完整项目文档、测试套件与构建配置
This commit is contained in:
244
tests/test_longpic.py
Normal file
244
tests/test_longpic.py
Normal file
@@ -0,0 +1,244 @@
|
||||
"""Tests for PPT_longPic function."""
|
||||
|
||||
import pytest
|
||||
from pathlib import Path
|
||||
from unittest.mock import Mock, MagicMock, patch
|
||||
from PIL import Image
|
||||
from pptopic.lib import PPT_longPic
|
||||
|
||||
|
||||
class TestPPTLongPic:
|
||||
"""Test PPT_longPic function."""
|
||||
|
||||
@patch('pptopic.lib.convertPPT')
|
||||
def test_ppt_longpic_with_save_name(self, mock_convert_ppt, tmp_path):
|
||||
"""Test PPT_longPic with saveName parameter."""
|
||||
ppt_file = tmp_path / "test.pptx"
|
||||
ppt_file.touch()
|
||||
|
||||
mock_ppt = MagicMock()
|
||||
mock_convert_ppt.return_value.__enter__.return_value = mock_ppt
|
||||
|
||||
with patch('pptopic.lib.Path.glob') as mock_glob:
|
||||
mock_img_path = MagicMock()
|
||||
mock_img_path.suffix = '.jpg'
|
||||
mock_glob.return_value = [mock_img_path]
|
||||
|
||||
with patch('pptopic.lib.Image.open') as mock_open:
|
||||
mock_img = MagicMock()
|
||||
mock_img.mode = 'RGB'
|
||||
mock_img.width = 100
|
||||
mock_img.height = 100
|
||||
mock_img.resize.return_value = mock_img
|
||||
mock_open.return_value.__enter__.return_value = mock_img
|
||||
|
||||
with patch('pptopic.lib.Image.new') as mock_new:
|
||||
mock_canvas = MagicMock()
|
||||
mock_new.return_value = mock_canvas
|
||||
|
||||
PPT_longPic(ppt_file, saveName="output.jpg", saveto=tmp_path)
|
||||
|
||||
mock_canvas.save.assert_called_once()
|
||||
|
||||
@patch('pptopic.lib.convertPPT')
|
||||
def test_ppt_longpic_without_save_name(self, mock_convert_ppt, tmp_path):
|
||||
"""Test PPT_longPic without saveName uses default JPG."""
|
||||
ppt_file = tmp_path / "test.pptx"
|
||||
ppt_file.touch()
|
||||
|
||||
mock_ppt = MagicMock()
|
||||
mock_convert_ppt.return_value.__enter__.return_value = mock_ppt
|
||||
|
||||
with patch('pptopic.lib.Path.glob') as mock_glob:
|
||||
mock_img_path = MagicMock()
|
||||
mock_img_path.suffix = '.jpg'
|
||||
mock_glob.return_value = [mock_img_path]
|
||||
|
||||
with patch('pptopic.lib.Image.open') as mock_open:
|
||||
mock_img = MagicMock()
|
||||
mock_img.mode = 'RGB'
|
||||
mock_img.width = 100
|
||||
mock_img.height = 100
|
||||
mock_img.resize.return_value = mock_img
|
||||
mock_open.return_value.__enter__.return_value = mock_img
|
||||
|
||||
with patch('pptopic.lib.Image.new') as mock_new:
|
||||
mock_canvas = MagicMock()
|
||||
mock_new.return_value = mock_canvas
|
||||
|
||||
PPT_longPic(ppt_file, saveto=tmp_path)
|
||||
|
||||
mock_canvas.save.assert_called_once()
|
||||
|
||||
def test_ppt_longpic_invalid_image_type(self, tmp_path):
|
||||
"""Test PPT_longPic with invalid image type raises ValueError."""
|
||||
ppt_file = tmp_path / "test.pptx"
|
||||
ppt_file.touch()
|
||||
|
||||
with pytest.raises(ValueError, match="Unable to save this type"):
|
||||
PPT_longPic(ppt_file, saveName="output.bmp")
|
||||
|
||||
@patch('pptopic.lib.convertPPT')
|
||||
def test_ppt_longpic_no_images_generated(self, mock_convert_ppt, tmp_path):
|
||||
"""Test PPT_longPic when no images are generated raises ValueError."""
|
||||
ppt_file = tmp_path / "test.pptx"
|
||||
ppt_file.touch()
|
||||
|
||||
mock_ppt = MagicMock()
|
||||
mock_convert_ppt.return_value.__enter__.return_value = mock_ppt
|
||||
|
||||
with patch('pptopic.lib.Path.glob', return_value=[]):
|
||||
with pytest.raises(ValueError, match="No images generated"):
|
||||
PPT_longPic(ppt_file)
|
||||
|
||||
@patch('pptopic.lib.convertPPT')
|
||||
def test_ppt_longpic_with_percentage_width(self, mock_convert_ppt, tmp_path):
|
||||
"""Test PPT_longPic with percentage width string."""
|
||||
ppt_file = tmp_path / "test.pptx"
|
||||
ppt_file.touch()
|
||||
|
||||
mock_ppt = MagicMock()
|
||||
mock_convert_ppt.return_value.__enter__.return_value = mock_ppt
|
||||
|
||||
with patch('pptopic.lib.Path.glob') as mock_glob:
|
||||
mock_img_path = MagicMock()
|
||||
mock_img_path.suffix = '.jpg'
|
||||
mock_glob.return_value = [mock_img_path]
|
||||
|
||||
with patch('pptopic.lib.Image.open') as mock_open:
|
||||
mock_img = MagicMock()
|
||||
mock_img.mode = 'RGB'
|
||||
mock_img.width = 100
|
||||
mock_img.height = 100
|
||||
mock_img.resize.return_value = mock_img
|
||||
mock_open.return_value.__enter__.return_value = mock_img
|
||||
|
||||
with patch('pptopic.lib.Image.new') as mock_new:
|
||||
mock_canvas = MagicMock()
|
||||
mock_new.return_value = mock_canvas
|
||||
|
||||
PPT_longPic(ppt_file, width="50%", saveto=tmp_path)
|
||||
|
||||
mock_new.assert_called_once()
|
||||
|
||||
@patch('pptopic.lib.convertPPT')
|
||||
def test_ppt_longpic_with_pixel_width(self, mock_convert_ppt, tmp_path):
|
||||
"""Test PPT_longPic with pixel width."""
|
||||
ppt_file = tmp_path / "test.pptx"
|
||||
ppt_file.touch()
|
||||
|
||||
mock_ppt = MagicMock()
|
||||
mock_convert_ppt.return_value.__enter__.return_value = mock_ppt
|
||||
|
||||
with patch('pptopic.lib.Path.glob') as mock_glob:
|
||||
mock_img_path = MagicMock()
|
||||
mock_img_path.suffix = '.jpg'
|
||||
mock_glob.return_value = [mock_img_path]
|
||||
|
||||
with patch('pptopic.lib.Image.open') as mock_open:
|
||||
mock_img = MagicMock()
|
||||
mock_img.mode = 'RGB'
|
||||
mock_img.width = 100
|
||||
mock_img.height = 100
|
||||
mock_img.resize.return_value = mock_img
|
||||
mock_open.return_value.__enter__.return_value = mock_img
|
||||
|
||||
with patch('pptopic.lib.Image.new') as mock_new:
|
||||
mock_canvas = MagicMock()
|
||||
mock_new.return_value = mock_canvas
|
||||
|
||||
PPT_longPic(ppt_file, width=50, saveto=tmp_path)
|
||||
|
||||
mock_new.assert_called_once()
|
||||
|
||||
@patch('pptopic.lib.convertPPT')
|
||||
def test_ppt_longpic_with_none_width(self, mock_convert_ppt, tmp_path):
|
||||
"""Test PPT_longPic with None width (no scaling)."""
|
||||
ppt_file = tmp_path / "test.pptx"
|
||||
ppt_file.touch()
|
||||
|
||||
mock_ppt = MagicMock()
|
||||
mock_convert_ppt.return_value.__enter__.return_value = mock_ppt
|
||||
|
||||
with patch('pptopic.lib.Path.glob') as mock_glob:
|
||||
mock_img_path = MagicMock()
|
||||
mock_img_path.suffix = '.jpg'
|
||||
mock_glob.return_value = [mock_img_path]
|
||||
|
||||
with patch('pptopic.lib.Image.open') as mock_open:
|
||||
mock_img = MagicMock()
|
||||
mock_img.mode = 'RGB'
|
||||
mock_img.width = 100
|
||||
mock_img.height = 100
|
||||
mock_img.resize.return_value = mock_img
|
||||
mock_open.return_value.__enter__.return_value = mock_img
|
||||
|
||||
with patch('pptopic.lib.Image.new') as mock_new:
|
||||
mock_canvas = MagicMock()
|
||||
mock_new.return_value = mock_canvas
|
||||
|
||||
PPT_longPic(ppt_file, width=None, saveto=tmp_path)
|
||||
|
||||
mock_new.assert_called_once()
|
||||
|
||||
@patch('pptopic.lib.convertPPT')
|
||||
def test_ppt_longpic_save_to_current_dir(self, mock_convert_ppt, tmp_path):
|
||||
"""Test PPT_longPic saving to current directory."""
|
||||
ppt_file = tmp_path / "test.pptx"
|
||||
ppt_file.touch()
|
||||
|
||||
mock_ppt = MagicMock()
|
||||
mock_convert_ppt.return_value.__enter__.return_value = mock_ppt
|
||||
|
||||
with patch('pptopic.lib.Path.glob') as mock_glob:
|
||||
mock_img_path = MagicMock()
|
||||
mock_img_path.suffix = '.jpg'
|
||||
mock_glob.return_value = [mock_img_path]
|
||||
|
||||
with patch('pptopic.lib.Image.open') as mock_open:
|
||||
mock_img = MagicMock()
|
||||
mock_img.mode = 'RGB'
|
||||
mock_img.width = 100
|
||||
mock_img.height = 100
|
||||
mock_img.resize.return_value = mock_img
|
||||
mock_open.return_value.__enter__.return_value = mock_img
|
||||
|
||||
with patch('pptopic.lib.Image.new') as mock_new:
|
||||
mock_canvas = MagicMock()
|
||||
mock_new.return_value = mock_canvas
|
||||
|
||||
PPT_longPic(ppt_file, saveto=".")
|
||||
|
||||
mock_canvas.save.assert_called_once()
|
||||
|
||||
@patch('pptopic.lib.convertPPT')
|
||||
def test_ppt_longpic_multiple_images(self, mock_convert_ppt, tmp_path):
|
||||
"""Test PPT_longPic with multiple images."""
|
||||
ppt_file = tmp_path / "test.pptx"
|
||||
ppt_file.touch()
|
||||
|
||||
mock_ppt = MagicMock()
|
||||
mock_convert_ppt.return_value.__enter__.return_value = mock_ppt
|
||||
|
||||
with patch('pptopic.lib.Path.glob') as mock_glob:
|
||||
mock_img_path1 = MagicMock()
|
||||
mock_img_path1.suffix = '.jpg'
|
||||
mock_img_path2 = MagicMock()
|
||||
mock_img_path2.suffix = '.jpg'
|
||||
mock_glob.return_value = [mock_img_path1, mock_img_path2]
|
||||
|
||||
with patch('pptopic.lib.Image.open') as mock_open:
|
||||
mock_img = MagicMock()
|
||||
mock_img.mode = 'RGB'
|
||||
mock_img.width = 100
|
||||
mock_img.height = 100
|
||||
mock_img.resize.return_value = mock_img
|
||||
mock_open.return_value.__enter__.return_value = mock_img
|
||||
|
||||
with patch('pptopic.lib.Image.new') as mock_new:
|
||||
mock_canvas = MagicMock()
|
||||
mock_new.return_value = mock_canvas
|
||||
|
||||
PPT_longPic(ppt_file, saveto=tmp_path)
|
||||
|
||||
mock_canvas.paste.assert_called()
|
||||
Reference in New Issue
Block a user