"""build_user_prompt is the heart of the AI log — verify shape.""" from __future__ import annotations import pytest pytest.importorskip("httpx") pytest.importorskip("tenacity") pytest.importorskip("pydantic_settings") from datetime import datetime, timezone from app.services.openrouter import SYSTEM_PROMPT, build_user_prompt def test_system_prompt_has_voice_anchors(): # Tripwires for prompt regressions. for marker in ["Objective", "Lens", "Discipline", "watch list"]: assert marker in SYSTEM_PROMPT def test_build_user_prompt_includes_anchor_and_reference(): out = build_user_prompt( today=datetime(2026, 5, 15, tzinfo=timezone.utc), anchor="2026-03-04", quotes_by_group={"equity": [{"symbol": "^GSPC", "label": "S&P 500"}]}, headlines_by_bucket={"world": [{"when": "2026-05-15T10:00", "source": "BBC", "title": "x"}]}, reference_line="S&P 7501 · VIX 18", ) assert "2026-05-15" in out assert "Anchor reference date: 2026-03-04" in out assert "S&P 7501" in out assert "WORLD" in out assert "^GSPC" in out def test_build_user_prompt_omits_empty_buckets(): out = build_user_prompt( today=datetime(2026, 5, 15, tzinfo=timezone.utc), anchor=None, quotes_by_group={}, headlines_by_bucket={"world": [], "tech": [{"when": "2026-05-15T10:00", "source": "X", "title": "AI thing"}]}, ) assert "TECH" in out assert "WORLD" not in out