Files
crawlab/core/controllers/test/project_test.go
2024-06-14 15:42:50 +08:00

306 lines
7.5 KiB
Go

package test
import (
"encoding/json"
"fmt"
"github.com/crawlab-team/crawlab/core/constants"
"github.com/crawlab-team/crawlab/core/entity"
"github.com/crawlab-team/crawlab/core/models/delegate"
"github.com/crawlab-team/crawlab/core/models/models"
"github.com/stretchr/testify/require"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"net/http"
"testing"
"time"
)
func TestProjectController_Get(t *testing.T) {
T.Setup(t)
e := T.NewExpect(t)
p := models.Project{
Name: "test project",
}
res := T.WithAuth(e.POST("/projects")).WithJSON(p).Expect().Status(http.StatusOK).JSON().Object()
res.Path("$.data._id").NotNull()
id := res.Path("$.data._id").String().Raw()
oid, err := primitive.ObjectIDFromHex(id)
require.Nil(t, err)
require.False(t, oid.IsZero())
res = T.WithAuth(e.GET("/projects/" + id)).WithJSON(p).Expect().Status(http.StatusOK).JSON().Object()
res.Path("$.data._id").NotNull()
res.Path("$.data.name").Equal("test project")
}
func TestProjectController_Put(t *testing.T) {
T.Setup(t)
e := T.NewExpect(t)
p := models.Project{
Name: "old name",
Description: "old description",
}
// add
res := T.WithAuth(e.POST("/projects")).
WithJSON(p).
Expect().Status(http.StatusOK).
JSON().Object()
res.Path("$.data._id").NotNull()
id := res.Path("$.data._id").String().Raw()
oid, err := primitive.ObjectIDFromHex(id)
require.Nil(t, err)
require.False(t, oid.IsZero())
// change object
p.Id = oid
p.Name = "new name"
p.Description = "new description"
// update
T.WithAuth(e.PUT("/projects/" + id)).
WithJSON(p).
Expect().Status(http.StatusOK)
// check
res = T.WithAuth(e.GET("/projects/" + id)).Expect().Status(http.StatusOK).JSON().Object()
res.Path("$.data._id").Equal(id)
res.Path("$.data.name").Equal("new name")
res.Path("$.data.description").Equal("new description")
}
func TestProjectController_Post(t *testing.T) {
T.Setup(t)
e := T.NewExpect(t)
p := models.Project{
Name: "test project",
Description: "this is a test project",
}
res := T.WithAuth(e.POST("/projects")).WithJSON(p).Expect().Status(http.StatusOK).JSON().Object()
res.Path("$.data._id").NotNull()
res.Path("$.data.name").Equal("test project")
res.Path("$.data.description").Equal("this is a test project")
}
func TestProjectController_Delete(t *testing.T) {
T.Setup(t)
e := T.NewExpect(t)
p := models.Project{
Name: "test project",
Description: "this is a test project",
}
// add
res := T.WithAuth(e.POST("/projects")).
WithJSON(p).
Expect().Status(http.StatusOK).
JSON().Object()
res.Path("$.data._id").NotNull()
id := res.Path("$.data._id").String().Raw()
oid, err := primitive.ObjectIDFromHex(id)
require.Nil(t, err)
require.False(t, oid.IsZero())
// get
res = T.WithAuth(e.GET("/projects/" + id)).
Expect().Status(http.StatusOK).
JSON().Object()
res.Path("$.data._id").NotNull()
id = res.Path("$.data._id").String().Raw()
oid, err = primitive.ObjectIDFromHex(id)
require.Nil(t, err)
require.False(t, oid.IsZero())
// delete
T.WithAuth(e.DELETE("/projects/" + id)).
Expect().Status(http.StatusOK).
JSON().Object()
// get
T.WithAuth(e.GET("/projects/" + id)).
Expect().Status(http.StatusNotFound)
}
func TestProjectController_GetList(t *testing.T) {
T.Setup(t)
e := T.NewExpect(t)
n := 100 // total
bn := 10 // batch
for i := 0; i < n; i++ {
p := models.Project{
Name: fmt.Sprintf("test name %d", i+1),
}
obj := T.WithAuth(e.POST("/projects")).WithJSON(p).Expect().Status(http.StatusOK).JSON().Object()
obj.Path("$.data._id").NotNull()
}
f := entity.Filter{
//IsOr: false,
Conditions: []*entity.Condition{
{Key: "name", Op: constants.FilterOpContains, Value: "test name"},
},
}
condBytes, err := json.Marshal(&f.Conditions)
require.Nil(t, err)
pagination := entity.Pagination{
Page: 1,
Size: bn,
}
// get list with pagination
res := T.WithAuth(e.GET("/projects")).
WithQuery("conditions", string(condBytes)).
WithQueryObject(pagination).
Expect().Status(http.StatusOK).JSON().Object()
res.Path("$.data").Array().Length().Equal(bn)
res.Path("$.total").Number().Equal(n)
data := res.Path("$.data").Array()
for i := 0; i < bn; i++ {
obj := data.Element(i)
obj.Path("$.name").Equal(fmt.Sprintf("test name %d", i+1))
}
}
func TestProjectController_PostList(t *testing.T) {
T.Setup(t)
e := T.NewExpect(t)
n := 10
var docs []models.Project
for i := 0; i < n; i++ {
docs = append(docs, models.Project{
Name: fmt.Sprintf("project %d", i+1),
Description: "this is a project",
})
}
T.WithAuth(e.POST("/projects/batch")).WithJSON(docs).Expect().Status(http.StatusOK)
res := T.WithAuth(e.GET("/projects")).
WithQueryObject(entity.Pagination{Page: 1, Size: 10}).
Expect().Status(http.StatusOK).
JSON().Object()
res.Path("$.data").Array().Length().Equal(n)
}
func TestProjectController_DeleteList(t *testing.T) {
T.Setup(t)
e := T.NewExpect(t)
n := 10
var docs []models.Project
for i := 0; i < n; i++ {
docs = append(docs, models.Project{
Name: fmt.Sprintf("project %d", i+1),
Description: "this is a project",
})
}
// add
res := T.WithAuth(e.POST("/projects/batch")).WithJSON(docs).Expect().Status(http.StatusOK).
JSON().Object()
var ids []primitive.ObjectID
data := res.Path("$.data").Array()
for i := 0; i < n; i++ {
obj := data.Element(i)
id := obj.Path("$._id").String().Raw()
oid, err := primitive.ObjectIDFromHex(id)
require.Nil(t, err)
require.False(t, oid.IsZero())
ids = append(ids, oid)
}
// delete
payload := entity.BatchRequestPayload{
Ids: ids,
}
T.WithAuth(e.DELETE("/projects")).
WithJSON(payload).
Expect().Status(http.StatusOK)
// check
for _, id := range ids {
T.WithAuth(e.GET("/projects/" + id.Hex())).
Expect().Status(http.StatusNotFound)
}
}
func TestProjectController_PutList(t *testing.T) {
T.Setup(t)
e := T.NewExpect(t)
// now
now := time.Now()
n := 10
var docs []models.Project
for i := 0; i < n; i++ {
docs = append(docs, models.Project{
Name: "old name",
Description: "old description",
})
}
// add
res := T.WithAuth(e.POST("/projects/batch")).WithJSON(docs).Expect().Status(http.StatusOK).
JSON().Object()
var ids []primitive.ObjectID
data := res.Path("$.data").Array()
for i := 0; i < n; i++ {
obj := data.Element(i)
id := obj.Path("$._id").String().Raw()
oid, err := primitive.ObjectIDFromHex(id)
require.Nil(t, err)
require.False(t, oid.IsZero())
ids = append(ids, oid)
}
// wait for 100 millisecond
time.Sleep(100 * time.Millisecond)
// update
p := models.Project{
Name: "new name",
Description: "new description",
}
dataBytes, err := json.Marshal(&p)
require.Nil(t, err)
payload := entity.BatchRequestPayloadWithStringData{
Ids: ids,
Data: string(dataBytes),
Fields: []string{
"name",
"description",
},
}
T.WithAuth(e.PUT("/projects")).WithJSON(payload).Expect().Status(http.StatusOK)
// check response data
for i := 0; i < n; i++ {
res = T.WithAuth(e.GET("/projects/" + ids[i].Hex())).Expect().Status(http.StatusOK).JSON().Object()
res.Path("$.data.name").Equal("new name")
res.Path("$.data.description").Equal("new description")
}
// check artifacts
pl, err := T.modelSvc.GetProjectList(bson.M{"_id": bson.M{"$in": ids}}, nil)
require.Nil(t, err)
for _, p := range pl {
a, err := delegate.NewModelDelegate(&p).GetArtifact()
require.Nil(t, err)
require.True(t, a.GetSys().GetUpdateTs().After(now))
require.True(t, a.GetSys().GetUpdateTs().After(a.GetSys().GetCreateTs()))
}
}