main
1package serde
2
3import (
4 "bytes"
5 "strings"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10)
11
12func TestFrom(t *testing.T) {
13 type Example struct {
14 Key string `json:"key" jsonapi:"primary,examples" yaml:"key"`
15 Value string `json:"value" jsonapi:"attr,value" yaml:"value"`
16 }
17
18 t.Run("parses a single item from JSON data", func(t *testing.T) {
19 body := strings.NewReader(`{"key":"my-key","value":"my-value"}`)
20
21 result, err := From[Example](body, JSON)
22
23 require.NoError(t, err)
24 assert.Equal(t, "my-key", result.Key)
25 assert.Equal(t, "my-value", result.Value)
26 })
27
28 t.Run("parses a single *item from JSON data", func(t *testing.T) {
29 body := strings.NewReader(`{"key":"my-key","value":"my-value"}`)
30
31 result, err := From[*Example](body, JSON)
32
33 require.NoError(t, err)
34 assert.Equal(t, "my-key", result.Key)
35 assert.Equal(t, "my-value", result.Value)
36 })
37
38 t.Run("parses a slices of items from JSON data", func(t *testing.T) {
39 body := strings.NewReader(`[{"key":"my-key","value":"my-value"}]`)
40
41 results, err := From[[]Example](body, JSON)
42
43 require.NoError(t, err)
44 require.Equal(t, 1, len(results))
45 assert.Equal(t, "my-key", results[0].Key)
46 assert.Equal(t, "my-value", results[0].Value)
47 })
48
49 t.Run("parses a slices of *items from JSON data", func(t *testing.T) {
50 body := strings.NewReader(`[{"key":"my-key","value":"my-value"}]`)
51
52 results, err := From[[]*Example](body, JSON)
53
54 require.NoError(t, err)
55 require.Equal(t, 1, len(results))
56 assert.Equal(t, "my-key", results[0].Key)
57 assert.Equal(t, "my-value", results[0].Value)
58 })
59
60 t.Run("parses a single item from JSON API data", func(t *testing.T) {
61 body := strings.NewReader(`{"data":{"type":"examples","id":"my-key","attributes":{"value":"my-value"}}}`)
62
63 result, err := From[Example](body, JSONAPI)
64
65 require.NoError(t, err)
66 assert.Equal(t, "my-key", result.Key)
67 assert.Equal(t, "my-value", result.Value)
68 })
69
70 t.Run("parses a single *item from JSON API data", func(t *testing.T) {
71 body := strings.NewReader(`{"data":{"type":"examples","id":"my-key","attributes":{"value":"my-value"}}}`)
72
73 result, err := From[*Example](body, JSONAPI)
74
75 require.NoError(t, err)
76 assert.Equal(t, "my-key", result.Key)
77 assert.Equal(t, "my-value", result.Value)
78 })
79
80 t.Run("parses a slice of items from JSON API data", func(t *testing.T) {
81 t.Skip()
82 body := strings.NewReader(`{"data":[{"type":"examples","id":"my-key","attributes":{"value":"my-value"}}]}`)
83
84 results, err := From[[]Example](body, JSONAPI)
85
86 require.NoError(t, err)
87 require.Equal(t, 1, len(results))
88 assert.Equal(t, "my-key", results[0].Key)
89 assert.Equal(t, "my-value", results[0].Value)
90 })
91
92 t.Run("parses a slice of *items from JSON API data", func(t *testing.T) {
93 body := strings.NewReader(`{"data":[{"type":"examples","id":"my-key","attributes":{"value":"my-value"}}]}`)
94
95 results, err := From[[]*Example](body, JSONAPI)
96
97 require.NoError(t, err)
98 require.Equal(t, 1, len(results))
99 assert.Equal(t, "my-key", results[0].Key)
100 assert.Equal(t, "my-value", results[0].Value)
101 })
102
103 t.Run("parses a single item from YAML data", func(t *testing.T) {
104 body := strings.NewReader(`key: "my-key"
105value: "my-value"
106`)
107
108 result, err := From[Example](body, YAML)
109
110 require.NoError(t, err)
111 assert.Equal(t, "my-key", result.Key)
112 assert.Equal(t, "my-value", result.Value)
113 })
114}
115
116func TestTo(t *testing.T) {
117 type Example struct {
118 Key string `json:"key" jsonapi:"primary,examples"`
119 Value string `json:"value" jsonapi:"attr,value"`
120 }
121
122 t.Run("serializes an item to JSON", func(t *testing.T) {
123 w := bytes.NewBuffer(nil)
124 require.NoError(t, To[Example](w, Example{
125 Key: "my-key",
126 Value: "my-value",
127 }, JSON))
128 expected := `{
129 "key": "my-key",
130 "value": "my-value"
131}
132`
133 assert.Equal(t, expected, w.String())
134 })
135
136 t.Run("serializes an *item to JSON", func(t *testing.T) {
137 w := bytes.NewBuffer(nil)
138 require.NoError(t, To[*Example](w, &Example{
139 Key: "my-key",
140 Value: "my-value",
141 }, JSON))
142 expected := `{
143 "key": "my-key",
144 "value": "my-value"
145}
146`
147 assert.Equal(t, expected, w.String())
148 })
149
150 t.Run("serializes items to JSON", func(t *testing.T) {
151 w := bytes.NewBuffer(nil)
152 require.NoError(t, To(w, []Example{{
153 Key: "my-key",
154 Value: "my-value",
155 }}, JSON))
156 expected := `[
157 {
158 "key": "my-key",
159 "value": "my-value"
160 }
161]
162`
163 assert.Equal(t, expected, w.String())
164 })
165
166 t.Run("serializes *items to JSON", func(t *testing.T) {
167 w := bytes.NewBuffer(nil)
168 require.NoError(t, To(w, []*Example{{
169 Key: "my-key",
170 Value: "my-value",
171 }}, JSON))
172 expected := `[
173 {
174 "key": "my-key",
175 "value": "my-value"
176 }
177]
178`
179 assert.Equal(t, expected, w.String())
180 })
181
182 t.Run("serializes an item to JSON API", func(t *testing.T) {
183 w := bytes.NewBuffer(nil)
184 require.NoError(t, To[Example](w, Example{
185 Key: "my-key",
186 Value: "my-value",
187 }, JSONAPI))
188 expected := `{"data":{"type":"examples","id":"my-key","attributes":{"value":"my-value"}}}
189`
190 assert.Equal(t, expected, w.String())
191 })
192
193 t.Run("serializes an *item to JSON API", func(t *testing.T) {
194 w := bytes.NewBuffer(nil)
195 require.NoError(t, To[*Example](w, &Example{
196 Key: "my-key",
197 Value: "my-value",
198 }, JSONAPI))
199 expected := `{"data":{"type":"examples","id":"my-key","attributes":{"value":"my-value"}}}
200`
201 assert.Equal(t, expected, w.String())
202 })
203
204 t.Run("serializes a slice of items to JSON API", func(t *testing.T) {
205 w := bytes.NewBuffer(nil)
206 require.NoError(t, To[[]Example](w, []Example{{
207 Key: "my-key",
208 Value: "my-value",
209 }}, JSONAPI))
210 expected := `{"data":[{"type":"examples","id":"my-key","attributes":{"value":"my-value"}}]}
211`
212 assert.Equal(t, expected, w.String())
213 })
214
215 t.Run("serializes a slice of *items to JSON API", func(t *testing.T) {
216 w := bytes.NewBuffer(nil)
217 require.NoError(t, To[[]*Example](w, []*Example{{
218 Key: "my-key",
219 Value: "my-value",
220 }}, JSONAPI))
221 expected := `{"data":[{"type":"examples","id":"my-key","attributes":{"value":"my-value"}}]}
222`
223 assert.Equal(t, expected, w.String())
224 })
225
226 t.Run("serializes an item to YAML", func(t *testing.T) {
227 w := bytes.NewBuffer(nil)
228 require.NoError(t, To[Example](w, Example{
229 Key: "my-key",
230 Value: "my-value",
231 }, YAML))
232 expected := `key: my-key
233value: my-value
234`
235 assert.Equal(t, expected, w.String())
236 })
237}