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  }