from pathlib import Path import pytest from PIL import Image from unittest.mock import patch from logimage.cli.main import main from logimage.infrastructure.image.pexels_source import PexelsImageSource from logimage.infrastructure.image.unsplash_source import UnsplashImageSource from logimage.infrastructure.image.local_file_source import LocalFileImageSource def _make_png_file(tmp_path: Path) -> Path: img = Image.new("RGB", (50, 50), color=(200, 100, 50)) path = tmp_path / "icon.png" img.save(path, format="PNG") return path def test_pexels_key_uses_pexels_source(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setenv("PEXELS_API_KEY", "pexels-test-key") monkeypatch.delenv("UNSPLASH_ACCESS_KEY", raising=False) with patch("logimage.cli.main.GeneratePuzzlesUseCase") as mock_uc, \ patch("logimage.cli.main.load_dotenv"), \ patch("sys.argv", ["logimage", "--count", "1"]): mock_uc.return_value.execute.return_value = None main() assert isinstance(mock_uc.call_args.kwargs["image_source"], PexelsImageSource) def test_unsplash_key_uses_unsplash_source(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.delenv("PEXELS_API_KEY", raising=False) monkeypatch.setenv("UNSPLASH_ACCESS_KEY", "unsplash-test-key") with patch("logimage.cli.main.GeneratePuzzlesUseCase") as mock_uc, \ patch("logimage.cli.main.load_dotenv"), \ patch("sys.argv", ["logimage", "--count", "1"]): mock_uc.return_value.execute.return_value = None main() assert isinstance(mock_uc.call_args.kwargs["image_source"], UnsplashImageSource) def test_pexels_takes_priority_over_unsplash(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setenv("PEXELS_API_KEY", "pexels-test-key") monkeypatch.setenv("UNSPLASH_ACCESS_KEY", "unsplash-test-key") with patch("logimage.cli.main.GeneratePuzzlesUseCase") as mock_uc, \ patch("logimage.cli.main.load_dotenv"), \ patch("sys.argv", ["logimage", "--count", "1"]): mock_uc.return_value.execute.return_value = None main() assert isinstance(mock_uc.call_args.kwargs["image_source"], PexelsImageSource) def test_local_image_flag_uses_local_source(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: icon = _make_png_file(tmp_path) with patch("logimage.cli.main.GeneratePuzzlesUseCase") as mock_uc, \ patch("logimage.cli.main.load_dotenv"), \ patch("sys.argv", ["logimage", "--local-image", str(icon)]): mock_uc.return_value.execute.return_value = None main() assert isinstance(mock_uc.call_args.kwargs["image_source"], LocalFileImageSource) def test_local_image_takes_priority_over_api_keys(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: icon = _make_png_file(tmp_path) monkeypatch.setenv("PEXELS_API_KEY", "pexels-test-key") monkeypatch.setenv("UNSPLASH_ACCESS_KEY", "unsplash-test-key") with patch("logimage.cli.main.GeneratePuzzlesUseCase") as mock_uc, \ patch("logimage.cli.main.load_dotenv"), \ patch("sys.argv", ["logimage", "--local-image", str(icon)]): mock_uc.return_value.execute.return_value = None main() assert isinstance(mock_uc.call_args.kwargs["image_source"], LocalFileImageSource) def test_no_key_exits_with_error(monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]) -> None: monkeypatch.delenv("PEXELS_API_KEY", raising=False) monkeypatch.delenv("UNSPLASH_ACCESS_KEY", raising=False) with patch("logimage.cli.main.load_dotenv"), \ patch("sys.argv", ["logimage", "--count", "1"]): with pytest.raises(SystemExit) as exc_info: main() assert exc_info.value.code == 1 captured = capsys.readouterr() assert "PEXELS_API_KEY" in captured.err assert "UNSPLASH_ACCESS_KEY" in captured.err