from __future__ import annotations import pytest from app.features.memoir.ingest_scheduler import MemoirIngestScheduler class _FakeRunner: def __init__(self) -> None: self.queued: list[tuple[str, str, int]] = [] self.flushed: list[tuple[str, list[str]]] = [] async def queue_message( self, user_id: str, segment_id: str, *, text_char_count: int = 0, ) -> None: self.queued.append((user_id, segment_id, text_char_count)) async def flush_pending( self, user_id: str, *, extra_segment_ids: list[str] | None = None, ) -> str: self.flushed.append((user_id, list(extra_segment_ids or []))) return "task-1" @pytest.mark.asyncio async def test_queue_segment_returns_visible_phase_plan() -> None: runner = _FakeRunner() scheduler = MemoirIngestScheduler(runner=runner) plan = await scheduler.queue_segment( "user-1", "seg-1", text_char_count=42, trigger="evaluation_replay", ) assert runner.queued == [("user-1", "seg-1", 42)] assert plan.user_id == "user-1" assert plan.segment_ids == ("seg-1",) assert plan.trigger == "evaluation_replay" @pytest.mark.asyncio async def test_flush_pending_returns_plan_and_task_id() -> None: runner = _FakeRunner() scheduler = MemoirIngestScheduler(runner=runner) plan, task_id = await scheduler.flush_pending( "user-1", extra_segment_ids=["seg-1", "seg-2"], trigger="conversation_end", ) assert runner.flushed == [("user-1", ["seg-1", "seg-2"])] assert task_id == "task-1" assert plan.user_id == "user-1" assert plan.segment_ids == ("seg-1", "seg-2") assert plan.trigger == "conversation_end"