main
1package serde
2
3import (
4 "net/http/httptest"
5 "strings"
6 "testing"
7
8 "github.com/google/jsonapi"
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11)
12
13func TestFromHTTP(t *testing.T) {
14 type input struct {
15 ID string `json:"id" jsonapi:"primary,inputs"`
16 Name string `json:"name" jsonapi:"attr,name"`
17 }
18
19 t.Run("parses a JSON request body by default", func(t *testing.T) {
20 body := strings.NewReader(`{"id":"1","name": "Faux"}`)
21 r := httptest.NewRequest("GET", "/", body)
22
23 item, err := FromHTTP[input](r)
24
25 require.NoError(t, err)
26 assert.NotZero(t, item)
27 assert.Equal(t, "1", item.ID)
28 assert.Equal(t, "Faux", item.Name)
29 })
30
31 t.Run("parses the request body as JSON", func(t *testing.T) {
32 body := strings.NewReader(`{"id":"1","name": "Faux"}`)
33 r := httptest.NewRequest("GET", "/", body)
34 r.Header.Set("Content-Type", "application/json")
35
36 item, err := FromHTTP[input](r)
37
38 require.NoError(t, err)
39 assert.NotZero(t, item)
40 assert.Equal(t, "1", item.ID)
41 assert.Equal(t, "Faux", item.Name)
42 })
43
44 t.Run("parses a JSON API request body", func(t *testing.T) {
45 body := strings.NewReader(`{"data":{"type":"inputs","id":"1","attributes":{"name": "Faux"}}}`)
46 r := httptest.NewRequest("GET", "/", body)
47 r.Header.Set("Content-Type", jsonapi.MediaType)
48
49 item, err := FromHTTP[input](r)
50
51 require.NoError(t, err)
52 assert.NotZero(t, item)
53 assert.Equal(t, "1", item.ID)
54 assert.Equal(t, "Faux", item.Name)
55 })
56}
57
58func TestToHTTP(t *testing.T) {
59 type output struct {
60 ID string `json:"id" jsonapi:"primary,inputs"`
61 Name string `json:"name" jsonapi:"attr,name"`
62 }
63
64 t.Run("serializes the data as JSON by default", func(t *testing.T) {
65 r := httptest.NewRequest("GET", "/", nil)
66 w := httptest.NewRecorder()
67
68 require.NoError(t, ToHTTP[*output](w, r, &output{
69 ID: "2",
70 Name: "Dave East",
71 }))
72
73 result, err := From[output](w.Body, JSON)
74 require.NoError(t, err)
75 assert.Equal(t, "2", result.ID)
76 assert.Equal(t, "Dave East", result.Name)
77 })
78
79 t.Run("serializes the data as JSON when specified in the request Accept header", func(t *testing.T) {
80 r := httptest.NewRequest("GET", "/", nil)
81 r.Header.Set("Accept", "application/json")
82 w := httptest.NewRecorder()
83
84 require.NoError(t, ToHTTP[*output](w, r, &output{
85 ID: "2",
86 Name: "Dave East",
87 }))
88
89 result, err := From[output](w.Body, JSON)
90 require.NoError(t, err)
91 assert.Equal(t, "2", result.ID)
92 assert.Equal(t, "Dave East", result.Name)
93 })
94
95 t.Run("serializes the data as JSON API when specified in the request Accept header", func(t *testing.T) {
96 r := httptest.NewRequest("GET", "/", nil)
97 r.Header.Set("Accept", jsonapi.MediaType)
98 w := httptest.NewRecorder()
99
100 require.NoError(t, ToHTTP[*output](w, r, &output{
101 ID: "2",
102 Name: "Dave East",
103 }))
104
105 result, err := From[output](w.Body, JSONAPI)
106 require.NoError(t, err)
107 assert.Equal(t, "2", result.ID)
108 assert.Equal(t, "Dave East", result.Name)
109 })
110}