"""时态纪念日数据访问测试(辰正 §5.3)。""" import pytest from app.db.session import AsyncSessionLocal from app.models.time_anniversary import TimeAnniversary from app.repositories import time_anniversaries as anni_repo from app.services.characters import get_active_character_model def _anniversary(character_id: str, **overrides) -> TimeAnniversary: base = { "character_id": character_id, "name": "我们的相遇日", "calendar": "solar", "date": "2025-09-19", "recurs_yearly": True, "kind": "anniversary", "subject_type": "relationship", "source": "auto", "metadata_json": "{}", } base.update(overrides) return TimeAnniversary(**base) @pytest.mark.asyncio async def test_create_and_get_anniversary() -> None: async with AsyncSessionLocal() as session: character = await get_active_character_model(session) created = await anni_repo.create_anniversary(session, _anniversary(character.id)) fetched = await anni_repo.get_anniversary(session, created.id) assert fetched is not None assert fetched.name == "我们的相遇日" assert fetched.id.startswith("anniv_") @pytest.mark.asyncio async def test_list_anniversaries_by_character() -> None: async with AsyncSessionLocal() as session: character = await get_active_character_model(session) await anni_repo.create_anniversary(session, _anniversary(character.id, date="2025-03-01")) await anni_repo.create_anniversary(session, _anniversary(character.id, date="2025-09-19")) items = await anni_repo.list_anniversaries(session, character.id) # 默认人物 seed 时已带 1 条 birthday 纪念日;此处只验证 anniversary kind 的列表行为 anniversary_items = [a for a in items if a.kind == "anniversary"] assert len(anniversary_items) == 2 # list 默认按 date 升序 assert anniversary_items[0].date < anniversary_items[1].date @pytest.mark.asyncio async def test_update_anniversary() -> None: async with AsyncSessionLocal() as session: character = await get_active_character_model(session) created = await anni_repo.create_anniversary(session, _anniversary(character.id)) updated = await anni_repo.update_anniversary( session, created.id, name="相识纪念日", source="manual" ) assert updated is not None assert updated.name == "相识纪念日" assert updated.source == "manual" @pytest.mark.asyncio async def test_update_anniversary_missing_returns_none() -> None: async with AsyncSessionLocal() as session: result = await anni_repo.update_anniversary(session, "anniv_nonexistent", name="x") assert result is None @pytest.mark.asyncio async def test_delete_anniversary() -> None: async with AsyncSessionLocal() as session: character = await get_active_character_model(session) created = await anni_repo.create_anniversary(session, _anniversary(character.id)) assert await anni_repo.delete_anniversary(session, created.id) is True assert await anni_repo.get_anniversary(session, created.id) is None assert await anni_repo.delete_anniversary(session, created.id) is False