"""大周天循环骨架测试(触发 + 阶段化执行)。""" import pytest from app.application.big_cycle import drain_pending_big_cycles, maybe_trigger_big_cycle from app.db.session import AsyncSessionLocal from app.models.memory import Memory from app.repositories import big_cycle as big_cycle_repo from app.services.characters import get_active_character_model async def _seed_memories(character_id: str, count: int) -> None: async with AsyncSessionLocal() as session: for i in range(count): session.add( Memory( character_id=character_id, type="user", title=f"记忆{i}", content=f"内容{i}", ) ) await session.commit() @pytest.mark.asyncio async def test_big_cycle_runs_when_threshold_met() -> None: async with AsyncSessionLocal() as session: character = await get_active_character_model(session) await _seed_memories(character.id, 20) cycle_id = await maybe_trigger_big_cycle(character.id, trigger="test") assert cycle_id is not None await drain_pending_big_cycles() async with AsyncSessionLocal() as session: cycle = await big_cycle_repo.get_cycle(session, cycle_id) assert cycle is not None assert cycle.status == "completed" assert cycle.memory_count_at_trigger >= 20 @pytest.mark.asyncio async def test_big_cycle_skips_below_threshold() -> None: async with AsyncSessionLocal() as session: character = await get_active_character_model(session) # 默认人物 0 记忆,低于阈值 cycle_id = await maybe_trigger_big_cycle(character.id, trigger="test") assert cycle_id is None @pytest.mark.asyncio async def test_big_cycle_respects_min_interval() -> None: async with AsyncSessionLocal() as session: character = await get_active_character_model(session) await _seed_memories(character.id, 20) first = await maybe_trigger_big_cycle(character.id, trigger="test") assert first is not None await drain_pending_big_cycles() # 间隔窗口内再次触发 → 跳过 second = await maybe_trigger_big_cycle(character.id, trigger="test") assert second is None