aboutsummaryrefslogtreecommitdiffstats
path: root/jttp_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'jttp_test.go')
-rw-r--r--jttp_test.go84
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")
+}