Files
new-api/controller/system_task_test.go
CaIon 90134d5b6b feat(system-tasks): add filtered task history with cleanup
List system tasks by type, status and scope with paging, show a history
table beside the active task panel, and add DELETE /api/system-task/history
to purge finished entries.
2026-09-18 11:24:30 +08:00

74 lines
2.6 KiB
Go

package controller
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/QuantumNous/new-api/common"
"github.com/QuantumNous/new-api/model"
"github.com/gin-gonic/gin"
"github.com/glebarez/sqlite"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gorm.io/gorm"
)
func TestSystemTaskListFiltersAndPaginationResponse(t *testing.T) {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
require.NoError(t, err)
sqlDB, err := db.DB()
require.NoError(t, err)
previousDB := model.DB
model.DB = db
t.Cleanup(func() {
model.DB = previousDB
require.NoError(t, sqlDB.Close())
})
require.NoError(t, db.AutoMigrate(&model.SystemTask{}))
require.NoError(t, db.Create(&[]model.SystemTask{
{TaskID: "older", Type: model.SystemTaskTypeModelUpdate, Status: model.SystemTaskStatusFailed},
{TaskID: "newer", Type: model.SystemTaskTypeModelUpdate, Status: model.SystemTaskStatusFailed},
{TaskID: "other-status", Type: model.SystemTaskTypeModelUpdate, Status: model.SystemTaskStatusSucceeded},
{TaskID: "other-type", Type: model.SystemTaskTypeChannelTest, Status: model.SystemTaskStatusFailed},
}).Error)
recorder := httptest.NewRecorder()
c, _ := gin.CreateTestContext(recorder)
c.Request = httptest.NewRequest(http.MethodGet, "/api/system-task/list?scope=history&type=model_update&status=failed&offset=1&limit=1", nil)
ListSystemTasks(c)
require.Equal(t, http.StatusOK, recorder.Code)
var response struct {
Success bool `json:"success"`
Total int64 `json:"total"`
Data []model.SystemTaskResponse `json:"data"`
}
require.NoError(t, common.Unmarshal(recorder.Body.Bytes(), &response))
assert.True(t, response.Success)
assert.EqualValues(t, 2, response.Total)
require.Len(t, response.Data, 1)
assert.Equal(t, "older", response.Data[0].TaskID)
}
func TestSystemTaskInvalidFiltersAreRejected(t *testing.T) {
for _, tc := range []struct {
query string
handler gin.HandlerFunc
}{
{"?scope=invalid", ListSystemTasks},
{"?status=unknown", ListSystemTasks},
{"?offset=-1", ListSystemTasks},
{"?limit=invalid", ListSystemTasks},
{"?status=unknown", DeleteSystemTaskHistory},
{"?scope=invalid", DeleteSystemTaskHistory},
} {
t.Run(tc.query, func(t *testing.T) {
recorder := httptest.NewRecorder()
c, _ := gin.CreateTestContext(recorder)
c.Request = httptest.NewRequest(http.MethodGet, "/"+tc.query, nil)
tc.handler(c)
assert.Equal(t, http.StatusBadRequest, recorder.Code)
assert.JSONEq(t, `{"success":false,"message":"invalid system task filters"}`, recorder.Body.String())
})
}
}