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}