package server import ( "github.com/gofiber/fiber/v2" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" "go.uber.org/zap" "net/http" "gitea.pena/PenaSide/feedback/internal/config" "testing" "time" ) type HttpTestSuite struct { srv *HTTP suite.Suite } type MockController struct { mock.Mock } func (m *MockController) Register() (method, path, name string, handler fiber.Handler) { return "GET", "/callme", "testCallMe", m.Handler } func (m *MockController) Handler(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusOK) } func (suite *HttpTestSuite) SetupSuite() { cfg, err := config.NewConfig("test.env") suite.NoError(err) logger := zap.NewNop() srv := NewHTTP(cfg, logger, nil) srv.fiber.Config() suite.srv = srv } func (suite *HttpTestSuite) TearDownSuite() { err := suite.srv.Stop() suite.NoError(err) } func (suite *HttpTestSuite) TestHttp_Register() { controller := new(MockController) suite.srv.Register(controller) got := suite.srv.fiber.GetRoute("testCallMe") suite.Equal("/callme", got.Path) } func (suite *HttpTestSuite) TestHttp_StartAndStop() { gotStart := false gotStop := false suite.srv.fiber.Hooks().OnListen(func() error { gotStart = true return nil }) suite.srv.fiber.Hooks().OnShutdown(func() error { gotStop = true return nil }) go func() { err := suite.srv.Start() suite.NoError(err) }() time.Sleep(500 * time.Millisecond) suite.True(gotStart) err := suite.srv.fiber.Shutdown() if suite.NoError(err) { time.Sleep(500 * time.Millisecond) suite.True(gotStop) } } func (suite *HttpTestSuite) TestHttp_Limiter() { controller := new(MockController) suite.srv.Register(controller) req, err := http.NewRequest("GET", "/callme", nil) suite.NoError(err) gotOne, err := suite.srv.fiber.Test(req) suite.NoError(err) suite.Equal(fiber.StatusOK, gotOne.StatusCode) gotTwo, err := suite.srv.fiber.Test(req) suite.NoError(err) suite.Equal(fiber.StatusTooManyRequests, gotTwo.StatusCode) } func TestHttpTestSuite(t *testing.T) { suite.Run(t, new(HttpTestSuite)) }