event_test.mx raw
1 package event
2
3 import (
4 "bytes"
5 "crypto/sha256"
6 "testing"
7
8 "git.smesh.lol/nostr/pkg/signer/p8k"
9 "git.smesh.lol/nostr/pkg/tag"
10 "git.smesh.lol/nostr/pkg/timestamp"
11 )
12
13 func TestSignVerifyEvent(t *testing.T) {
14 kg := p8k.MustNew()
15 if gerr := kg.Generate(); gerr != nil {
16 t.Fatal(gerr)
17 }
18
19 evA := &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 serr := evA.Sign(kg); serr != nil {
26 t.Fatal(serr)
27 }
28
29 // ID should be SHA256 of canonical form.
30 canonA := evA.ToCanonical(nil)
31 hA := sha256.Sum256(canonA)
32 if !bytes.Equal(hA[:], evA.ID) {
33 t.Fatal("event ID mismatch")
34 }
35
36 // Verify signature.
37 validA, verrA := evA.Verify()
38 if verrA != nil {
39 t.Fatal(verrA)
40 }
41 if !validA {
42 t.Fatal("signature verification failed")
43 }
44 }
45
46 func TestMarshalUnmarshalRoundTrip(t *testing.T) {
47 kg2 := p8k.MustNew()
48 if gerr2 := kg2.Generate(); gerr2 != nil {
49 t.Fatal(gerr2)
50 }
51
52 evB := &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 serrB := evB.Sign(kg2); serrB != nil {
59 t.Fatal(serrB)
60 }
61
62 // Marshal to JSON.
63 rawB := evB.Marshal(nil)
64
65 // Unmarshal back.
66 evB2 := New()
67 if _, uerrB := evB2.Unmarshal(rawB); uerrB != nil {
68 t.Fatalf("unmarshal failed: %s", uerrB)
69 }
70
71 if !bytes.Equal(evB.ID, evB2.ID) {
72 t.Fatal("ID mismatch after round-trip")
73 }
74 if !bytes.Equal(evB.Pubkey, evB2.Pubkey) {
75 t.Fatal("Pubkey mismatch")
76 }
77 if evB.CreatedAt != evB2.CreatedAt {
78 t.Fatal("CreatedAt mismatch")
79 }
80 if evB.Kind != evB2.Kind {
81 t.Fatal("Kind mismatch")
82 }
83 if !bytes.Equal(evB.Content, evB2.Content) {
84 t.Fatalf("Content mismatch: %s vs %s", evB.Content, evB2.Content)
85 }
86 if !bytes.Equal(evB.Sig, evB2.Sig) {
87 t.Fatal("Sig mismatch")
88 }
89
90 // Verify the deserialized event.
91 validB, verrB := evB2.Verify()
92 if verrB != nil {
93 t.Fatal(verrB)
94 }
95 if !validB {
96 t.Fatal("deserialized event verification failed")
97 }
98 }
99
100 func TestBinaryRoundTrip(t *testing.T) {
101 kg3 := p8k.MustNew()
102 if gerr3 := kg3.Generate(); gerr3 != nil {
103 t.Fatal(gerr3)
104 }
105
106 evC := &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 serrC := evC.Sign(kg3); serrC != nil {
116 t.Fatal(serrC)
117 }
118
119 // Marshal to binary.
120 binC := evC.MarshalBinaryToBytes(nil)
121
122 // Unmarshal from binary.
123 evC2 := New()
124 if uerrC := evC2.UnmarshalBinary(bytes.NewReader(binC)); uerrC != nil {
125 t.Fatalf("binary unmarshal failed: %s", uerrC)
126 }
127
128 if !bytes.Equal(evC.ID, evC2.ID) {
129 t.Fatal("ID mismatch in binary round-trip")
130 }
131 if !bytes.Equal(evC.Sig, evC2.Sig) {
132 t.Fatal("Sig mismatch in binary round-trip")
133 }
134 if !bytes.Equal(evC.Content, evC2.Content) {
135 t.Fatal("Content mismatch in binary round-trip")
136 }
137 }
138