"""Tests for journal closeout extraction helpers.""" from types import SimpleNamespace def _msg(role: str, content: str, kind: str | None = None): """Build a Message-like stand-in for the filter helpers.""" metadata = {"kind": kind} if kind else None return SimpleNamespace(role=role, content=content, msg_metadata=metadata) def test_filter_excludes_daily_prep_messages(): from fabledassistant.services.journal_closeout import _filter_messages msgs = [ _msg("assistant", "Good morning — here is today's plan…", kind="daily_prep"), _msg("user", "I want to focus on the auth refactor today."), _msg("assistant", "Got it. I'll keep tool calls quiet."), ] kept = _filter_messages(msgs) contents = [m.content for m in kept] assert "Good morning — here is today's plan…" not in contents assert "I want to focus on the auth refactor today." in contents assert "Got it. I'll keep tool calls quiet." in contents def test_build_transcript_labels_roles_and_caps_content(): from fabledassistant.services.journal_closeout import _build_transcript msgs = [ _msg("user", "hello"), _msg("assistant", "hi"), _msg("user", "x" * 600), ] out = _build_transcript(msgs) lines = out.splitlines() assert lines[0] == "USER: hello" assert lines[1] == "ASSISTANT: hi" # Third line content truncated to 500 chars assert lines[2].startswith("USER: ") assert len(lines[2]) == len("USER: ") + 500 def test_build_transcript_keeps_only_last_20_messages(): from fabledassistant.services.journal_closeout import _build_transcript msgs = [_msg("user", f"msg-{i}") for i in range(30)] out = _build_transcript(msgs) lines = out.splitlines() assert len(lines) == 20 # Newest 20 means msg-10 through msg-29 assert lines[0] == "USER: msg-10" assert lines[-1] == "USER: msg-29"