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