Skip to content

Commit 5465404

Browse files
committed
make Do use Raw
1 parent 6cc4b20 commit 5465404

File tree

2 files changed

+87
-23
lines changed

2 files changed

+87
-23
lines changed

client.go

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"context"
66
"encoding/json"
7+
"errors"
78
"fmt"
89
"io"
910
"net/http"
@@ -41,38 +42,24 @@ func NewClient(gqlEndpoint string, opt *ClientOpts) *Client {
4142
return c
4243
}
4344

44-
func (c *Client) Do(ctx context.Context, q Queryable) (*bytes.Buffer, error) {
45-
reqObj := graphqlRequest{
46-
Query: q.Query(),
47-
Variables: q.Variables(),
48-
}
49-
50-
var reqBytes bytes.Buffer
51-
err := json.NewEncoder(&reqBytes).Encode(&reqObj)
52-
if err != nil {
53-
return nil, err
54-
}
55-
req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.endpoint, &reqBytes)
56-
if err != nil {
57-
return nil, err
58-
}
59-
60-
req.Header.Add("Content-Type", "application/json")
61-
for key, value := range c.headers {
62-
req.Header.Add(key, value)
63-
}
45+
var (
46+
ErrHTTPRedirect = errors.New("redirected request with http status code")
47+
ErrHTTPFailedStatus = errors.New("error response with http status code")
48+
)
6449

65-
resp, err := c.httpClient.Do(req)
50+
// Do performs a gql query and returns early if faced with a non-successful http status code.
51+
func (c *Client) Do(ctx context.Context, q Queryable) (*bytes.Buffer, error) {
52+
resp, err := c.Raw(ctx, q)
6653
if err != nil {
6754
return nil, err
6855
}
6956
defer resp.Body.Close()
7057

7158
switch {
7259
case resp.StatusCode > 299 && resp.StatusCode < 399:
73-
return nil, fmt.Errorf("redirected request with http status code: %d", resp.StatusCode)
60+
return nil, fmt.Errorf("%w: %d", ErrHTTPRedirect, resp.StatusCode)
7461
case resp.StatusCode > 399:
75-
return nil, fmt.Errorf("error response with http status code: %d", resp.StatusCode)
62+
return nil, fmt.Errorf("%w: %d", ErrHTTPFailedStatus, resp.StatusCode)
7663
}
7764

7865
var respBytes bytes.Buffer

client_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package eywa_test
33
import (
44
"bytes"
55
"context"
6+
"errors"
67
"io"
78
"net/http"
89
"net/http/httptest"
@@ -24,6 +25,82 @@ func (m *MockQuerable) Variables() map[string]interface{} {
2425
return m.Vars
2526
}
2627

28+
func TestDoClient(t *testing.T) {
29+
tt := []struct {
30+
name string
31+
server *httptest.Server
32+
expectedErr error
33+
expectedResponse []byte
34+
}{
35+
{
36+
name: "Valid GQL response",
37+
server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
38+
w.WriteHeader(http.StatusOK)
39+
w.Write([]byte(`{"data": {"test": "test"}}`))
40+
})),
41+
expectedResponse: []byte(`{"data": {"test": "test"}}`),
42+
},
43+
{
44+
name: "A 401 response",
45+
server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
46+
w.WriteHeader(http.StatusUnauthorized)
47+
w.Write([]byte(`{"error": {"message": "unauthorized"}}`))
48+
})),
49+
expectedErr: eywa.ErrHTTPFailedStatus,
50+
},
51+
{
52+
name: "A 403 response",
53+
server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
54+
w.WriteHeader(http.StatusUnauthorized)
55+
w.Write([]byte(`{"error": {"message": "forbidden"}}`))
56+
})),
57+
expectedErr: eywa.ErrHTTPFailedStatus,
58+
},
59+
{
60+
name: "A 503 non-json response",
61+
server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
62+
w.WriteHeader(http.StatusServiceUnavailable)
63+
w.Write([]byte(`Service unavailable`))
64+
})),
65+
expectedErr: eywa.ErrHTTPFailedStatus,
66+
},
67+
{
68+
name: "A 301 Redirect",
69+
server: httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
70+
w.WriteHeader(http.StatusMovedPermanently)
71+
w.Write([]byte(`Moved Permanently`))
72+
})),
73+
expectedErr: eywa.ErrHTTPRedirect,
74+
},
75+
}
76+
77+
for _, tc := range tt {
78+
t.Run(tc.name, func(t *testing.T) {
79+
gqlClient := eywa.NewClient(tc.server.URL, nil)
80+
resp, err := gqlClient.Do(context.TODO(), &MockQuerable{})
81+
if err != nil && tc.expectedErr == nil {
82+
t.Errorf("Expected no error, got %v", err)
83+
return
84+
}
85+
if err == nil && tc.expectedErr != nil {
86+
t.Errorf("Expected error %v, got nil", tc.expectedErr)
87+
return
88+
}
89+
if err != nil && tc.expectedErr != nil {
90+
if !errors.Is(err, tc.expectedErr) {
91+
t.Errorf("Expected error %v, got %v", tc.expectedErr, err)
92+
return
93+
}
94+
return
95+
}
96+
if !bytes.Equal(tc.expectedResponse, resp.Bytes()) {
97+
t.Errorf("Expected response %s, got %s", string(tc.expectedResponse), resp.String())
98+
return
99+
}
100+
})
101+
}
102+
}
103+
27104
func TestRawClient(t *testing.T) {
28105
tt := []struct {
29106
name string

0 commit comments

Comments
 (0)