github.com/seeker-insurance/kit@v0.0.13/web/error_handler_test.go (about) 1 package web 2 3 import ( 4 "bytes" 5 "fmt" 6 "net/http" 7 "net/http/httptest" 8 "testing" 9 10 "github.com/asaskevich/govalidator" 11 "github.com/labstack/echo" 12 "github.com/lib/pq" 13 "github.com/seeker-insurance/kit/errorlib" 14 "github.com/seeker-insurance/kit/jsonapi" 15 "github.com/stretchr/testify/assert" 16 ) 17 18 const ( 19 someErr errorlib.ErrorString = "some error" 20 ) 21 22 type noContentContext struct { 23 echo.Context 24 } 25 26 func (ctx noContentContext) NoContent(code int) error { 27 return someErr 28 } 29 30 var _ echo.Context = noContentContext{} 31 32 func newContext(method string) echo.Context { 33 req := httptest.NewRequest(method, "http://localhost.com/whatever", new(bytes.Buffer)) 34 rec := httptest.NewRecorder() 35 return echo.New().NewContext(req, rec) 36 } 37 38 func Test_errorHandler(t *testing.T) { 39 ctx := newContext("GET") 40 ctx.Response().Committed = true 41 assert.Equal(t, alreadyCommited, errorHandler(someErr, ctx)) 42 43 noContentCtx := noContentContext{newContext("HEAD")} 44 assert.Equal(t, noContent, errorHandler(someErr, noContentCtx)) 45 46 ctx = newContext("HEAD") 47 var err error = &echo.HTTPError{Code: 1222, Message: "magic error"} 48 assert.Equal(t, methodIsHead, errorHandler(err, ctx)) 49 50 ctx = newContext("GET") 51 assert.Equal(t, nilErr, errorHandler(nil, ctx)) 52 53 ctx = newContext("GET") 54 err = &jsonapi.ErrorObject{Title: "hey", Status: "deliberately not an integer"} 55 assert.Equal(t, problemRendering, errorHandler(err, ctx)) 56 57 ctx = newContext("GET") 58 assert.Equal(t, normal, errorHandler(someErr, ctx)) 59 } 60 61 func Test_ErrorHandler(t *testing.T) { 62 ctx := newContext("GET") 63 ErrorHandler(someErr, ctx) 64 } 65 66 func Test_logErr(t *testing.T) { 67 } 68 69 func Test_toApiError(t *testing.T) { 70 status, apiErr := toApiError(nil) 71 assert.Nil(t, apiErr) 72 assert.Equal(t, 200, status) 73 74 errObj := jsonapi.ErrorObject{Status: "200"} 75 status, apiErr = toApiError(&errObj) 76 assert.Equal(t, 200, status) 77 assert.Equal(t, errObj, *apiErr) 78 79 //bad status 80 errObj = jsonapi.ErrorObject{Status: "foobar"} 81 wantApiErr := jsonapi.ErrorObject{Status: "foobar", Detail: " bad status: foobar"} 82 gotStatus, gotApiErr := toApiError(&errObj) 83 assert.Equal(t, http.StatusInternalServerError, gotStatus) 84 assert.Equal(t, wantApiErr, *apiErr) 85 86 //httperr 87 wantApiErr = jsonapi.ErrorObject{ 88 Status: "404", 89 Title: http.StatusText(404), 90 Detail: "not found", 91 } 92 93 wantStatus := 404 94 httpErr := echo.HTTPError{Code: 404, Message: "not found", Internal: someErr} 95 gotStatus, gotApiErr = toApiError(&httpErr) 96 assert.Equal(t, wantStatus, gotStatus) 97 assert.Equal(t, wantApiErr, *gotApiErr) 98 99 //pqErr 100 const ( 101 msg = "ok" 102 code = "0100C" 103 codeName = "dynamic_result_sets_returned" 104 ) 105 pqErr := pq.Error{Message: msg, Code: "0100C"} 106 wantStatus = http.StatusBadRequest 107 wantApiErr = jsonapi.ErrorObject{ 108 Status: toStr(http.StatusBadRequest), 109 Detail: msg, 110 Code: codeName, 111 Title: "Bad Request"} 112 gotStatus, gotApiErr = toApiError(&pqErr) 113 assert.Equal(t, wantStatus, gotStatus) 114 assert.Equal(t, wantApiErr, *gotApiErr) 115 116 //goValidator 117 gvErr := govalidator.Errors{someErr} 118 wantApiErr = jsonapi.ErrorObject{ 119 Title: http.StatusText(http.StatusBadRequest), 120 Detail: gvErr.Error(), 121 Code: "", 122 Status: toStr(http.StatusBadRequest), 123 } 124 wantStatus = http.StatusBadRequest 125 126 gotStatus, gotApiErr = toApiError(gvErr) 127 assert.Equal(t, wantStatus, gotStatus) 128 assert.Equal(t, wantApiErr, *gotApiErr) 129 } 130 131 func toStr(n int) string { 132 return fmt.Sprintf("%d", n) 133 } 134 func Test_renderApiErrors(t *testing.T) { 135 ctx := newContext("HEAD") 136 assert.Error(t, renderApiErrors(ctx, nil)) 137 138 assert.NoError(t, renderApiErrors(ctx, &jsonapi.ErrorObject{ID: "ok", Status: "404", Code: "hey"})) 139 }