87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
#!/usr/bin/env -S uv run --script
|
|
# /// script
|
|
# requires-python = ">=3.11"
|
|
# dependencies = ["pytest", "httpx", "pillow", "click"]
|
|
# ///
|
|
import sys
|
|
import zipfile
|
|
from pathlib import Path
|
|
from unittest.mock import Mock
|
|
|
|
import pytest
|
|
from click.testing import CliRunner
|
|
from PIL import Image
|
|
|
|
import download_imageset
|
|
|
|
|
|
@pytest.mark.parametrize("extension", [".zip", ".ZIP"])
|
|
def test_process_zip_and_directory(
|
|
tmp_path: Path, monkeypatch: pytest.MonkeyPatch, extension: str
|
|
) -> None:
|
|
directory = tmp_path / "existing"
|
|
nested = directory / "nested"
|
|
nested.mkdir(parents=True)
|
|
image_path = nested / "photo.png"
|
|
Image.new(mode="RGB", size=(10, 10)).save(fp=image_path)
|
|
archive_path = tmp_path / f"gallery{extension}"
|
|
with zipfile.ZipFile(file=archive_path, mode="w") as archive:
|
|
archive.write(filename=image_path, arcname="album/photo.png")
|
|
trash = Mock()
|
|
monkeypatch.setattr(download_imageset, "move_to_trash", trash)
|
|
|
|
result = CliRunner().invoke(
|
|
cli=download_imageset.cli,
|
|
args=["process", str(archive_path), str(directory)],
|
|
)
|
|
|
|
assert result.exit_code == 0, result.output
|
|
assert (tmp_path / "gallery" / "gallery__0000.png").is_file()
|
|
assert (directory / "existing__0000.png").is_file()
|
|
assert not (tmp_path / "gallery" / "album").exists()
|
|
assert not nested.exists()
|
|
trash.assert_called_once_with(file_paths=[archive_path])
|
|
|
|
|
|
@pytest.mark.parametrize("filename", ["missing", "unsupported.txt", "broken.zip"])
|
|
def test_process_skips_invalid_inputs(
|
|
tmp_path: Path, monkeypatch: pytest.MonkeyPatch, filename: str
|
|
) -> None:
|
|
source = tmp_path / filename
|
|
if filename != "missing":
|
|
source.write_text(data="not an archive")
|
|
trash = Mock()
|
|
monkeypatch.setattr(download_imageset, "move_to_trash", trash)
|
|
|
|
result = CliRunner().invoke(
|
|
cli=download_imageset.cli, args=["process", str(source)]
|
|
)
|
|
|
|
assert result.exit_code == 0, result.output
|
|
trash.assert_not_called()
|
|
if filename != "missing":
|
|
assert source.read_text() == "not an archive"
|
|
assert not (tmp_path / "broken").exists()
|
|
|
|
|
|
def test_process_keeps_zip_when_processing_fails(
|
|
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
) -> None:
|
|
archive_path = tmp_path / "gallery.zip"
|
|
with zipfile.ZipFile(file=archive_path, mode="w") as archive:
|
|
archive.writestr(zinfo_or_arcname="photo.png", data=b"invalid image")
|
|
trash = Mock()
|
|
monkeypatch.setattr(download_imageset, "move_to_trash", trash)
|
|
|
|
result = CliRunner().invoke(
|
|
cli=download_imageset.cli, args=["process", str(archive_path)]
|
|
)
|
|
|
|
assert result.exit_code != 0
|
|
assert archive_path.is_file()
|
|
trash.assert_not_called()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(pytest.main(args=[str(Path(__file__).resolve()), *sys.argv[1:]]))
|