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}