package handler import ( "bytes" "encoding/json" "flag" "fmt" v1 "github.com/go-nunu/nunu-layout-advanced/api/v1" "github.com/go-nunu/nunu-layout-advanced/internal/handler" "github.com/go-nunu/nunu-layout-advanced/internal/middleware" jwt2 "github.com/go-nunu/nunu-layout-advanced/pkg/jwt" "github.com/go-nunu/nunu-layout-advanced/test/mocks/service" "time" "net/http" "net/http/httptest" "os" "testing" "github.com/gin-gonic/gin" "github.com/go-nunu/nunu-layout-advanced/pkg/config" "github.com/go-nunu/nunu-layout-advanced/pkg/log" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" ) var ( userId = "xxx" ) var logger *log.Logger var hdl *handler.Handler var jwt *jwt2.JWT var router *gin.Engine func TestMain(m *testing.M) { fmt.Println("begin") err := os.Setenv("APP_CONF", "../../../config/local.yml") if err != nil { fmt.Println("Setenv error", err) } var envConf = flag.String("conf", "config/local.yml", "config path, eg: -conf ./config/local.yml") flag.Parse() conf := config.NewConfig(*envConf) logger = log.NewLog(conf) hdl = handler.NewHandler(logger) jwt = jwt2.NewJwt(conf) gin.SetMode(gin.TestMode) router = gin.Default() router.Use( middleware.CORSMiddleware(), middleware.ResponseLogMiddleware(logger), middleware.RequestLogMiddleware(logger), //middleware.SignMiddleware(log), ) code := m.Run() fmt.Println("test end") os.Exit(code) } func TestUserHandler_Register(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() params := v1.RegisterRequest{ Password: "123456", Email: "xxx@gmail.com", } mockUserService := mock_service.NewMockUserService(ctrl) mockUserService.EXPECT().Register(gomock.Any(), ¶ms).Return(nil) userHandler := handler.NewUserHandler(hdl, mockUserService) router.POST("/register", userHandler.Register) paramsJson, _ := json.Marshal(params) resp := performRequest(router, "POST", "/register", bytes.NewBuffer(paramsJson)) assert.Equal(t, resp.Code, http.StatusOK) // Add assertions for the response body if needed } func TestUserHandler_Login(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() params := v1.LoginRequest{ Email: "xxx@gmail.com", Password: "123456", } mockUserService := mock_service.NewMockUserService(ctrl) mockUserService.EXPECT().Login(gomock.Any(), ¶ms).Return("", nil) userHandler := handler.NewUserHandler(hdl, mockUserService) router.POST("/login", userHandler.Login) paramsJson, _ := json.Marshal(params) resp := performRequest(router, "POST", "/login", bytes.NewBuffer(paramsJson)) assert.Equal(t, resp.Code, http.StatusOK) // Add assertions for the response body if needed } func TestUserHandler_GetProfile(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() mockUserService := mock_service.NewMockUserService(ctrl) mockUserService.EXPECT().GetProfile(gomock.Any(), userId).Return(&v1.GetProfileResponseData{ UserId: userId, Nickname: "xxxxx", }, nil) userHandler := handler.NewUserHandler(hdl, mockUserService) router.Use(middleware.NoStrictAuth(jwt, logger)) router.GET("/user", userHandler.GetProfile) req, _ := http.NewRequest("GET", "/user", nil) req.Header.Set("Authorization", "Bearer "+genToken(t)) resp := httptest.NewRecorder() router.ServeHTTP(resp, req) assert.Equal(t, resp.Code, http.StatusOK) // Add assertions for the response body if needed } func TestUserHandler_UpdateProfile(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() params := v1.UpdateProfileRequest{ Nickname: "alan", Email: "alan@gmail.com", } mockUserService := mock_service.NewMockUserService(ctrl) mockUserService.EXPECT().UpdateProfile(gomock.Any(), userId, ¶ms).Return(nil) userHandler := handler.NewUserHandler(hdl, mockUserService) router.Use(middleware.StrictAuth(jwt, logger)) router.PUT("/user", userHandler.UpdateProfile) paramsJson, _ := json.Marshal(params) req, _ := http.NewRequest("PUT", "/user", bytes.NewBuffer(paramsJson)) req.Header.Set("Authorization", "Bearer "+genToken(t)) req.Header.Set("Content-Type", "application/json") resp := httptest.NewRecorder() router.ServeHTTP(resp, req) assert.Equal(t, resp.Code, http.StatusOK) // Add assertions for the response body if needed } func performRequest(r http.Handler, method, path string, body *bytes.Buffer) *httptest.ResponseRecorder { req, _ := http.NewRequest(method, path, body) resp := httptest.NewRecorder() r.ServeHTTP(resp, req) return resp } func genToken(t *testing.T) string { token, err := jwt.GenToken(userId, time.Now().Add(time.Hour*24*90)) if err != nil { t.Error(err) return token } return token }