78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
|
|
import os
|
||
|
|
from datetime import date
|
||
|
|
from unittest.mock import patch, MagicMock
|
||
|
|
from io import BytesIO
|
||
|
|
from PIL import Image as PILImage
|
||
|
|
|
||
|
|
from src.cover import generate_text_cover, generate_ai_cover, generate_cover
|
||
|
|
|
||
|
|
|
||
|
|
def test_text_cover_creates_jpeg(tmp_path):
|
||
|
|
path = generate_text_cover(
|
||
|
|
output_dir=str(tmp_path),
|
||
|
|
week_start=date(2026, 4, 6),
|
||
|
|
week_end=date(2026, 4, 12),
|
||
|
|
headlines=["Article One", "Article Two", "Article Three"],
|
||
|
|
)
|
||
|
|
|
||
|
|
assert os.path.exists(path)
|
||
|
|
img = PILImage.open(path)
|
||
|
|
assert img.format == "JPEG"
|
||
|
|
assert img.width <= 800
|
||
|
|
assert img.height <= 480
|
||
|
|
|
||
|
|
|
||
|
|
def test_ai_cover_creates_jpeg(tmp_path):
|
||
|
|
fake_img = PILImage.new("RGB", (800, 480), color="blue")
|
||
|
|
buf = BytesIO()
|
||
|
|
fake_img.save(buf, format="JPEG")
|
||
|
|
fake_bytes = buf.getvalue()
|
||
|
|
|
||
|
|
mock_response = MagicMock()
|
||
|
|
mock_response.content = fake_bytes
|
||
|
|
mock_response.raise_for_status = MagicMock()
|
||
|
|
|
||
|
|
with patch("src.cover.requests.get", return_value=mock_response):
|
||
|
|
path = generate_ai_cover(
|
||
|
|
output_dir=str(tmp_path),
|
||
|
|
week_start=date(2026, 4, 6),
|
||
|
|
week_end=date(2026, 4, 12),
|
||
|
|
headlines=["Test Headline"],
|
||
|
|
)
|
||
|
|
|
||
|
|
assert os.path.exists(path)
|
||
|
|
img = PILImage.open(path)
|
||
|
|
assert img.format == "JPEG"
|
||
|
|
assert img.width <= 800
|
||
|
|
assert img.height <= 480
|
||
|
|
|
||
|
|
|
||
|
|
def test_ai_cover_falls_back_on_failure(tmp_path):
|
||
|
|
with patch("src.cover.requests.get", side_effect=Exception("API down")):
|
||
|
|
path = generate_ai_cover(
|
||
|
|
output_dir=str(tmp_path),
|
||
|
|
week_start=date(2026, 4, 6),
|
||
|
|
week_end=date(2026, 4, 12),
|
||
|
|
headlines=["Test"],
|
||
|
|
)
|
||
|
|
|
||
|
|
assert os.path.exists(path)
|
||
|
|
img = PILImage.open(path)
|
||
|
|
assert img.format == "JPEG"
|
||
|
|
|
||
|
|
|
||
|
|
def test_generate_cover_dispatches(tmp_path):
|
||
|
|
with patch("src.cover.generate_ai_cover") as mock_ai:
|
||
|
|
mock_ai.return_value = "/fake/ai.jpg"
|
||
|
|
result = generate_cover("ai", str(tmp_path), date(2026, 4, 6),
|
||
|
|
date(2026, 4, 12), ["A"])
|
||
|
|
assert result == "/fake/ai.jpg"
|
||
|
|
mock_ai.assert_called_once()
|
||
|
|
|
||
|
|
with patch("src.cover.generate_text_cover") as mock_text:
|
||
|
|
mock_text.return_value = "/fake/text.jpg"
|
||
|
|
result = generate_cover("text", str(tmp_path), date(2026, 4, 6),
|
||
|
|
date(2026, 4, 12), ["A"])
|
||
|
|
assert result == "/fake/text.jpg"
|
||
|
|
mock_text.assert_called_once()
|