client_test.go raw

   1  package nostr
   2  
   3  import (
   4  	"context"
   5  	"testing"
   6  	"time"
   7  )
   8  
   9  func TestClientLiveRelay(t *testing.T) {
  10  	if testing.Short() {
  11  		t.Skip("skipping live relay test in short mode")
  12  	}
  13  
  14  	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  15  	defer cancel()
  16  
  17  	// Connect to ORLY relay.
  18  	client, err := Connect(ctx, "wss://relay.orly.dev")
  19  	if err != nil {
  20  		t.Fatalf("connect: %v", err)
  21  	}
  22  	defer client.Disconnect()
  23  
  24  	// Start listening in background.
  25  	listenErr := make(chan error, 1)
  26  	go func() {
  27  		listenErr <- client.Listen(ctx)
  28  	}()
  29  
  30  	// Subscribe to recent kind 1 events with a limit.
  31  	limit := 5
  32  	err = client.Subscribe(ctx, "test-sub", Filter{
  33  		Kinds: []int{1},
  34  		Limit: &limit,
  35  	})
  36  	if err != nil {
  37  		t.Fatalf("subscribe: %v", err)
  38  	}
  39  
  40  	// Collect events.
  41  	var events []*Event
  42  	timeout := time.After(8 * time.Second)
  43  	for len(events) < limit {
  44  		select {
  45  		case ev := <-client.Events:
  46  			events = append(events, ev)
  47  			t.Logf("event: kind=%d pubkey=%s...%s content=%.40s",
  48  				ev.Kind, ev.Pubkey[:8], ev.Pubkey[56:], ev.Content)
  49  		case <-timeout:
  50  			t.Logf("timeout after receiving %d events", len(events))
  51  			goto done
  52  		}
  53  	}
  54  done:
  55  
  56  	if len(events) == 0 {
  57  		t.Fatal("received no events from relay")
  58  	}
  59  
  60  	// All events should be valid (they passed validation in Listen).
  61  	for i, ev := range events {
  62  		if !ev.ValidID() {
  63  			t.Errorf("event %d: invalid ID", i)
  64  		}
  65  		if !ev.ValidSig() {
  66  			t.Errorf("event %d: invalid signature", i)
  67  		}
  68  	}
  69  
  70  	t.Logf("received and validated %d events", len(events))
  71  }
  72