Skip to content

Commit 8ba2f83

Browse files
Fix documentation for client error As-ability, and add tests (#369)
Fixes #368. I wrote some tests to convince myself of the behavior (indeed it's as the issue describes), and refactored the client tests a bit while in the area.
1 parent 6010b63 commit 8ba2f83

File tree

2 files changed

+41
-37
lines changed

2 files changed

+41
-37
lines changed

docs/client_config.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ return resp.User.Name, err
140140

141141
// handle different errors differently:
142142
resp, err := getUser(...)
143-
var errList *gqlerror.List
143+
var errList gqlerror.List
144144
if errors.As(err, &errList) {
145145
for _, err := range errList {
146146
fmt.Printf("%v at %v\n", err.Message, err.Path)

graphql/client_test.go

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,34 @@ import (
1212
"github.com/vektah/gqlparser/v2/gqlerror"
1313
)
1414

15-
func TestMakeRequest_HTTPError(t *testing.T) {
15+
func makeServer(t *testing.T, responseCode int, responseBody any) *httptest.Server {
16+
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
17+
w.WriteHeader(responseCode)
18+
err := json.NewEncoder(w).Encode(responseBody)
19+
if err != nil {
20+
t.Fatalf("Failed to write response: %v", err)
21+
}
22+
}))
23+
}
24+
25+
func makeRequest(server *httptest.Server) (*Response, error) {
26+
client := NewClient(server.URL, server.Client())
27+
req := &Request{Query: "query { test }"}
28+
resp := &Response{}
29+
30+
err := client.MakeRequest(context.Background(), req, resp)
31+
return resp, err
32+
}
33+
34+
func TestMakeRequestHTTPError(t *testing.T) {
1635
testCases := []struct {
1736
expectedError *HTTPError
1837
serverResponseBody any
1938
name string
2039
serverResponseCode int
2140
}{
2241
{
23-
name: "plain_text_error",
42+
name: "PlainTextError",
2443
serverResponseCode: http.StatusBadRequest,
2544
serverResponseBody: "Bad Request",
2645
expectedError: &HTTPError{
@@ -35,7 +54,7 @@ func TestMakeRequest_HTTPError(t *testing.T) {
3554
},
3655
},
3756
{
38-
name: "json_error_with_extensions",
57+
name: "JSONErrorWithExtensions",
3958
serverResponseCode: http.StatusTooManyRequests,
4059
serverResponseBody: Response{
4160
Errors: gqlerror.List{
@@ -65,22 +84,9 @@ func TestMakeRequest_HTTPError(t *testing.T) {
6584

6685
for _, tc := range testCases {
6786
t.Run(tc.name, func(t *testing.T) {
68-
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
69-
w.WriteHeader(tc.serverResponseCode)
70-
err := json.NewEncoder(w).Encode(tc.serverResponseBody)
71-
if err != nil {
72-
t.Fatalf("Failed to write response: %v", err)
73-
}
74-
}))
87+
server := makeServer(t, tc.serverResponseCode, tc.serverResponseBody)
7588
defer server.Close()
76-
77-
client := NewClient(server.URL, server.Client())
78-
req := &Request{
79-
Query: "query { test }",
80-
}
81-
resp := &Response{}
82-
83-
err := client.MakeRequest(context.Background(), req, resp)
89+
_, err := makeRequest(server)
8490

8591
assert.Error(t, err)
8692
var httpErr *HTTPError
@@ -90,27 +96,25 @@ func TestMakeRequest_HTTPError(t *testing.T) {
9096
}
9197
}
9298

93-
func TestMakeRequest_Success(t *testing.T) {
94-
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
95-
w.WriteHeader(http.StatusOK)
96-
err := json.NewEncoder(w).Encode(map[string]interface{}{
97-
"data": map[string]string{
98-
"test": "success",
99-
},
100-
})
101-
if err != nil {
102-
t.Fatalf("Failed to encode response: %v", err)
103-
}
104-
}))
99+
func TestMakeRequestHTTPErrors(t *testing.T) {
100+
server := makeServer(t, http.StatusOK, Response{
101+
Errors: gqlerror.List{&gqlerror.Error{Message: "Rate limit exceeded"}},
102+
})
105103
defer server.Close()
104+
_, err := makeRequest(server)
106105

107-
client := NewClient(server.URL, server.Client())
108-
req := &Request{
109-
Query: "query { test }",
110-
}
111-
resp := &Response{}
106+
assert.Error(t, err)
107+
var gqlErr gqlerror.List
108+
assert.True(t, errors.As(err, &gqlErr), "Error should be of type *gqlerror.List")
109+
assert.Equal(t, gqlerror.List{&gqlerror.Error{Message: "Rate limit exceeded"}}, gqlErr)
110+
}
112111

113-
err := client.MakeRequest(context.Background(), req, resp)
112+
func TestMakeRequestSuccess(t *testing.T) {
113+
server := makeServer(t, http.StatusOK, map[string]interface{}{
114+
"data": map[string]string{"test": "success"},
115+
})
116+
defer server.Close()
117+
resp, err := makeRequest(server)
114118

115119
assert.NoError(t, err)
116120
assert.Equal(t, map[string]interface{}{"test": "success"}, resp.Data)

0 commit comments

Comments
 (0)