import tempfile from pathlib import Path from imwald.core.database import Database from imwald.core.nostr_crypto import build_signed_event from imwald.core.relay_list import parse_kind10002_tags, resolve_for_account from imwald.core.relay_policy import DEFAULT_READ_RELAYS, DEFAULT_WRITE_RELAYS def _sk() -> bytes: return bytes.fromhex("3501454135014541350145413501453fefb02227e449e57cf4d3a3ce05378683") def test_parse_nip65_triple_tags() -> None: tags = [ ["r", "wss://read.only", "read"], ["r", "wss://write.only", "write"], ["r", "wss://both.relay"], ] reads, writes = parse_kind10002_tags(tags) assert "wss://read.only" in reads and "wss://read.only" not in writes assert "wss://write.only" in writes and "wss://write.only" not in reads assert "wss://both.relay" in reads and "wss://both.relay" in writes def test_parse_legacy_read_write_pairs() -> None: tags = [["r", "wss://a"], ["read", "true"], ["r", "wss://b"], ["write", "true"]] reads, writes = parse_kind10002_tags(tags) assert reads == ["wss://a"] assert writes == ["wss://b"] def test_resolve_defaults_without_kind10002() -> None: with tempfile.TemporaryDirectory() as td: db = Database(Path(td) / "x.sqlite") db.connect() sk = _sk() me = build_signed_event(sk, created_at=1, kind=0, tags=[], content="{}")["pubkey"] r = resolve_for_account(db, me) assert r.read_urls == list(DEFAULT_READ_RELAYS) assert r.write_urls == list(DEFAULT_WRITE_RELAYS) assert r.had_kind10002 is False def test_resolve_uses_stored_kind10002() -> None: with tempfile.TemporaryDirectory() as td: db = Database(Path(td) / "y.sqlite") db.connect() sk = _sk() me = build_signed_event(sk, created_at=1, kind=0, tags=[], content="{}")["pubkey"] tags = [["r", "wss://custom.read", "read"], ["r", "wss://custom.write", "write"]] ev = build_signed_event(sk, created_at=2, kind=10002, tags=tags, content="") db.upsert_event(ev) r = resolve_for_account(db, me) assert r.read_urls == ["wss://custom.read"] assert r.write_urls == ["wss://custom.write"] assert r.had_kind10002 is True