diff --git a/controller/controller.go b/controller/controller.go index d0a5fe8..000b938 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -192,7 +192,12 @@ func (t *Controller) Redirect(c echo.Context, route string, routeParams ...inter // - FirstName string `form:"first-name" validate:"required" label:"First name"` // Only a few validator tags are supported below. Expand them as needed. func (t *Controller) SetValidationErrorMessages(c echo.Context, err error, data interface{}) { - for _, ve := range err.(validator.ValidationErrors) { + ves, ok := err.(validator.ValidationErrors) + if !ok { + return + } + + for _, ve := range ves { var message string // Default the field label to the name of the struct field diff --git a/controller/controller_test.go b/controller/controller_test.go index c904429..eb17c1b 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -8,8 +8,17 @@ import ( "testing" "goweb/config" + "goweb/msg" "goweb/services" + "github.com/gorilla/sessions" + "github.com/labstack/echo-contrib/session" + + "github.com/go-playground/validator/v10" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/labstack/echo/v4" ) @@ -33,3 +42,38 @@ func newContext(url string) echo.Context { req := httptest.NewRequest(http.MethodGet, url, strings.NewReader("")) return c.Web.NewContext(req, httptest.NewRecorder()) } + +func initSesssion(t *testing.T, ctx echo.Context) { + // Simulate an HTTP request through the session middleware to initiate the session + mw := session.Middleware(sessions.NewCookieStore([]byte("secret"))) + handler := mw(echo.NotFoundHandler) + assert.Error(t, handler(ctx)) +} + +func TestController_Redirect(t *testing.T) { + ctx := newContext("/abc") + ctr := NewController(c) + err := ctr.Redirect(ctx, "home") + require.NoError(t, err) + assert.Equal(t, "", ctx.Response().Header().Get(echo.HeaderLocation)) + assert.Equal(t, http.StatusFound, ctx.Response().Status) +} + +func TestController_SetValidationErrorMessages(t *testing.T) { + type example struct { + Name string `validate:"required" label:"Label test"` + } + e := example{} + v := validator.New() + err := v.Struct(e) + require.Error(t, err) + + ctx := newContext("/") + initSesssion(t, ctx) + ctr := NewController(c) + ctr.SetValidationErrorMessages(ctx, err, e) + + msgs := msg.Get(ctx, msg.TypeDanger) + require.Len(t, msgs, 1) + assert.Equal(t, "Label test is required.", msgs[0]) +} diff --git a/controller/page_test.go b/controller/page_test.go index 8be5fa7..90d5585 100644 --- a/controller/page_test.go +++ b/controller/page_test.go @@ -7,10 +7,6 @@ import ( "goweb/context" "goweb/msg" - "github.com/gorilla/sessions" - "github.com/labstack/echo-contrib/session" - "github.com/labstack/echo/v4" - echomw "github.com/labstack/echo/v4/middleware" "github.com/stretchr/testify/assert" ) @@ -45,11 +41,7 @@ func TestNewPage(t *testing.T) { func TestPage_GetMessages(t *testing.T) { ctx := newContext("/") p := NewPage(ctx) - - // Simulate an HTTP request through the session middleware to initiate the session - mw := session.Middleware(sessions.NewCookieStore([]byte("secret"))) - handler := mw(echo.NotFoundHandler) - assert.Error(t, handler(ctx)) + initSesssion(t, ctx) // Set messages msgTests := make(map[msg.Type][]string)