crawler_test.mx raw
1 package crawler
2
3 import (
4 "testing"
5
6 "smesh.lol/pkg/nostr/event"
7 "smesh.lol/pkg/nostr/kind"
8 "smesh.lol/pkg/nostr/signer/p8k"
9 "smesh.lol/pkg/nostr/tag"
10 "smesh.lol/pkg/store"
11 )
12
13 func openTmp(t *testing.T) *store.Engine {
14 t.Helper()
15 eng, err := store.Open(t.TempDir())
16 if err != nil {
17 t.Fatal(err)
18 }
19 t.Cleanup(func() { eng.Close() })
20 return eng
21 }
22
23 func makeRelayList(t *testing.T, s *p8k.Signer, relays ...string) *event.E {
24 t.Helper()
25 tags := tag.NewSWithCap(len(relays))
26 for _, r := range relays {
27 *tags = append(*tags, tag.NewFromBytesSlice([]byte("r"), []byte(r)))
28 }
29 ev := &event.E{
30 CreatedAt: 1700000000,
31 Kind: kind.RelayListMetadata.K,
32 Tags: tags,
33 }
34 if err := ev.Sign(s); err != nil {
35 t.Fatal(err)
36 }
37 return ev
38 }
39
40 func TestDiscoverRelays(t *testing.T) {
41 eng := openTmp(t)
42 s := p8k.MustNew()
43 if err := s.Generate(); err != nil {
44 t.Fatal(err)
45 }
46
47 ev := makeRelayList(t, s, "wss://relay.example.com", "wss://another.relay")
48 if err := eng.SaveEvent(ev); err != nil {
49 t.Fatal(err)
50 }
51
52 c := New(eng)
53 relays := c.Discover()
54 if len(relays) != 2 {
55 t.Fatalf("expected 2 relays, got %d", len(relays))
56 }
57
58 urls := map[string]bool{}
59 for _, r := range relays {
60 urls[r.URL] = true
61 // No hint means both read+write
62 if !r.Read || !r.Write {
63 t.Errorf("relay %s should be read+write", r.URL)
64 }
65 }
66 if !urls["wss://relay.example.com"] || !urls["wss://another.relay"] {
67 t.Error("missing expected relay URLs")
68 }
69 }
70
71 func TestDiscoverDedup(t *testing.T) {
72 eng := openTmp(t)
73
74 s1 := p8k.MustNew()
75 if err := s1.Generate(); err != nil {
76 t.Fatal(err)
77 }
78 s2 := p8k.MustNew()
79 if err := s2.Generate(); err != nil {
80 t.Fatal(err)
81 }
82
83 // Two users list the same relay
84 if err := eng.SaveEvent(makeRelayList(t, s1, "wss://shared.relay")); err != nil {
85 t.Fatal(err)
86 }
87 if err := eng.SaveEvent(makeRelayList(t, s2, "wss://shared.relay")); err != nil {
88 t.Fatal(err)
89 }
90
91 c := New(eng)
92 relays := c.Discover()
93 if len(relays) != 1 {
94 t.Fatalf("expected 1 deduplicated relay, got %d", len(relays))
95 }
96 }
97
98 func TestDiscoverURLs(t *testing.T) {
99 eng := openTmp(t)
100 s := p8k.MustNew()
101 if err := s.Generate(); err != nil {
102 t.Fatal(err)
103 }
104
105 if err := eng.SaveEvent(makeRelayList(t, s, "wss://relay.one")); err != nil {
106 t.Fatal(err)
107 }
108
109 c := New(eng)
110 urls := c.DiscoverURLs()
111 if len(urls) != 1 || urls[0] != "wss://relay.one" {
112 t.Fatalf("expected [wss://relay.one], got %v", urls)
113 }
114 }
115