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())
 | |
| }
 |