From fc29c5e92b6a7240e3486f8344b1a675f02881d8 Mon Sep 17 00:00:00 2001 From: Aleksandr Soloshenko Date: Tue, 3 Dec 2024 19:29:05 +0700 Subject: [PATCH] [base] use `400` status for parsing errors --- internal/sms-gateway/handlers/base/handler.go | 6 +-- .../sms-gateway/handlers/base/handler_test.go | 39 ++++++++----------- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/internal/sms-gateway/handlers/base/handler.go b/internal/sms-gateway/handlers/base/handler.go index 4853a40..d79521d 100644 --- a/internal/sms-gateway/handlers/base/handler.go +++ b/internal/sms-gateway/handlers/base/handler.go @@ -19,7 +19,7 @@ type Handler struct { func (h *Handler) BodyParserValidator(c *fiber.Ctx, out any) error { if err := c.BodyParser(out); err != nil { - return fmt.Errorf("can't parse body: %w", err) + return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Can't parse body: %s", err.Error())) } return h.ValidateStruct(out) @@ -27,7 +27,7 @@ func (h *Handler) BodyParserValidator(c *fiber.Ctx, out any) error { func (h *Handler) QueryParserValidator(c *fiber.Ctx, out any) error { if err := c.QueryParser(out); err != nil { - return fmt.Errorf("can't parse query: %w", err) + return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Can't parse query: %s", err.Error())) } return h.ValidateStruct(out) @@ -35,7 +35,7 @@ func (h *Handler) QueryParserValidator(c *fiber.Ctx, out any) error { func (h *Handler) ParamsParserValidator(c *fiber.Ctx, out any) error { if err := c.ParamsParser(out); err != nil { - return fmt.Errorf("can't parse params: %w", err) + return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("Can't parse params: %s", err.Error())) } return h.ValidateStruct(out) diff --git a/internal/sms-gateway/handlers/base/handler_test.go b/internal/sms-gateway/handlers/base/handler_test.go index b71c988..9fb4450 100644 --- a/internal/sms-gateway/handlers/base/handler_test.go +++ b/internal/sms-gateway/handlers/base/handler_test.go @@ -1,4 +1,4 @@ -package base +package base_test import ( "bytes" @@ -8,53 +8,46 @@ import ( "net/http/httptest" "testing" + "github.com/android-sms-gateway/server/internal/sms-gateway/handlers/base" "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" "go.uber.org/zap" "go.uber.org/zap/zaptest" ) -type TestRequestBody struct { +type testRequestBody struct { Name string `json:"name" validate:"required"` Age int `json:"age" validate:"required"` } -type TestRequestBodyNoValidate struct { +type testRequestBodyNoValidate struct { Name string `json:"name" validate:"required"` Age int `json:"age" validate:"required"` } -func (t *TestRequestBody) Validate() error { +func (t *testRequestBody) Validate() error { if t.Age < 18 { return fmt.Errorf("must be at least 18 years old") } return nil } -type TestQueryParams struct { - Page int `query:"page" validate:"required"` -} - -type TestURLParams struct { - ID string `params:"id" validate:"required,uuid"` -} - func TestHandler_BodyParserValidator(t *testing.T) { logger := zaptest.NewLogger(t) validate := validator.New() - handler := &Handler{ + handler := &base.Handler{ Logger: logger, Validator: validate, } app := fiber.New() app.Post("/test", func(c *fiber.Ctx) error { - var body TestRequestBody + var body testRequestBody return handler.BodyParserValidator(c, &body) }) app.Post("/test2", func(c *fiber.Ctx) error { - var body TestRequestBodyNoValidate + var body testRequestBodyNoValidate return handler.BodyParserValidator(c, &body) }) @@ -67,32 +60,32 @@ func TestHandler_BodyParserValidator(t *testing.T) { { description: "Valid request body", path: "/test", - payload: &TestRequestBody{Name: "John Doe", Age: 25}, + payload: &testRequestBody{Name: "John Doe", Age: 25}, expectedStatus: fiber.StatusOK, }, { description: "Invalid request body - missing name", path: "/test", - payload: &TestRequestBody{Age: 25}, + payload: &testRequestBody{Age: 25}, expectedStatus: fiber.StatusBadRequest, }, { description: "Invalid request body - age too low", path: "/test", - payload: &TestRequestBody{Name: "John Doe", Age: 17}, + payload: &testRequestBody{Name: "John Doe", Age: 17}, expectedStatus: fiber.StatusBadRequest, }, { description: "Valid request body - no validation", path: "/test2", - payload: &TestRequestBodyNoValidate{Name: "John Doe", Age: 17}, + payload: &testRequestBodyNoValidate{Name: "John Doe", Age: 17}, expectedStatus: fiber.StatusOK, }, { description: "No request body", path: "/test", payload: nil, - expectedStatus: fiber.StatusUnprocessableEntity, + expectedStatus: fiber.StatusBadRequest, }, } @@ -134,7 +127,7 @@ func TestHandler_QueryParserValidator(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - h := &Handler{ + h := &base.Handler{ Logger: tt.fields.Logger, Validator: tt.fields.Validator, } @@ -164,7 +157,7 @@ func TestHandler_ParamsParserValidator(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - h := &Handler{ + h := &base.Handler{ Logger: tt.fields.Logger, Validator: tt.fields.Validator, } @@ -193,7 +186,7 @@ func TestHandler_validateStruct(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - h := &Handler{ + h := &base.Handler{ Logger: tt.fields.Logger, Validator: tt.fields.Validator, }