client_test.mx raw

   1  package ws
   2  
   3  import (
   4  	"testing"
   5  	"time"
   6  
   7  	"smesh.lol/pkg/nostr/filter"
   8  	"smesh.lol/pkg/nostr/kind"
   9  	"smesh.lol/pkg/nostr/timestamp"
  10  )
  11  
  12  func TestDialAndSubscribe(t *testing.T) {
  13  	if testing.Short() {
  14  		t.Skip("skipping network test in short mode")
  15  	}
  16  
  17  	relay := "wss://relay.damus.io"
  18  	c, err := Connect(relay)
  19  	if err != nil {
  20  		t.Fatalf("connect to %s: %v", relay, err)
  21  	}
  22  	defer c.Close()
  23  
  24  	// Subscribe: recent kind-1 text notes, last 30 seconds.
  25  	now := time.Now().Unix()
  26  	since := now - 30
  27  	f := &filter.F{
  28  		Kinds: kind.NewS(kind.New(uint16(1))),
  29  		Since: timestamp.FromUnix(since),
  30  	}
  31  	limit := uint(5)
  32  	f.Limit = &limit
  33  
  34  	sub, err := c.Subscribe(f)
  35  	if err != nil {
  36  		t.Fatalf("subscribe: %v", err)
  37  	}
  38  
  39  	// Wait for EOSE or timeout.
  40  	var count int
  41  	timeout := time.After(15 * time.Second)
  42  loop:
  43  	for {
  44  		select {
  45  		case ev, ok := <-sub.Events:
  46  			if !ok {
  47  				break loop
  48  			}
  49  			if ev == nil {
  50  				continue
  51  			}
  52  			if len(ev.ID) != 32 {
  53  				t.Fatalf("bad event ID length: %d", len(ev.ID))
  54  			}
  55  			if len(ev.Pubkey) != 32 {
  56  				t.Fatalf("bad pubkey length: %d", len(ev.Pubkey))
  57  			}
  58  			if ev.Kind != 1 {
  59  				t.Fatalf("expected kind 1, got %d", ev.Kind)
  60  			}
  61  			count++
  62  		case <-sub.EOSE:
  63  			break loop
  64  		case <-timeout:
  65  			break loop
  66  		}
  67  	}
  68  
  69  	if count == 0 {
  70  		t.Fatal("received no events")
  71  	}
  72  	t.Logf("received %d events from %s", count, relay)
  73  }
  74  
  75  func TestWebSocketFraming(t *testing.T) {
  76  	if testing.Short() {
  77  		t.Skip("skipping network test in short mode")
  78  	}
  79  
  80  	// Connect and immediately close — tests upgrade handshake.
  81  	relay := "wss://relay.damus.io"
  82  	c, err := Dial(relay)
  83  	if err != nil {
  84  		t.Fatalf("dial: %v", err)
  85  	}
  86  	c.Close()
  87  }
  88