fix: restore photo captions and place recognized people after date [skip ci]
This commit is contained in:
@@ -1,12 +1,37 @@
|
||||
from io import BytesIO
|
||||
|
||||
import pytest
|
||||
from PIL import Image
|
||||
from PIL import Image, ImageDraw
|
||||
|
||||
from pigway_frame_flow.renderers.photo_caption import render_captioned_photo
|
||||
from pigway_frame_flow.renderers.photo_layout import PhotoLayout, WatermarkLayout
|
||||
|
||||
|
||||
def test_watermark_includes_filename_and_recognized_people(service, monkeypatch):
|
||||
drawn = []
|
||||
original = ImageDraw.ImageDraw.text
|
||||
|
||||
def text(draw, xy, value, *args, **kwargs):
|
||||
drawn.append(value)
|
||||
return original(draw, xy, value, *args, **kwargs)
|
||||
|
||||
monkeypatch.setattr(ImageDraw.ImageDraw, "text", text)
|
||||
stream = BytesIO()
|
||||
Image.new("RGB", (160, 120), "blue").save(stream, "JPEG")
|
||||
render_captioned_photo(
|
||||
stream.getvalue(),
|
||||
{
|
||||
"date": "2026-10-17",
|
||||
"title": "Family",
|
||||
"filename": "one.jpg",
|
||||
"people": "Alice · Bob",
|
||||
},
|
||||
service.renderer.font,
|
||||
size=(1600, 1200),
|
||||
)
|
||||
assert drawn == ["2026-10-17 · Alice · Bob · Family · one.jpg"]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("size", [(1600, 1200), (1200, 1600)])
|
||||
@pytest.mark.parametrize("fit", ["contain", "cover", "smart"])
|
||||
def test_watermark_has_no_letterboxing(service, size, fit):
|
||||
|
||||
@@ -78,6 +78,65 @@ def test_people_pagination_does_not_stop_at_500(settings, monkeypatch):
|
||||
assert calls == [0, 500, 1000]
|
||||
|
||||
|
||||
def test_caption_people_use_actual_membership_and_cache(settings, monkeypatch):
|
||||
session(settings)
|
||||
provider = SynologyPhotos(settings)
|
||||
monkeypatch.setattr(
|
||||
provider,
|
||||
"people",
|
||||
lambda space: [
|
||||
{"id": 1, "name": "Alice", "named": True},
|
||||
{"id": 2, "name": "Bob", "named": True},
|
||||
{"id": 3, "name": "3", "named": False},
|
||||
],
|
||||
)
|
||||
calls = []
|
||||
|
||||
def pages(api, version, **params):
|
||||
calls.append(api)
|
||||
return [{"id": params["person_id"]}, {"id": 10}]
|
||||
|
||||
monkeypatch.setattr(provider, "pages", pages)
|
||||
assert provider.item_people(1) == ["Alice"]
|
||||
assert provider.item_people(10) == ["Alice", "Bob"]
|
||||
assert provider.item_people(99) == []
|
||||
assert calls == ["SYNO.FotoTeam.Browse.Item"] * 2
|
||||
assert provider.item_people(10, space="personal") == ["Alice", "Bob"]
|
||||
assert calls[-2:] == ["SYNO.Foto.Browse.Item"] * 2
|
||||
|
||||
|
||||
@pytest.mark.parametrize("labels_available", [True, False])
|
||||
def test_api_caption_keeps_filename_and_folder_with_optional_people(
|
||||
service, settings, monkeypatch, labels_available
|
||||
):
|
||||
session(settings)
|
||||
provider = service.photo_sources
|
||||
monkeypatch.setattr(
|
||||
provider.synology,
|
||||
"items",
|
||||
lambda *a, **k: [row(1, "/20261017 Family@Park", "one.jpg")],
|
||||
)
|
||||
monkeypatch.setattr(provider.synology, "download", lambda *a, **k: jpeg())
|
||||
|
||||
def names(*a, **k):
|
||||
if not labels_available:
|
||||
raise FlowError("CLOUD_UNAVAILABLE", "unavailable", 502)
|
||||
return ["Alice", "Bob"]
|
||||
|
||||
monkeypatch.setattr(provider.synology, "item_people", names)
|
||||
provider.save(
|
||||
"captions",
|
||||
PhotoSourceInput(
|
||||
name="Family", kind="synology-photos", location=".", folder_caption=True
|
||||
),
|
||||
)
|
||||
_, _, caption = provider.read("captions", "1")
|
||||
assert caption["date"] == "2026-10-17"
|
||||
assert caption["title"] == "Family"
|
||||
assert caption["filename"] == "one.jpg"
|
||||
assert caption.get("people", "") == ("Alice · Bob" if labels_available else "")
|
||||
|
||||
|
||||
def test_source_without_mount_pagination_scope_and_session(
|
||||
client, service, settings, monkeypatch
|
||||
):
|
||||
|
||||
Reference in New Issue
Block a user