diff --git a/error.go b/error.go index 7b72894..0cb8c4b 100644 --- a/error.go +++ b/error.go @@ -19,6 +19,10 @@ type Error struct { // NewJiraError creates a new jira Error func NewJiraError(resp *Response, httpError error) error { + if resp == nil { + return errors.Wrap(httpError, "No response returned") + } + defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { @@ -28,7 +32,8 @@ func NewJiraError(resp *Response, httpError error) error { jerr := Error{HTTPError: httpError} err = json.Unmarshal(body, &jerr) if err != nil { - return errors.Wrap(err, err.Error()) + httpError = errors.Wrap(errors.New("Could not parse JSON"), httpError.Error()) + return errors.Wrap(err, httpError.Error()) } return &jerr diff --git a/error_test.go b/error_test.go index 993feb1..89afcf0 100644 --- a/error_test.go +++ b/error_test.go @@ -29,6 +29,38 @@ func TestError_NewJiraError(t *testing.T) { } } +func TestError_NoResponse(t *testing.T) { + err := NewJiraError(nil, errors.New("Original http error")) + + msg := err.Error() + if !strings.Contains(msg, "Original http error") { + t.Errorf("Expected the original error message: Got\n%s\n", msg) + } + + if !strings.Contains(msg, "No response") { + t.Errorf("Expected the 'No response' error message: Got\n%s\n", msg) + } +} + +func TestError_NoJSON(t *testing.T) { + setup() + defer teardown() + + testMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprint(w, `Not JSON`) + }) + + req, _ := testClient.NewRequest("GET", "/", nil) + resp, _ := testClient.Do(req, nil) + + err := NewJiraError(resp, errors.New("Original http error")) + msg := err.Error() + + if !strings.Contains(msg, "Could not parse JSON") { + t.Errorf("Expected the 'Could not parse JSON' error message: Got\n%s\n", msg) + } +} + func TestError_NilOriginalMessage(t *testing.T) { defer func() { if r := recover(); r != nil {