encode_embedded_json_test.go (3838B)
1 package gojay 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 ) 9 10 func (r *Request) MarshalJSONObject(enc *Encoder) { 11 enc.AddStringKey("id", r.id) 12 enc.AddStringKey("method", r.method) 13 enc.AddEmbeddedJSONKey("params", &r.params) 14 params2 := EmbeddedJSON([]byte(``)) 15 enc.AddEmbeddedJSONKeyOmitEmpty("params2", ¶ms2) 16 params3 := EmbeddedJSON([]byte(`"test"`)) 17 enc.AddEmbeddedJSONKeyOmitEmpty("params3", ¶ms3) 18 enc.AddIntKey("more", r.more) 19 } 20 21 func (r *Request) IsNil() bool { 22 return r == nil 23 } 24 25 type EmbeddedJSONArr []EmbeddedJSON 26 27 func (ear EmbeddedJSONArr) MarshalJSONArray(enc *Encoder) { 28 for _, e := range ear { 29 enc.AddEmbeddedJSON(&e) 30 } 31 } 32 33 func (ear EmbeddedJSONArr) IsNil() bool { 34 return len(ear) == 0 35 } 36 37 type EmbeddedJSONOmitEmptyArr []EmbeddedJSON 38 39 func (ear EmbeddedJSONOmitEmptyArr) MarshalJSONArray(enc *Encoder) { 40 for _, e := range ear { 41 enc.AddEmbeddedJSONOmitEmpty(&e) 42 } 43 } 44 45 func (ear EmbeddedJSONOmitEmptyArr) IsNil() bool { 46 return len(ear) == 0 47 } 48 49 func TestEncodingEmbeddedJSON(t *testing.T) { 50 t.Run("basic-embedded-json", func(t *testing.T) { 51 ej := EmbeddedJSON([]byte(`"test"`)) 52 b := &strings.Builder{} 53 enc := BorrowEncoder(b) 54 err := enc.Encode(&ej) 55 assert.Nil(t, err, "err should be nil") 56 assert.Equal(t, b.String(), `"test"`, "b should be equal to content of EmbeddedJSON") 57 }) 58 t.Run("basic-embedded-json-marshal-api", func(t *testing.T) { 59 ej := EmbeddedJSON([]byte(`"test"`)) 60 b, err := Marshal(&ej) 61 assert.Nil(t, err, "err should be nil") 62 assert.Equal(t, string(b), `"test"`, "b should be equal to content of EmbeddedJSON") 63 }) 64 t.Run("object-embedded-json", func(t *testing.T) { 65 req := Request{ 66 id: "test", 67 method: "GET", 68 params: EmbeddedJSON([]byte(`"test"`)), 69 } 70 b := &strings.Builder{} 71 enc := BorrowEncoder(b) 72 err := enc.EncodeObject(&req) 73 assert.Nil(t, err, "err should be nil") 74 assert.Equal( 75 t, 76 b.String(), 77 `{"id":"test","method":"GET","params":"test","params3":"test","more":0}`, 78 "b should be equal to content of EmbeddedJSON", 79 ) 80 }) 81 t.Run("array-embedded-json", func(t *testing.T) { 82 ear := EmbeddedJSONArr{ 83 []byte(`"test"`), 84 []byte(`{"test":"test"}`), 85 } 86 b := &strings.Builder{} 87 enc := BorrowEncoder(b) 88 err := enc.EncodeArray(ear) 89 assert.Nil(t, err, "err should be nil") 90 assert.Equal( 91 t, 92 b.String(), 93 `["test",{"test":"test"}]`, 94 "b should be equal to content of EmbeddedJSON", 95 ) 96 }) 97 t.Run("array-embedded-json-omit-empty", func(t *testing.T) { 98 ear := EmbeddedJSONOmitEmptyArr{ 99 []byte(`"test"`), 100 []byte(``), 101 []byte(`{"test":"test"}`), 102 []byte(``), 103 []byte(`{"test":"test"}`), 104 } 105 b := &strings.Builder{} 106 enc := BorrowEncoder(b) 107 err := enc.EncodeArray(ear) 108 assert.Nil(t, err, "err should be nil") 109 assert.Equal( 110 t, 111 b.String(), 112 `["test",{"test":"test"},{"test":"test"}]`, 113 "b should be equal to content of EmbeddedJSON", 114 ) 115 }) 116 t.Run("write-error", func(t *testing.T) { 117 w := TestWriterError("") 118 v := EmbeddedJSON([]byte(`"test"`)) 119 enc := NewEncoder(w) 120 err := enc.EncodeEmbeddedJSON(&v) 121 assert.NotNil(t, err, "Error should not be nil") 122 assert.Equal(t, "Test Error", err.Error(), "err.Error() should be 'Test Error'") 123 }) 124 t.Run("pool-error", func(t *testing.T) { 125 v := EmbeddedJSON([]byte(`"test"`)) 126 enc := BorrowEncoder(nil) 127 enc.isPooled = 1 128 defer func() { 129 err := recover() 130 assert.NotNil(t, err, "err shouldnt be nil") 131 assert.IsType(t, InvalidUsagePooledEncoderError(""), err, "err should be of type InvalidUsagePooledEncoderError") 132 assert.Equal(t, "Invalid usage of pooled encoder", err.(InvalidUsagePooledEncoderError).Error(), "err should be of type InvalidUsagePooledDecoderError") 133 }() 134 _ = enc.EncodeEmbeddedJSON(&v) 135 assert.True(t, false, "should not be called as it should have panicked") 136 }) 137 }