event_test.mx raw
1 package event
2
3 import (
4 "bytes"
5 "crypto/sha256"
6 "testing"
7
8 "smesh.lol/pkg/nostr/signer/p8k"
9 "smesh.lol/pkg/nostr/tag"
10 "smesh.lol/pkg/nostr/timestamp"
11 )
12
13 func TestSignVerifyEvent(t *testing.T) {
14 signer := p8k.MustNew()
15 if err := signer.Generate(); err != nil {
16 t.Fatal(err)
17 }
18
19 ev := &E{
20 CreatedAt: timestamp.Now().V,
21 Kind: 1,
22 Tags: tag.NewS(tag.NewFromBytesSlice([]byte("p"), []byte("deadbeef"))),
23 Content: []byte("hello nostr from moxie"),
24 }
25 if err := ev.Sign(signer); err != nil {
26 t.Fatal(err)
27 }
28
29 // ID should be SHA256 of canonical form.
30 canonical := ev.ToCanonical(nil)
31 h := sha256.Sum256(canonical)
32 if !bytes.Equal(h[:], ev.ID) {
33 t.Fatal("event ID mismatch")
34 }
35
36 // Verify signature.
37 valid, err := ev.Verify()
38 if err != nil {
39 t.Fatal(err)
40 }
41 if !valid {
42 t.Fatal("signature verification failed")
43 }
44 }
45
46 func TestMarshalUnmarshalRoundTrip(t *testing.T) {
47 signer := p8k.MustNew()
48 if err := signer.Generate(); err != nil {
49 t.Fatal(err)
50 }
51
52 ev := &E{
53 CreatedAt: 1234567890,
54 Kind: 1,
55 Tags: tag.NewS(tag.NewFromBytesSlice([]byte("t"), []byte("test"))),
56 Content: []byte("test message with \"quotes\" and \\backslash"),
57 }
58 if err := ev.Sign(signer); err != nil {
59 t.Fatal(err)
60 }
61
62 // Marshal to JSON.
63 b := ev.Marshal(nil)
64
65 // Unmarshal back.
66 ev2 := New()
67 if _, err := ev2.Unmarshal(b); err != nil {
68 t.Fatalf("unmarshal failed: %v", err)
69 }
70
71 if !bytes.Equal(ev.ID, ev2.ID) {
72 t.Fatal("ID mismatch after round-trip")
73 }
74 if !bytes.Equal(ev.Pubkey, ev2.Pubkey) {
75 t.Fatal("Pubkey mismatch")
76 }
77 if ev.CreatedAt != ev2.CreatedAt {
78 t.Fatal("CreatedAt mismatch")
79 }
80 if ev.Kind != ev2.Kind {
81 t.Fatal("Kind mismatch")
82 }
83 if !bytes.Equal(ev.Content, ev2.Content) {
84 t.Fatalf("Content mismatch: %q vs %q", ev.Content, ev2.Content)
85 }
86 if !bytes.Equal(ev.Sig, ev2.Sig) {
87 t.Fatal("Sig mismatch")
88 }
89
90 // Verify the deserialized event.
91 valid, err := ev2.Verify()
92 if err != nil {
93 t.Fatal(err)
94 }
95 if !valid {
96 t.Fatal("deserialized event verification failed")
97 }
98 }
99
100 func TestBinaryRoundTrip(t *testing.T) {
101 signer := p8k.MustNew()
102 if err := signer.Generate(); err != nil {
103 t.Fatal(err)
104 }
105
106 ev := &E{
107 CreatedAt: 1700000000,
108 Kind: 30023,
109 Tags: tag.NewS(
110 tag.NewFromBytesSlice([]byte("d"), []byte("test-article")),
111 tag.NewFromBytesSlice([]byte("title"), []byte("Test Article")),
112 ),
113 Content: []byte("long form content here"),
114 }
115 if err := ev.Sign(signer); err != nil {
116 t.Fatal(err)
117 }
118
119 // Marshal to binary.
120 binData := ev.MarshalBinaryToBytes(nil)
121
122 // Unmarshal from binary.
123 ev2 := New()
124 if err := ev2.UnmarshalBinary(bytes.NewReader(binData)); err != nil {
125 t.Fatalf("binary unmarshal failed: %v", err)
126 }
127
128 if !bytes.Equal(ev.ID, ev2.ID) {
129 t.Fatal("ID mismatch in binary round-trip")
130 }
131 if !bytes.Equal(ev.Sig, ev2.Sig) {
132 t.Fatal("Sig mismatch in binary round-trip")
133 }
134 if !bytes.Equal(ev.Content, ev2.Content) {
135 t.Fatal("Content mismatch in binary round-trip")
136 }
137 }
138