package controllers_test import ( "bytes" "context" "encoding/json" "github.com/crawlab-team/crawlab/core/controllers" "github.com/crawlab-team/crawlab/core/middlewares" "github.com/crawlab-team/crawlab/core/models/models" "github.com/crawlab-team/crawlab/core/models/service" "github.com/crawlab-team/crawlab/core/user" "github.com/spf13/viper" "net/http" "net/http/httptest" "testing" "github.com/crawlab-team/crawlab/db/mongo" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" ) func init() { } // TestModel is a simple struct to be used as a model in tests type TestModel models.TestModel var TestToken string // SetupTestDB sets up the test database func SetupTestDB() { viper.Set("mongo.db", "testdb") modelSvc := service.NewModelService[models.User]() u := models.User{ Username: "admin", } id, err := modelSvc.InsertOne(u) if err != nil { panic(err) } u.SetId(id) userSvc, err := user.GetUserService() if err != nil { panic(err) } token, err := userSvc.MakeToken(&u) if err != nil { panic(err) } TestToken = token } // SetupRouter sets up the gin router for testing func SetupRouter() *gin.Engine { router := gin.Default() return router } // CleanupTestDB cleans up the test database func CleanupTestDB() { mongo.GetMongoDb("testdb").Drop(context.Background()) } func TestBaseController_GetById(t *testing.T) { SetupTestDB() defer CleanupTestDB() // Insert a test document id, err := service.NewModelService[TestModel]().InsertOne(TestModel{Name: "test"}) assert.NoError(t, err) // Initialize the controller ctr := controllers.NewController[TestModel]() // Set up the router router := SetupRouter() router.Use(middlewares.AuthorizationMiddleware()) router.GET("/testmodels/:id", ctr.GetById) // Create a test request req, _ := http.NewRequest("GET", "/testmodels/"+id.Hex(), nil) req.Header.Set("Authorization", TestToken) w := httptest.NewRecorder() // Serve the request router.ServeHTTP(w, req) // Check the response assert.Equal(t, http.StatusOK, w.Code) var response controllers.Response[TestModel] err = json.Unmarshal(w.Body.Bytes(), &response) assert.NoError(t, err) assert.Equal(t, "test", response.Data.Name) } func TestBaseController_Post(t *testing.T) { SetupTestDB() defer CleanupTestDB() // Initialize the controller ctr := controllers.NewController[TestModel]() // Set up the router router := SetupRouter() router.Use(middlewares.AuthorizationMiddleware()) router.POST("/testmodels", ctr.Post) // Create a test request testModel := TestModel{Name: "test"} jsonValue, _ := json.Marshal(testModel) req, _ := http.NewRequest("POST", "/testmodels", bytes.NewBuffer(jsonValue)) req.Header.Set("Authorization", TestToken) w := httptest.NewRecorder() // Serve the request router.ServeHTTP(w, req) // Check the response assert.Equal(t, http.StatusOK, w.Code) var response controllers.Response[TestModel] err := json.Unmarshal(w.Body.Bytes(), &response) assert.NoError(t, err) assert.Equal(t, "test", response.Data.Name) // Check if the document was inserted into the database result, err := service.NewModelService[TestModel]().GetById(response.Data.Id) assert.NoError(t, err) assert.Equal(t, "test", result.Name) } func TestBaseController_DeleteById(t *testing.T) { SetupTestDB() defer CleanupTestDB() // Insert a test document id, err := service.NewModelService[TestModel]().InsertOne(TestModel{Name: "test"}) assert.NoError(t, err) // Initialize the controller ctr := controllers.NewController[TestModel]() // Set up the router router := SetupRouter() router.Use(middlewares.AuthorizationMiddleware()) router.DELETE("/testmodels/:id", ctr.DeleteById) // Create a test request req, _ := http.NewRequest("DELETE", "/testmodels/"+id.Hex(), nil) req.Header.Set("Authorization", TestToken) w := httptest.NewRecorder() // Serve the request router.ServeHTTP(w, req) // Check the response assert.Equal(t, http.StatusOK, w.Code) // Check if the document was deleted from the database _, err = service.NewModelService[TestModel]().GetById(id) assert.Error(t, err) }