diff options
Diffstat (limited to 'jttp_test.go')
| -rw-r--r-- | jttp_test.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/jttp_test.go b/jttp_test.go new file mode 100644 index 0000000..66256c0 --- /dev/null +++ b/jttp_test.go @@ -0,0 +1,84 @@ +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") +} |