"""Quote of the Day: curated seed (idempotent), deterministic pick (idempotent, blocked/featured), lazy AI meaning, never-empty get_today.""" import pytest from goodnews import quote from goodnews.db import connect, init_db class FakeClient: def chat_text(self, messages): return "It means contentment is built from within, not from circumstance." @pytest.fixture def conn(): c = connect(":memory:"); init_db(c) yield c c.close() def test_seed_idempotent(conn): assert quote.seed(conn) == len(quote.SEED) assert quote.seed(conn) == 0 assert conn.execute("SELECT COUNT(*) FROM quote_pool").fetchone()[0] == len(quote.SEED) def test_pick_caches_marks_shown_idempotent(conn): quote.seed(conn) a = quote.pick_daily(conn, feature_date="2026-06-22") assert a and a["text"] and a["author"] shown = conn.execute("SELECT shown_at FROM quote_pool WHERE id=?", (a["pool_id"],)).fetchone()[0] assert shown == "2026-06-22" assert quote.pick_daily(conn, feature_date="2026-06-22")["pool_id"] == a["pool_id"] def test_meaning_generated_lazily_and_cached(conn): quote.seed(conn) a = quote.pick_daily(conn, feature_date="2026-06-22", client=FakeClient()) assert a["meaning"].startswith("It means") pool_meaning = conn.execute("SELECT meaning FROM quote_pool WHERE id=?", (a["pool_id"],)).fetchone()[0] assert pool_meaning == a["meaning"] # cached on the pool row, not regenerated def test_featured_pinned(conn): quote.seed(conn) conn.execute("UPDATE quote_pool SET featured=1 WHERE author='Rumi'"); conn.commit() assert quote.pick_daily(conn, feature_date="2026-06-22", force=True)["author"] == "Rumi" def test_get_today_never_empty(conn): quote.seed(conn) a = quote.pick_daily(conn, feature_date="2026-06-22") assert quote.get_today(conn, "2099-01-01")["pool_id"] == a["pool_id"] def test_run_daily_seeds_then_picks(conn): r = quote.run_daily(conn) assert r["pool"] == len(quote.SEED) and r["picked"]