package crawler import ( "testing" "smesh.lol/pkg/nostr/event" "smesh.lol/pkg/nostr/kind" "smesh.lol/pkg/nostr/signer/p8k" "smesh.lol/pkg/nostr/tag" "smesh.lol/pkg/store" ) func openTmp(t *testing.T) *store.Engine { t.Helper() eng, err := store.Open(t.TempDir()) if err != nil { t.Fatal(err) } t.Cleanup(func() { eng.Close() }) return eng } func makeRelayList(t *testing.T, s *p8k.Signer, relays ...string) *event.E { t.Helper() tags := tag.NewSWithCap(len(relays)) for _, r := range relays { *tags = append(*tags, tag.NewFromBytesSlice([]byte("r"), []byte(r))) } ev := &event.E{ CreatedAt: 1700000000, Kind: kind.RelayListMetadata.K, Tags: tags, } if err := ev.Sign(s); err != nil { t.Fatal(err) } return ev } func TestDiscoverRelays(t *testing.T) { eng := openTmp(t) s := p8k.MustNew() if err := s.Generate(); err != nil { t.Fatal(err) } ev := makeRelayList(t, s, "wss://relay.example.com", "wss://another.relay") if err := eng.SaveEvent(ev); err != nil { t.Fatal(err) } c := New(eng) relays := c.Discover() if len(relays) != 2 { t.Fatalf("expected 2 relays, got %d", len(relays)) } urls := map[string]bool{} for _, r := range relays { urls[r.URL] = true // No hint means both read+write if !r.Read || !r.Write { t.Errorf("relay %s should be read+write", r.URL) } } if !urls["wss://relay.example.com"] || !urls["wss://another.relay"] { t.Error("missing expected relay URLs") } } func TestDiscoverDedup(t *testing.T) { eng := openTmp(t) s1 := p8k.MustNew() if err := s1.Generate(); err != nil { t.Fatal(err) } s2 := p8k.MustNew() if err := s2.Generate(); err != nil { t.Fatal(err) } // Two users list the same relay if err := eng.SaveEvent(makeRelayList(t, s1, "wss://shared.relay")); err != nil { t.Fatal(err) } if err := eng.SaveEvent(makeRelayList(t, s2, "wss://shared.relay")); err != nil { t.Fatal(err) } c := New(eng) relays := c.Discover() if len(relays) != 1 { t.Fatalf("expected 1 deduplicated relay, got %d", len(relays)) } } func TestDiscoverURLs(t *testing.T) { eng := openTmp(t) s := p8k.MustNew() if err := s.Generate(); err != nil { t.Fatal(err) } if err := eng.SaveEvent(makeRelayList(t, s, "wss://relay.one")); err != nil { t.Fatal(err) } c := New(eng) urls := c.DiscoverURLs() if len(urls) != 1 || urls[0] != "wss://relay.one" { t.Fatalf("expected [wss://relay.one], got %v", urls) } }