"""Feed candidate selection and feed_views persistence.""" import tempfile from datetime import datetime, timezone 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 def test_relative_event_time_labels_and_absolute_tooltip() -> None: from imwald.ui.feed_page import relative_event_time_labels fixed = datetime(2026, 4, 19, 14, 0, 0, tzinfo=timezone.utc) ts = int(datetime(2026, 4, 19, 12, 49, 0, tzinfo=timezone.utc).timestamp()) rel, abs_s = relative_event_time_labels(ts, now=fixed) assert abs_s == "2026-04-19 ยท 12:49 UTC" assert "hour" in rel