package jttp_test import ( "fmt" "net/http" "net/http/httptest" "net/url" "testing" "github.com/stretchr/testify/require" "git.samanthony.xyz/jttp" ) type Person struct { Name string Age int } func TestDo(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, `{"name": "Alice", "age": 123}`) })) defer srv.Close() clnt := jttp.NewClient(srv.Client()) url, err := url.Parse(srv.URL) require.NoError(t, err) req := &http.Request{Method: http.MethodGet, URL: url} var alice Person err = clnt.Do(req, http.StatusOK, &alice) require.NoError(t, err) require.Equal(t, Person{"Alice", 123}, alice) } func TestDoReqFail(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.Error(w, "", http.StatusInternalServerError) })) defer srv.Close() clnt := jttp.NewClient(srv.Client()) url, err := url.Parse(srv.URL) require.NoError(t, err) req := &http.Request{Method: http.MethodGet, URL: url} var alice Person err = clnt.Do(req, http.StatusOK, &alice) require.Error(t, err) require.Equal(t, fmt.Sprintf("jttp: GET %s: 500 Internal Server Error (expected 200)", srv.URL), err.Error()) } func TestDoBadStatus(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(201) fmt.Fprint(w, `{"name": "Alice", "age": 123}`) })) defer srv.Close() clnt := jttp.NewClient(srv.Client()) url, err := url.Parse(srv.URL) require.NoError(t, err) req := &http.Request{Method: http.MethodGet, URL: url} var alice Person err = clnt.Do(req, 200, &alice) require.Error(t, err) require.Equal(t, fmt.Sprintf("jttp: GET %s: 201 Created (expected 200)", srv.URL), err.Error()) } func TestDoDecodeFail(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, `{"name": "Alice", "age": "notanumber"}`) })) defer srv.Close() clnt := jttp.NewClient(srv.Client()) url, err := url.Parse(srv.URL) require.NoError(t, err) req := &http.Request{Method: http.MethodGet, URL: url} var alice Person err = clnt.Do(req, http.StatusOK, &alice) require.Error(t, err) require.Contains(t, err.Error(), "json") require.Contains(t, err.Error(), "Person.Age") }