132 lines
3 KiB
Go
132 lines
3 KiB
Go
package handler
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"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...)
|
|
return s.parse()
|
|
}
|
|
|
|
func (s *MiddlewareTestSuite) parse() map[string]any {
|
|
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)
|
|
}
|
|
|
|
func (s *MiddlewareTestSuite) TestNoWorkingTransformer() {
|
|
var noop Transformer = func(err error) rErrors.ResponsableError {
|
|
return nil
|
|
}
|
|
err := errors.New("Foo")
|
|
s.ctx.Error(err)
|
|
ErrorMiddleware(WithTransformer(noop))(s.ctx)
|
|
|
|
out := s.parse()
|
|
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) TestLogger() {
|
|
buff := strings.Builder{}
|
|
var l LoggerFunc = func(c *gin.Context, err rErrors.ResponsableError) {
|
|
buff.WriteString("Err: " + err.Error())
|
|
}
|
|
err := errors.New("Foo")
|
|
s.ctx.Error(err)
|
|
ErrorMiddleware(WithLogger(l))(s.ctx)
|
|
|
|
s.Assert().Equal("Err: Foo", buff.String())
|
|
}
|