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