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