gin-error-handler/middleware_test.go

100 lines
2.2 KiB
Go

package handler
import (
"encoding/json"
"errors"
"net/http"
"net/http/httptest"
"testing"
rErrors "codeberg.org/danjones000/responsable-errors"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/suite"
)
func TestMiddleware(t *testing.T) {
suite.Run(t, new(MiddlewareTestSuite))
}
type MiddlewareTestSuite struct {
suite.Suite
w *httptest.ResponseRecorder
ctx *gin.Context
}
func (s *MiddlewareTestSuite) SetupTest() {
gin.SetMode(gin.TestMode)
s.w = httptest.NewRecorder()
s.ctx, _ = gin.CreateTestContext(s.w)
s.ctx.Request = new(http.Request)
}
func (s *MiddlewareTestSuite) TearDownTest() {
s.w = nil
s.ctx = nil
}
func (s *MiddlewareTestSuite) do(err ...error) {
for _, e := range err {
s.ctx.Error(e)
}
ErrorMiddleware()(s.ctx)
}
func (s *MiddlewareTestSuite) doParse(err ...error) map[string]any {
s.do(err...)
var out map[string]any
jsonErr := json.Unmarshal(s.w.Body.Bytes(), &out)
s.Assert().Nil(jsonErr)
return out
}
func (s *MiddlewareTestSuite) TestNoError() {
s.do()
s.Assert().Equal("", s.w.Body.String())
}
func (s *MiddlewareTestSuite) TestResError() {
msg := "I can't find it"
err := rErrors.NewNotFound(msg)
out := s.doParse(err)
outMsg, ok := out["error"].(string)
s.Assert().True(ok)
s.Assert().Equal(msg, outMsg)
s.Assert().Equal(http.StatusNotFound, s.w.Code)
}
func (s *MiddlewareTestSuite) TestGinError() {
msg := "I don't like this"
err := &gin.Error{errors.New(msg), gin.ErrorTypePublic, nil}
out := s.doParse(err)
outMsg, ok := out["error"].(string)
s.Assert().True(ok)
s.Assert().Equal(msg, outMsg)
s.Assert().Equal(http.StatusBadRequest, s.w.Code)
}
func (s *MiddlewareTestSuite) TestGinErrorPrivate() {
msg := "Don't do this"
err := &gin.Error{errors.New(msg), gin.ErrorTypePrivate, nil}
out := s.doParse(err)
outMsg, ok := out["error"].(string)
s.Assert().True(ok)
s.Assert().Equal("Unknown Error", outMsg)
s.Assert().Equal(http.StatusInternalServerError, s.w.Code)
}
func (s *MiddlewareTestSuite) TestOtherError() {
msg := "Don't do this"
err := errors.New(msg)
out := s.doParse(err)
outMsg, ok := out["error"].(string)
s.Assert().True(ok)
s.Assert().Equal("Unknown Error", outMsg)
s.Assert().Equal(http.StatusInternalServerError, s.w.Code)
}