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  }