diff --git a/internal/fs/copy_queue_persistence_test.go b/internal/fs/copy_queue_persistence_test.go new file mode 100644 index 000000000..d3c559b09 --- /dev/null +++ b/internal/fs/copy_queue_persistence_test.go @@ -0,0 +1,65 @@ +package fs + +import ( + "encoding/json" + "testing" + + "github.com/OpenListTeam/OpenList/v4/internal/conf" + "github.com/OpenListTeam/tache" +) + +func TestMigratedCopyTaskRecoversNativeFields(t *testing.T) { + previousConf := conf.Conf + conf.Conf = &conf.Config{} + t.Cleanup(func() { conf.Conf = previousConf }) + + raw := []byte(`{ + "id":"task-one", + "state":0, + "retry":0, + "max_retry":0, + "Creator":{"id":1,"username":"admin","password":"","base_path":"/","role":2,"disabled":false,"permission":511,"sso_id":"","allow_ldap":true}, + "start_time":"2026-08-11T01:00:00Z", + "end_time":"2026-08-11T01:01:00Z", + "TotalBytes":42, + "ApiUrl":"http://openlist.test:5244", + "src_path":"/folder/file", + "dst_path":"/backup", + "src_storage_mp":"/source", + "dst_storage_mp":"/target", + "TaskType":0 + }`) + + var task FileTransferTask + if err := json.Unmarshal(raw, &task); err != nil { + t.Fatalf("unmarshal migrated task: %v", err) + } + if task.GetID() != "task-one" || task.GetState() != tache.StatePending { + t.Fatalf("unexpected base fields: id=%q state=%d", task.GetID(), task.GetState()) + } + if task.GetCreator() == nil || task.GetCreator().Username != "admin" { + t.Fatal("creator was not recovered") + } + if task.GetStartTime() == nil || task.GetEndTime() == nil { + t.Fatal("task timestamps were not recovered") + } + if task.TaskType != copy { + t.Fatalf("unexpected task type: %d", task.TaskType) + } + if task.SrcActualPath != "/folder/file" || task.DstActualPath != "/backup" { + t.Fatal("copy paths were not recovered") + } + + _, maxRetry := task.GetRetry() + if maxRetry != 0 { + t.Fatalf("migration must defer retry initialization, got %d", maxRetry) + } + task.SetRetry(0, 2) + _, maxRetry = task.GetRetry() + if maxRetry != 2 { + t.Fatalf("retry initialization failed, got %d", maxRetry) + } + if task.groupID != "/target/backup" { + t.Fatalf("task group was not rebuilt: %q", task.groupID) + } +} diff --git a/internal/task/base.go b/internal/task/base.go index f969e6c27..6e778dd96 100644 --- a/internal/task/base.go +++ b/internal/task/base.go @@ -12,8 +12,8 @@ import ( type TaskExtension struct { tache.Base Creator *model.User - startTime *time.Time - endTime *time.Time + StartTime *time.Time `json:"start_time,omitempty"` + EndTime *time.Time `json:"end_time,omitempty"` TotalBytes int64 ApiUrl string } @@ -38,23 +38,23 @@ func (t *TaskExtension) GetCreator() *model.User { } func (t *TaskExtension) SetStartTime(startTime time.Time) { - t.startTime = &startTime + t.StartTime = &startTime } func (t *TaskExtension) GetStartTime() *time.Time { - return t.startTime + return t.StartTime } func (t *TaskExtension) SetEndTime(endTime time.Time) { - t.endTime = &endTime + t.EndTime = &endTime } func (t *TaskExtension) GetEndTime() *time.Time { - return t.endTime + return t.EndTime } func (t *TaskExtension) ClearEndTime() { - t.endTime = nil + t.EndTime = nil } func (t *TaskExtension) SetTotalBytes(totalBytes int64) {