"""Feed candidate selection and feed_views persistence.""" import tempfile from pathlib import Path from typing import cast from imwald.core.database import Database from imwald.core.nostr_crypto import build_signed_event, pubkey_hex_from_secret def _sk() -> bytes: return bytes.fromhex("3501454135014541350145413501453fefb02227e449e57cf4d3a3ce05378683") def test_feed_candidates_exclude_viewed_then_include_when_all_seen() -> None: sk = _sk() pk = pubkey_hex_from_secret(sk) ev = build_signed_event(sk, created_at=100, kind=1, tags=[], content="hello feed") eid = cast(str, ev["id"]) kinds = (1,) with tempfile.TemporaryDirectory() as td: db = Database(Path(td) / "fv.sqlite") db.connect() db.upsert_event(ev) unseen = db.feed_candidates(kinds, hide_nsfw=False, limit=50, viewer_pubkey=pk, exclude_viewed=True) assert len(unseen) == 1 and unseen[0]["id"] == eid db.mark_feed_viewed(pk, eid) empty = db.feed_candidates(kinds, hide_nsfw=False, limit=50, viewer_pubkey=pk, exclude_viewed=True) assert empty == [] again = db.feed_candidates(kinds, hide_nsfw=False, limit=50, viewer_pubkey=pk, exclude_viewed=False) assert len(again) == 1 and again[0]["id"] == eid