#!/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:]]))