2026-10-17 01:39:23 +08:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
|
|
2026-10-05 00:31:56 +08:00
|
|
|
def test_uploaded_photos_exclude_generated_templates_before_limit(client, service):
|
|
|
|
|
photo = service.assets.put(b"fixture", "family.jpg", "images")
|
|
|
|
|
for _ in range(5):
|
|
|
|
|
service.assets.put(b"fixture", "quote.jpg", "generated")
|
|
|
|
|
response = client.get("/api/v1/assets?source=uploaded&limit=1")
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
assert response.json()[0]["asset_id"] == photo["asset_id"]
|
|
|
|
|
assert response.json()[0]["source"] == "uploaded"
|
|
|
|
|
generated = client.get("/api/v1/assets?source=generated").json()
|
|
|
|
|
assert len(generated) == 5 and all(a["source"] == "generated" for a in generated)
|
|
|
|
|
assert len(client.get("/api/v1/assets").json()) == 6
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_filename_does_not_determine_photo_source(client, service):
|
|
|
|
|
service.assets.put(b"fixture", "weather.jpg", "images")
|
|
|
|
|
assert (
|
|
|
|
|
client.get("/api/v1/assets?source=uploaded").json()[0]["name"] == "weather.jpg"
|
|
|
|
|
)
|
|
|
|
|
assert client.get("/api/v1/assets?source=invalid").status_code == 422
|
2026-10-10 09:38:27 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_multiple_sources_keep_separate_people_and_folder_settings(
|
|
|
|
|
service, settings, tmp_path
|
|
|
|
|
):
|
|
|
|
|
from pigway_frame_flow.providers.photo_sources import PhotoSourceInput
|
|
|
|
|
|
|
|
|
|
root = tmp_path / "photos"
|
|
|
|
|
root.mkdir()
|
|
|
|
|
(root / "family").mkdir()
|
|
|
|
|
(root / "travel").mkdir()
|
|
|
|
|
settings.photo_root = root
|
|
|
|
|
service.photo_sources.save(
|
|
|
|
|
"family",
|
|
|
|
|
PhotoSourceInput(
|
|
|
|
|
name="Family",
|
|
|
|
|
kind="local",
|
|
|
|
|
location="family",
|
|
|
|
|
people_filter=True,
|
|
|
|
|
person_ids=[1],
|
|
|
|
|
orientation="portrait",
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
service.photo_sources.save(
|
|
|
|
|
"travel",
|
|
|
|
|
PhotoSourceInput(
|
|
|
|
|
name="Travel",
|
|
|
|
|
kind="local",
|
|
|
|
|
location="travel",
|
|
|
|
|
people_filter=True,
|
|
|
|
|
person_ids=[2],
|
|
|
|
|
orientation="landscape",
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
before = service.photo_sources.get("travel").model_dump()
|
|
|
|
|
service.photo_sources.save(
|
|
|
|
|
"family",
|
|
|
|
|
PhotoSourceInput(
|
|
|
|
|
name="Family",
|
|
|
|
|
kind="local",
|
|
|
|
|
location="family",
|
|
|
|
|
people_filter=True,
|
|
|
|
|
person_ids=[3],
|
|
|
|
|
orientation="auto",
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
assert service.photo_sources.get("travel").model_dump() == before
|
|
|
|
|
assert service.photo_sources.get("family").person_ids == [3]
|
|
|
|
|
assert service.photo_sources.get("travel").person_ids == [2]
|
2026-10-17 01:39:23 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Legacy algorithms remain covered; production filesystem access is tested separately.
|
|
|
|
|
pytestmark = pytest.mark.usefixtures("legacy_photo_engine")
|