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  }