Skip to content
This repository was archived by the owner on Sep 6, 2025. It is now read-only.

Commit a0b0e0d

Browse files
authored
Merge pull request #17 from hellofresh/patch/fix-crash
PT-3844 Fix crash
2 parents 89e7070 + 0dc031c commit a0b0e0d

File tree

3 files changed

+65
-10
lines changed

3 files changed

+65
-10
lines changed

pkg/zappr/client.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ func (c *clientImpl) doRequest(req *http.Request) (int, *zapprErrorResponse, err
144144
zapprErrorResponse := &zapprErrorResponse{}
145145
resp, err := c.slingClient.Do(req, nil, zapprErrorResponse)
146146

147+
if resp == nil {
148+
// Even though 0 does not seem like a valid http response code
149+
// The status would be ignored by any calling code anyway since a non-nil error is returned
150+
return 0, nil, errwrap.Wrap(ErrZapprServerError, err)
151+
}
152+
147153
if resp.StatusCode == http.StatusUnauthorized {
148154
return resp.StatusCode, nil, ErrZapprUnauthorized
149155
}
@@ -153,7 +159,7 @@ func (c *clientImpl) doRequest(req *http.Request) (int, *zapprErrorResponse, err
153159
return resp.StatusCode, zapprErrorResponse, errwrap.Wrap(errors.New(zapprErrorResponse.Detail), ErrZapprServerError)
154160
}
155161

156-
return resp.StatusCode, nil, ErrZapprServerError
162+
return resp.StatusCode, nil, errwrap.Wrap(ErrZapprServerError, err)
157163
}
158164

159165
return resp.StatusCode, nil, err

pkg/zappr/client_test.go

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func TestAuthWithGithubToken(t *testing.T) {
3232

3333
client.Enable(1)
3434

35-
// Assert expected calls we made to Zappr
35+
// Assert expected calls were made to Zappr
3636
zapprMock.AssertExpectations(t)
3737
}
3838

@@ -58,7 +58,7 @@ func TestAuthWithZapprToken(t *testing.T) {
5858

5959
client.Enable(1)
6060

61-
// Assert expected calls we made to Zappr
61+
// Assert expected calls were made to Zappr
6262
zapprMock.AssertExpectations(t)
6363
}
6464

@@ -94,7 +94,7 @@ func TestArbitraryErrorWithJSONErrorBodyFromZappr(t *testing.T) {
9494
// Assert error detail retured by zappr is in returned error
9595
assert.True(t, errwrap.Contains(err, "Strange error message"), err)
9696

97-
// Assert expected calls we made to Zappr
97+
// Assert expected calls were made to Zappr
9898
zapprMock.AssertExpectations(t)
9999
}
100100

@@ -122,7 +122,7 @@ func TestArbitraryErrorWithNonJSONErrorBodyFromZappr(t *testing.T) {
122122
// Assert "unknown zappr" error was returned
123123
assert.True(t, errwrap.Contains(err, ErrZapprServerError.Error()))
124124

125-
// Assert expected calls we made to Zappr
125+
// Assert expected calls were made to Zappr
126126
zapprMock.AssertExpectations(t)
127127
}
128128

@@ -149,7 +149,7 @@ func TestEnable(t *testing.T) {
149149
// Assert no errors were received
150150
assert.Nil(t, err)
151151

152-
// Assert expected calls we made to Zappr
152+
// Assert expected calls were made to Zappr
153153
zapprMock.AssertExpectations(t)
154154
}
155155

@@ -182,7 +182,7 @@ func TestEnable_AlreadyExist(t *testing.T) {
182182
// Assert "already enabled" error was returned
183183
assert.Equal(t, ErrZapprAlreadyEnabled, err)
184184

185-
// Assert expected calls we made to Zappr
185+
// Assert expected calls were made to Zappr
186186
zapprMock.AssertExpectations(t)
187187
}
188188

@@ -209,7 +209,7 @@ func TestDisable(t *testing.T) {
209209
// Assert no errors were received
210210
assert.Nil(t, err)
211211

212-
// Assert expected calls we made to Zappr
212+
// Assert expected calls were made to Zappr
213213
zapprMock.AssertExpectations(t)
214214
}
215215

@@ -242,7 +242,7 @@ func TestDisable_RepoDeletedFromGithub(t *testing.T) {
242242
// Assert "already not enabled" error was returned
243243
assert.Equal(t, ErrZapprAlreadyNotEnabled, err)
244244

245-
// Assert expected calls we made to Zappr
245+
// Assert expected calls were made to Zappr
246246
zapprMock.AssertExpectations(t)
247247
}
248248

@@ -275,6 +275,23 @@ func TestDisable_RepoDeletedFromGithub_AndNotOnZappr(t *testing.T) {
275275
// Assert "already not enabled" error was returned
276276
assert.Equal(t, ErrZapprAlreadyNotEnabled, err)
277277

278-
// Assert expected calls we made to Zappr
278+
// Assert expected calls were made to Zappr
279+
zapprMock.AssertExpectations(t)
280+
}
281+
282+
func TestProblematicRequest(t *testing.T) {
283+
// Get the Zappr Client, Mock Handler and Test Server
284+
client, zapprMock, testServer := NewMockAndHandlerNilResponse()
285+
286+
// Start the test server and stop it when done
287+
testServer.Start()
288+
defer testServer.Close()
289+
290+
err := client.Enable(1)
291+
292+
// Assert "unknown zappr" error was returned
293+
assert.True(t, errwrap.Contains(err, ErrZapprServerError.Error()))
294+
295+
// Assert expected calls were made to Zappr
279296
zapprMock.AssertExpectations(t)
280297
}

pkg/zappr/zappr_mock.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package zappr
22

33
import (
4+
"errors"
45
"fmt"
56
"net/http"
67
"net/url"
@@ -46,13 +47,33 @@ func newMockAndHandler() (*http.Client, *test.MockHandler, *test.Server) {
4647
return httpClient, mockHandler, mockServer
4748
}
4849

50+
func newMockAndHandlerWithNilResponseTransport() (*http.Client, *test.MockHandler, *test.Server) {
51+
mockHandler := &test.MockHandler{}
52+
mockServer := test.NewUnstartedServer(mockHandler)
53+
54+
httpClient := &http.Client{
55+
Transport: &NilResponseTransport{},
56+
}
57+
58+
return httpClient, mockHandler, mockServer
59+
}
60+
4961
// NewMockAndHandler returns a Zappr Client that uses Github Token, Mockhandler, and Server. The client proxies
5062
// requests to the server and handlers can be registered on the mux to handle
5163
// requests. The caller must close the test server.
5264
func NewMockAndHandler() (Client, *test.MockHandler, *test.Server) {
5365
return NewMockAndHandlerWithGithubToken("1234567890")
5466
}
5567

68+
// NewMockAndHandlerNilResponse returns a Zappr Client that uses Github Token, Mockhandler, and Server.
69+
// The internal http client always returns a nil response object.
70+
func NewMockAndHandlerNilResponse() (Client, *test.MockHandler, *test.Server) {
71+
httpClient, mockHandler, mockServer := newMockAndHandlerWithNilResponseTransport()
72+
client := NewWithGithubToken("https://fake.zappr/", "1234567890", httpClient)
73+
74+
return client, mockHandler, mockServer
75+
}
76+
5677
// NewMockAndHandlerWithGithubToken returns a Zappr Client that uses Github Token, Mockhandler, and Server. The client proxies
5778
// requests to the server and handlers can be registered on the mux to handle
5879
// requests. The caller must close the test server.
@@ -88,3 +109,14 @@ func (t *RewriteTransport) RoundTrip(req *http.Request) (*http.Response, error)
88109
}
89110
return t.Transport.RoundTrip(req)
90111
}
112+
113+
// NilResponseTransport always returns a nil response object
114+
type NilResponseTransport struct {
115+
Transport http.RoundTripper
116+
}
117+
118+
// RoundTrip rewrites the request scheme to http and calls through to the
119+
// composed RoundTripper or if it is nil, to the http.DefaultTransport.
120+
func (t *NilResponseTransport) RoundTrip(req *http.Request) (*http.Response, error) {
121+
return nil, errors.New("some error")
122+
}

0 commit comments

Comments
 (0)