from datetime import UTC, datetime, timedelta import pytest from backend.app.models import Artist, ImageRecord, Source pytestmark = pytest.mark.integration async def _img(db, n): rec = ImageRecord( path=f"/images/ap/{n}.jpg", sha256=f"ap{n:062d}", size_bytes=1, mime="image/jpeg", width=1, height=1, origin="imported_filesystem", integrity_status="unknown", ) rec.created_at = datetime.now(UTC) - timedelta(minutes=n) rec.effective_date = rec.created_at # no post → tracks created_at (0035) db.add(rec) await db.flush() return rec async def _artist_source(db, name, slug): a = Artist(name=name, slug=slug) db.add(a) await db.flush() s = Source(artist_id=a.id, platform="patreon", url=f"https://patreon.test/{slug}") db.add(s) await db.flush() return a, s @pytest.mark.asyncio async def test_scroll_artist_null_when_none(client, db): rec = await _img(db, 1) await db.commit() resp = await client.get("/api/gallery/scroll?limit=10") body = await resp.get_json() item = next(i for i in body["images"] if i["id"] == rec.id) assert item["artist"] is None @pytest.mark.asyncio async def test_scroll_artist_via_artist_id(client, db): # FC-2d-vii-c: the canonical resolution path is image_record.artist_id # (covers folder-style images with no provenance too). rec = await _img(db, 1) a, _ = await _artist_source(db, "Folder", "folder") rec.artist_id = a.id await db.flush() await db.commit() resp = await client.get("/api/gallery/scroll?limit=10") assert resp.status_code == 200 body = await resp.get_json() item = next(i for i in body["images"] if i["id"] == rec.id) assert item["artist"] == {"name": "Folder", "slug": "folder"}