event_test.go raw
1 package event
2
3 import (
4 "bufio"
5 "bytes"
6 "testing"
7 "time"
8
9 "encoding/json"
10
11 "next.orly.dev/pkg/nostr/encoders/event/examples"
12 "next.orly.dev/pkg/nostr/encoders/hex"
13 "next.orly.dev/pkg/nostr/encoders/tag"
14 "next.orly.dev/pkg/nostr/utils"
15 "next.orly.dev/pkg/nostr/utils/bufpool"
16 "next.orly.dev/pkg/nostr/utils/units"
17 "next.orly.dev/pkg/lol/chk"
18 "next.orly.dev/pkg/lol/log"
19 "lukechampine.com/frand"
20 )
21
22 func TestMarshalJSONUnmarshalJSON(t *testing.T) {
23 for range 10000 {
24 ev := New()
25 ev.ID = frand.Bytes(32)
26 ev.Pubkey = frand.Bytes(32)
27 ev.CreatedAt = time.Now().Unix()
28 ev.Kind = 1
29 ev.Tags = &tag.S{
30 {T: [][]byte{[]byte("t"), []byte("hashtag")}},
31 {
32 T: [][]byte{
33 []byte("e"),
34 hex.EncAppend(nil, frand.Bytes(32)),
35 },
36 },
37 }
38 ev.Content = []byte(`some text content
39
40 with line breaks and tabs and other stuff
41 `)
42 ev.Sig = frand.Bytes(64)
43 var err error
44 var b []byte
45 if b, err = json.Marshal(ev); chk.E(err) {
46 t.Fatal(err)
47 }
48 var bc []byte
49 bc = append(bc, b...)
50 ev2 := New()
51 if err = json.Unmarshal(b, ev2); chk.E(err) {
52 t.Fatal(err)
53 }
54 var b2 []byte
55 if b2, err = json.Marshal(ev2); err != nil {
56 t.Fatal(err)
57 }
58 if !utils.FastEqual(bc, b2) {
59 t.Errorf("failed to re-marshal back original")
60 }
61 // free up the resources for the next iteration
62 ev.Free()
63 ev2.Free()
64 bufpool.PutBytes(b)
65 bufpool.PutBytes(b2)
66 bufpool.PutBytes(bc)
67 }
68 }
69
70 func TestExamplesCache(t *testing.T) {
71 scanner := bufio.NewScanner(bytes.NewBuffer(examples.Cache))
72 scanner.Buffer(make([]byte, 0, 4*units.Mb), 4*units.Mb)
73 var err error
74 for scanner.Scan() {
75 b := scanner.Bytes()
76 c := bufpool.Get()
77 c = c[:0]
78 c = append(c, b...)
79 // log.I.F("c: %s", c)
80 // log.I.F("b: %s", b)
81 ev := New()
82 if _, err = ev.Unmarshal(c); chk.E(err) {
83 t.Fatal(err)
84 }
85 var b2 []byte
86 // can't use encoding/json.Marshal as it improperly escapes <, > and &.
87 if b2, err = ev.MarshalJSON(); err != nil {
88 t.Fatal(err)
89 }
90 if !utils.FastEqual(c, b2) {
91 log.I.F("\n%s\n%s", c, b2)
92 t.Fatalf("failed to re-marshal back original")
93 }
94 ev.Free()
95 // Don't return scanner.Bytes() to the pool as it's a buffer from embed.
96 // bufpool.PutBytes(b)
97 bufpool.PutBytes(b2)
98 bufpool.PutBytes(c)
99 }
100 }
101