Skip to content

Commit

Permalink
mockTests fixes and client improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
iamyashrs committed Apr 1, 2018
1 parent 667282c commit f017535
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 40 deletions.
48 changes: 18 additions & 30 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"io"
"io/ioutil"
"net/http"
"net/http/httputil"
"net/url"
"path"
"time"
Expand Down Expand Up @@ -84,47 +83,36 @@ func (c Client) Do(r Requester, intoPtr interface{}) error {
defer func() {
// Read the body if small so underlying TCP connection will be re-used.
// No need to check for errors: if it fails, Transport won't reuse it anyway.
const maxBodySlurpSize = 2 << 10
if rsp.ContentLength == -1 || rsp.ContentLength <= maxBodySlurpSize {
io.CopyN(ioutil.Discard, rsp.Body, maxBodySlurpSize)
if rsp.Body != nil {
const maxBodySlurpSize = 2 << 10
if rsp.ContentLength == -1 || rsp.ContentLength <= maxBodySlurpSize {
io.CopyN(ioutil.Discard, rsp.Body, maxBodySlurpSize)
}
rsp.Body.Close()
}
rsp.Body.Close()
}()

body, _ := httputil.DumpResponse(rsp, true)
err = json.NewDecoder(rsp.Body).Decode(intoPtr)

if rsp.StatusCode != http.StatusOK || err != nil {
return ErrAPI{
Header: rsp.Header,
URL: rsp.Request.URL,
StatusCode: rsp.StatusCode,
Body: body,
Err: err,
}
if rsp.StatusCode != http.StatusOK {
return ErrAPI{rsp}
}

return nil
return errors.Wrap(json.NewDecoder(rsp.Body).Decode(intoPtr), "UnmarshalJSON failed")
}

// ErrAPI is returned by API calls when the response status code isn't 200.
type ErrAPI struct {
StatusCode int
Header http.Header
URL *url.URL
Body []byte
Err error
Response *http.Response
}

// Error implements the error interface.
func (err ErrAPI) Error() string {
errStr := fmt.Sprintf("request to %s returned %d (%s)", err.URL,
err.StatusCode, http.StatusText(err.StatusCode))

errStr += fmt.Sprintf("\nerror: %+v", err.Err)

if err.Body != nil {
errStr += fmt.Sprintf("\nresponse:\n\n%s\n", err.Body)
func (err ErrAPI) Error() (errStr string) {
if err.Response != nil {
errStr += fmt.Sprintf(
"request to %s returned %d (%s)",
err.Response.Request.URL,
err.Response.StatusCode,
http.StatusText(err.Response.StatusCode),
)
}
return errStr
}
Expand Down
41 changes: 37 additions & 4 deletions client_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package rail_test

import (
"bytes"
"io/ioutil"
"net/http"
"net/url"
"strings"
Expand Down Expand Up @@ -54,13 +56,37 @@ func TestClientDo(t *testing.T) {
{
inputRequester: mockRequester{true},
inputIntoPtr: temp,
expected: "invalid character 'I' looking for beginning of value",
expected: "UnmarshalJSON failed",

setup: func() {
c.HTTPClient = &http.Client{}
c.HTTPClient.Transport = loaderTransport{
testServer.String() + "/Invalid.txt",
}
c.HTTPClient.Transport = mockTransport(
func(r *http.Request) (*http.Response, error) {
return &http.Response{
StatusCode: http.StatusOK,
Body: ioutil.NopCloser(bytes.NewBufferString("Boom")),
Request: &http.Request{URL: url},
}, nil
},
)
},
clear: func() { c.HTTPClient = nil },
},
{
inputRequester: mockRequester{true},
inputIntoPtr: temp,
expected: "request to",

setup: func() {
c.HTTPClient = &http.Client{}
c.HTTPClient.Transport = mockTransport(
func(r *http.Request) (*http.Response, error) {
return &http.Response{
StatusCode: http.StatusForbidden,
Request: &http.Request{URL: url},
}, nil
},
)
},
clear: func() { c.HTTPClient = nil },
},
Expand Down Expand Up @@ -92,3 +118,10 @@ func (r mockRequester) Request() (*http.Request, error) {
}
return nil, errors.New("error")
}

// loaderTransport loads response passed
type mockTransport func(*http.Request) (*http.Response, error)

func (mt mockTransport) RoundTrip(r *http.Request) (*http.Response, error) {
return mt(r)
}
8 changes: 3 additions & 5 deletions rail_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,7 @@ func testClient(c *rail.Client, t *testing.T) {
return
}

c.HTTPClient.Transport = &loaderTransport{
filepath: testServer.String() + "/" + filename(t),
}
c.HTTPClient.Transport = &loaderTransport{t}
return
}

Expand Down Expand Up @@ -92,10 +90,10 @@ func (st saverTransport) RoundTrip(r *http.Request) (*http.Response, error) {
}

// loaderTransport loads response from testdata file
type loaderTransport struct{ filepath string }
type loaderTransport struct{ t *testing.T }

func (lt loaderTransport) RoundTrip(r *http.Request) (*http.Response, error) {
return http.Get(lt.filepath)
return http.Get(testServer.String() + "/" + filename(lt.t))
}

func filename(t *testing.T) string {
Expand Down
1 change: 0 additions & 1 deletion testdata/Invalid.txt

This file was deleted.

0 comments on commit f017535

Please sign in to comment.