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