Linux native client
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

42 lines
1.7 KiB

"""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