import pytest from sqlalchemy import select from sqlalchemy.exc import IntegrityError from backend.app.models import ImageRecord, TagKind from backend.app.models.series_chapter import SeriesChapter from backend.app.models.series_page import SeriesPage from backend.app.services.tag_service import TagService pytestmark = pytest.mark.integration _SEQ = 0 async def _img(db): global _SEQ _SEQ += 1 rec = ImageRecord( path=f"/tmp/fc_sp_{_SEQ}.png", sha256=f"{_SEQ:064d}", size_bytes=1, mime="image/png", origin="uploaded", ) db.add(rec) await db.flush() return rec.id @pytest.mark.asyncio async def _chapter(db, series_tag_id): ch = SeriesChapter(series_tag_id=series_tag_id, chapter_number=1) db.add(ch) await db.flush() return ch.id async def test_series_page_roundtrip_and_unique_image(db): s = await TagService(db).find_or_create("Vol1", TagKind.series) i1 = await _img(db) ch = await _chapter(db, s.id) db.add(SeriesPage( series_tag_id=s.id, chapter_id=ch, image_id=i1, page_number=1 )) await db.flush() got = await db.scalar( select(SeriesPage.page_number).where(SeriesPage.image_id == i1) ) assert got == 1 # UNIQUE image_id: same image can't be a page twice (any series). s2 = await TagService(db).find_or_create("Vol2", TagKind.series) ch2 = await _chapter(db, s2.id) db.add(SeriesPage( series_tag_id=s2.id, chapter_id=ch2, image_id=i1, page_number=1 )) with pytest.raises(IntegrityError): await db.flush()