github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/filesystem/filesystem_test.go (about) 1 package filesystem 2 3 import ( 4 "github.com/cloudreve/Cloudreve/v3/pkg/cluster" 5 "github.com/cloudreve/Cloudreve/v3/pkg/conf" 6 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem/driver/shadow/masterinslave" 7 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem/driver/shadow/slaveinmaster" 8 "github.com/cloudreve/Cloudreve/v3/pkg/serializer" 9 "net/http/httptest" 10 11 "github.com/DATA-DOG/go-sqlmock" 12 model "github.com/cloudreve/Cloudreve/v3/models" 13 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem/driver/local" 14 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem/driver/remote" 15 "github.com/gin-gonic/gin" 16 "github.com/stretchr/testify/assert" 17 18 "testing" 19 ) 20 21 func TestNewFileSystem(t *testing.T) { 22 asserts := assert.New(t) 23 user := model.User{ 24 Policy: model.Policy{ 25 Type: "local", 26 }, 27 } 28 29 // 本地 成功 30 fs, err := NewFileSystem(&user) 31 asserts.NoError(err) 32 asserts.NotNil(fs.Handler) 33 asserts.IsType(local.Driver{}, fs.Handler) 34 // 远程 35 user.Policy.Type = "remote" 36 fs, err = NewFileSystem(&user) 37 asserts.NoError(err) 38 asserts.NotNil(fs.Handler) 39 asserts.IsType(&remote.Driver{}, fs.Handler) 40 41 user.Policy.Type = "unknown" 42 fs, err = NewFileSystem(&user) 43 asserts.Error(err) 44 } 45 46 func TestNewFileSystemFromContext(t *testing.T) { 47 asserts := assert.New(t) 48 c, _ := gin.CreateTestContext(httptest.NewRecorder()) 49 c.Set("user", &model.User{ 50 Policy: model.Policy{ 51 Type: "local", 52 }, 53 }) 54 fs, err := NewFileSystemFromContext(c) 55 asserts.NotNil(fs) 56 asserts.NoError(err) 57 58 c, _ = gin.CreateTestContext(httptest.NewRecorder()) 59 fs, err = NewFileSystemFromContext(c) 60 asserts.Nil(fs) 61 asserts.Error(err) 62 } 63 64 func TestDispatchHandler(t *testing.T) { 65 asserts := assert.New(t) 66 fs := &FileSystem{ 67 User: &model.User{}, 68 Policy: &model.Policy{ 69 Type: "local", 70 }, 71 } 72 73 // 未指定,使用用户默认 74 err := fs.DispatchHandler() 75 asserts.NoError(err) 76 asserts.IsType(local.Driver{}, fs.Handler) 77 78 // 已指定,发生错误 79 fs.Policy = &model.Policy{Type: "unknown"} 80 err = fs.DispatchHandler() 81 asserts.Error(err) 82 83 fs.Policy = &model.Policy{Type: "mock"} 84 err = fs.DispatchHandler() 85 asserts.NoError(err) 86 87 fs.Policy = &model.Policy{Type: "local"} 88 err = fs.DispatchHandler() 89 asserts.NoError(err) 90 91 fs.Policy = &model.Policy{Type: "remote"} 92 err = fs.DispatchHandler() 93 asserts.NoError(err) 94 95 fs.Policy = &model.Policy{Type: "qiniu"} 96 err = fs.DispatchHandler() 97 asserts.NoError(err) 98 99 fs.Policy = &model.Policy{Type: "oss", Server: "https://s.com", BucketName: "1234"} 100 err = fs.DispatchHandler() 101 asserts.NoError(err) 102 103 fs.Policy = &model.Policy{Type: "upyun"} 104 err = fs.DispatchHandler() 105 asserts.NoError(err) 106 107 fs.Policy = &model.Policy{Type: "onedrive"} 108 err = fs.DispatchHandler() 109 asserts.NoError(err) 110 111 fs.Policy = &model.Policy{Type: "cos"} 112 err = fs.DispatchHandler() 113 asserts.NoError(err) 114 115 fs.Policy = &model.Policy{Type: "s3"} 116 err = fs.DispatchHandler() 117 asserts.NoError(err) 118 } 119 120 func TestNewFileSystemFromCallback(t *testing.T) { 121 asserts := assert.New(t) 122 123 // 用户上下文不存在 124 { 125 c, _ := gin.CreateTestContext(httptest.NewRecorder()) 126 fs, err := NewFileSystemFromCallback(c) 127 asserts.Nil(fs) 128 asserts.Error(err) 129 } 130 131 // 找不到回调会话 132 { 133 c, _ := gin.CreateTestContext(httptest.NewRecorder()) 134 c.Set("user", &model.User{ 135 Policy: model.Policy{ 136 Type: "local", 137 }, 138 }) 139 fs, err := NewFileSystemFromCallback(c) 140 asserts.Nil(fs) 141 asserts.Error(err) 142 } 143 144 // 成功 145 { 146 c, _ := gin.CreateTestContext(httptest.NewRecorder()) 147 c.Set("user", &model.User{ 148 Policy: model.Policy{ 149 Type: "local", 150 }, 151 }) 152 c.Set(UploadSessionCtx, &serializer.UploadSession{Policy: model.Policy{Type: "local"}}) 153 fs, err := NewFileSystemFromCallback(c) 154 asserts.NotNil(fs) 155 asserts.NoError(err) 156 } 157 158 } 159 160 func TestFileSystem_SetTargetFileByIDs(t *testing.T) { 161 asserts := assert.New(t) 162 163 // 成功 164 { 165 fs := &FileSystem{} 166 mock.ExpectQuery("SELECT(.+)"). 167 WithArgs(1, 2). 168 WillReturnRows(sqlmock.NewRows([]string{"id", "name"}).AddRow(1, "1.txt")) 169 err := fs.SetTargetFileByIDs([]uint{1, 2}) 170 asserts.NoError(mock.ExpectationsWereMet()) 171 asserts.Len(fs.FileTarget, 1) 172 asserts.NoError(err) 173 } 174 175 // 未找到 176 { 177 fs := &FileSystem{} 178 mock.ExpectQuery("SELECT(.+)").WithArgs(1, 2).WillReturnRows(sqlmock.NewRows([]string{"id", "name"})) 179 err := fs.SetTargetFileByIDs([]uint{1, 2}) 180 asserts.NoError(mock.ExpectationsWereMet()) 181 asserts.Len(fs.FileTarget, 0) 182 asserts.Error(err) 183 } 184 } 185 186 func TestFileSystem_CleanTargets(t *testing.T) { 187 asserts := assert.New(t) 188 fs := &FileSystem{ 189 FileTarget: []model.File{{}, {}}, 190 DirTarget: []model.Folder{{}, {}}, 191 } 192 193 fs.CleanTargets() 194 asserts.Len(fs.FileTarget, 0) 195 asserts.Len(fs.DirTarget, 0) 196 } 197 198 func TestNewAnonymousFileSystem(t *testing.T) { 199 asserts := assert.New(t) 200 201 // 正常 202 { 203 mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policies"}).AddRow(3, "游客", "[]")) 204 fs, err := NewAnonymousFileSystem() 205 asserts.NoError(mock.ExpectationsWereMet()) 206 asserts.NoError(err) 207 asserts.Equal("游客", fs.User.Group.Name) 208 } 209 210 // 游客用户组不存在 211 { 212 mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policies"})) 213 fs, err := NewAnonymousFileSystem() 214 asserts.NoError(mock.ExpectationsWereMet()) 215 asserts.Error(err) 216 asserts.Nil(fs) 217 } 218 219 // 从机 220 { 221 conf.SystemConfig.Mode = "slave" 222 fs, err := NewAnonymousFileSystem() 223 asserts.NoError(mock.ExpectationsWereMet()) 224 asserts.NoError(err) 225 asserts.NotNil(fs) 226 asserts.NotNil(fs.Handler) 227 } 228 } 229 230 func TestFileSystem_Recycle(t *testing.T) { 231 fs := &FileSystem{ 232 User: &model.User{}, 233 Policy: &model.Policy{}, 234 FileTarget: []model.File{model.File{}}, 235 DirTarget: []model.Folder{model.Folder{}}, 236 Hooks: map[string][]Hook{"AfterUpload": []Hook{GenericAfterUpdate}}, 237 } 238 fs.Recycle() 239 newFS := getEmptyFS() 240 if fs != newFS { 241 t.Error("指针不一致") 242 } 243 } 244 245 func TestFileSystem_SetTargetByInterface(t *testing.T) { 246 asserts := assert.New(t) 247 fs := FileSystem{} 248 249 // 目录 250 { 251 asserts.NoError(fs.SetTargetByInterface(&model.Folder{})) 252 asserts.Len(fs.DirTarget, 1) 253 asserts.Len(fs.FileTarget, 0) 254 } 255 256 // 文件 257 { 258 asserts.NoError(fs.SetTargetByInterface(&model.File{})) 259 asserts.Len(fs.DirTarget, 1) 260 asserts.Len(fs.FileTarget, 1) 261 } 262 } 263 264 func TestFileSystem_SwitchToSlaveHandler(t *testing.T) { 265 a := assert.New(t) 266 fs := FileSystem{ 267 User: &model.User{}, 268 } 269 mockNode := &cluster.MasterNode{ 270 Model: &model.Node{}, 271 } 272 fs.SwitchToSlaveHandler(mockNode) 273 a.IsType(&slaveinmaster.Driver{}, fs.Handler) 274 } 275 276 func TestFileSystem_SwitchToShadowHandler(t *testing.T) { 277 a := assert.New(t) 278 fs := FileSystem{ 279 User: &model.User{}, 280 Policy: &model.Policy{}, 281 } 282 mockNode := &cluster.MasterNode{ 283 Model: &model.Node{}, 284 } 285 286 // local to remote 287 { 288 fs.Policy.Type = "local" 289 fs.SwitchToShadowHandler(mockNode, "", "") 290 a.IsType(&masterinslave.Driver{}, fs.Handler) 291 } 292 293 // onedrive 294 { 295 fs.Policy.Type = "onedrive" 296 fs.SwitchToShadowHandler(mockNode, "", "") 297 a.IsType(&masterinslave.Driver{}, fs.Handler) 298 } 299 }