github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/task/import_test.go (about) 1 package task 2 3 import ( 4 "errors" 5 "testing" 6 7 "github.com/DATA-DOG/go-sqlmock" 8 model "github.com/cloudreve/Cloudreve/v3/models" 9 "github.com/cloudreve/Cloudreve/v3/pkg/cache" 10 "github.com/cloudreve/Cloudreve/v3/pkg/util" 11 "github.com/jinzhu/gorm" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestImportTask_Props(t *testing.T) { 16 asserts := assert.New(t) 17 task := &ImportTask{ 18 User: &model.User{}, 19 } 20 asserts.NotEmpty(task.Props()) 21 asserts.Equal(ImportTaskType, task.Type()) 22 asserts.EqualValues(0, task.Creator()) 23 asserts.Nil(task.Model()) 24 } 25 26 func TestImportTask_SetStatus(t *testing.T) { 27 asserts := assert.New(t) 28 task := &ImportTask{ 29 User: &model.User{}, 30 TaskModel: &model.Task{ 31 Model: gorm.Model{ID: 1}, 32 }, 33 } 34 mock.ExpectBegin() 35 mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 36 mock.ExpectCommit() 37 task.SetStatus(3) 38 asserts.NoError(mock.ExpectationsWereMet()) 39 } 40 41 func TestImportTask_SetError(t *testing.T) { 42 asserts := assert.New(t) 43 task := &ImportTask{ 44 User: &model.User{}, 45 TaskModel: &model.Task{ 46 Model: gorm.Model{ID: 1}, 47 }, 48 } 49 50 mock.ExpectBegin() 51 mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 52 mock.ExpectCommit() 53 54 task.SetErrorMsg("error", nil) 55 asserts.NoError(mock.ExpectationsWereMet()) 56 asserts.Equal("error", task.GetError().Msg) 57 } 58 59 func TestImportTask_Do(t *testing.T) { 60 asserts := assert.New(t) 61 task := &ImportTask{ 62 User: &model.User{}, 63 TaskModel: &model.Task{ 64 Model: gorm.Model{ID: 1}, 65 }, 66 TaskProps: ImportProps{ 67 PolicyID: 63, 68 Src: "", 69 Recursive: false, 70 Dst: "", 71 }, 72 } 73 74 // 存储策略不存在 75 { 76 cache.Deletes([]string{"63"}, "policy_") 77 mock.ExpectQuery("SELECT(.+)policies(.+)"). 78 WillReturnRows(sqlmock.NewRows([]string{"id"})) 79 // 设定失败状态 80 mock.ExpectBegin() 81 mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 82 mock.ExpectCommit() 83 task.Do() 84 asserts.NoError(mock.ExpectationsWereMet()) 85 asserts.NotEmpty(task.Err.Error) 86 task.Err = nil 87 } 88 89 // 无法分配 Filesystem 90 { 91 cache.Deletes([]string{"63"}, "policy_") 92 mock.ExpectQuery("SELECT(.+)policies(.+)"). 93 WillReturnRows(sqlmock.NewRows([]string{"id", "type"}).AddRow(63, "unknown")) 94 // 设定失败状态 95 mock.ExpectBegin() 96 mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 97 mock.ExpectCommit() 98 task.Do() 99 asserts.NoError(mock.ExpectationsWereMet()) 100 asserts.NotEmpty(task.Err.Msg) 101 task.Err = nil 102 } 103 104 // 成功列取,但是文件为空 105 { 106 cache.Deletes([]string{"63"}, "policy_") 107 task.TaskProps.Src = "TestImportTask_Do/empty" 108 mock.ExpectQuery("SELECT(.+)policies(.+)"). 109 WillReturnRows(sqlmock.NewRows([]string{"id", "type"}).AddRow(63, "local")) 110 // 设定listing状态 111 mock.ExpectBegin() 112 mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 113 mock.ExpectCommit() 114 // 设定inserting状态 115 mock.ExpectBegin() 116 mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 117 mock.ExpectCommit() 118 task.Do() 119 asserts.NoError(mock.ExpectationsWereMet()) 120 asserts.Nil(task.Err) 121 task.Err = nil 122 } 123 124 // 创建测试文件 125 f, _ := util.CreatNestedFile(util.RelativePath("tests/TestImportTask_Do/test.txt")) 126 f.Close() 127 128 // 成功列取,包含一个文件一个目录,父目录创建失败 129 { 130 cache.Deletes([]string{"63"}, "policy_") 131 task.TaskProps.Src = "tests" 132 task.TaskProps.Dst = "/" 133 task.TaskProps.Recursive = true 134 mock.ExpectQuery("SELECT(.+)policies(.+)"). 135 WillReturnRows(sqlmock.NewRows([]string{"id", "type"}).AddRow(63, "local")) 136 // 设定listing状态 137 mock.ExpectBegin() 138 mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 139 mock.ExpectCommit() 140 // 设定inserting状态 141 mock.ExpectBegin() 142 mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 143 mock.ExpectCommit() 144 // 查找父目录,但是不存在 145 mock.ExpectQuery("SELECT(.+)folders").WillReturnRows(sqlmock.NewRows([]string{"id"})) 146 // 仍然不存在 147 mock.ExpectQuery("SELECT(.+)folders").WillReturnRows(sqlmock.NewRows([]string{"id"})) 148 // 创建文件时查找父目录,仍然不存在 149 mock.ExpectQuery("SELECT(.+)folders").WillReturnRows(sqlmock.NewRows([]string{"id"})) 150 mock.ExpectQuery("SELECT(.+)folders").WillReturnRows(sqlmock.NewRows([]string{"id"})) 151 152 task.Do() 153 154 asserts.NoError(mock.ExpectationsWereMet()) 155 asserts.Nil(task.Err) 156 task.Err = nil 157 } 158 159 // 成功列取,包含一个文件一个目录, 全部操作成功 160 { 161 cache.Deletes([]string{"63"}, "policy_") 162 task.TaskProps.Src = "tests" 163 task.TaskProps.Dst = "/" 164 task.TaskProps.Recursive = true 165 mock.ExpectQuery("SELECT(.+)policies(.+)"). 166 WillReturnRows(sqlmock.NewRows([]string{"id", "type"}).AddRow(63, "local")) 167 // 设定listing状态 168 mock.ExpectBegin() 169 mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 170 mock.ExpectCommit() 171 // 设定inserting状态 172 mock.ExpectBegin() 173 mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 174 mock.ExpectCommit() 175 // 查找父目录,存在 176 mock.ExpectQuery("SELECT(.+)folders").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1)) 177 // 查找同名文件,不存在 178 mock.ExpectQuery("SELECT(.+)files").WillReturnRows(sqlmock.NewRows([]string{"id"})) 179 // 创建目录 180 mock.ExpectQuery("SELECT(.+)folders").WillReturnRows(sqlmock.NewRows([]string{"id"})) 181 mock.ExpectBegin() 182 mock.ExpectExec("INSERT(.+)folders(.+)").WillReturnResult(sqlmock.NewResult(2, 1)) 183 mock.ExpectCommit() 184 // 插入文件记录 185 mock.ExpectBegin() 186 mock.ExpectExec("INSERT(.+)files(.+)").WillReturnResult(sqlmock.NewResult(2, 1)) 187 mock.ExpectExec("UPDATE(.+)users(.+)storage(.+)").WillReturnResult(sqlmock.NewResult(2, 1)) 188 mock.ExpectCommit() 189 190 task.Do() 191 192 asserts.NoError(mock.ExpectationsWereMet()) 193 asserts.Nil(task.Err) 194 task.Err = nil 195 } 196 } 197 198 func TestNewImportTask(t *testing.T) { 199 asserts := assert.New(t) 200 201 // 成功 202 { 203 mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1)) 204 mock.ExpectBegin() 205 mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) 206 mock.ExpectCommit() 207 job, err := NewImportTask(1, 1, "/", "/", false) 208 asserts.NoError(mock.ExpectationsWereMet()) 209 asserts.NotNil(job) 210 asserts.NoError(err) 211 } 212 213 // 失败 214 { 215 mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1)) 216 mock.ExpectBegin() 217 mock.ExpectExec("INSERT(.+)").WillReturnError(errors.New("error")) 218 mock.ExpectRollback() 219 job, err := NewImportTask(1, 1, "/", "/", false) 220 asserts.NoError(mock.ExpectationsWereMet()) 221 asserts.Nil(job) 222 asserts.Error(err) 223 } 224 } 225 226 func TestNewImportTaskFromModel(t *testing.T) { 227 asserts := assert.New(t) 228 229 // 成功 230 { 231 mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1)) 232 job, err := NewImportTaskFromModel(&model.Task{Props: "{}"}) 233 asserts.NoError(mock.ExpectationsWereMet()) 234 asserts.NoError(err) 235 asserts.NotNil(job) 236 } 237 238 // JSON解析失败 239 { 240 mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1)) 241 job, err := NewImportTaskFromModel(&model.Task{Props: "?"}) 242 asserts.NoError(mock.ExpectationsWereMet()) 243 asserts.Error(err) 244 asserts.Nil(job) 245 } 246 }