feedback/internal/server/http_test.go
2023-04-20 07:03:21 +05:00

108 lines
2.1 KiB
Go

package server
import (
"github.com/gofiber/fiber/v2"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/suite"
"go.uber.org/zap"
"net/http"
"penahub.gitlab.yandexcloud.net/backend/templategen_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)
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))
}