github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/task/transfer_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/jinzhu/gorm"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestTransferTask_Props(t *testing.T) {
    14  	asserts := assert.New(t)
    15  	task := &TransferTask{
    16  		User: &model.User{},
    17  	}
    18  	asserts.NotEmpty(task.Props())
    19  	asserts.Equal(TransferTaskType, task.Type())
    20  	asserts.EqualValues(0, task.Creator())
    21  	asserts.Nil(task.Model())
    22  }
    23  
    24  func TestTransferTask_SetStatus(t *testing.T) {
    25  	asserts := assert.New(t)
    26  	task := &TransferTask{
    27  		User: &model.User{},
    28  		TaskModel: &model.Task{
    29  			Model: gorm.Model{ID: 1},
    30  		},
    31  	}
    32  	mock.ExpectBegin()
    33  	mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1))
    34  	mock.ExpectCommit()
    35  	task.SetStatus(3)
    36  	asserts.NoError(mock.ExpectationsWereMet())
    37  }
    38  
    39  func TestTransferTask_SetError(t *testing.T) {
    40  	asserts := assert.New(t)
    41  	task := &TransferTask{
    42  		User: &model.User{},
    43  		TaskModel: &model.Task{
    44  			Model: gorm.Model{ID: 1},
    45  		},
    46  	}
    47  
    48  	mock.ExpectBegin()
    49  	mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1))
    50  	mock.ExpectCommit()
    51  
    52  	task.SetErrorMsg("error", nil)
    53  	asserts.NoError(mock.ExpectationsWereMet())
    54  	asserts.Equal("error", task.GetError().Msg)
    55  }
    56  
    57  func TestTransferTask_Do(t *testing.T) {
    58  	asserts := assert.New(t)
    59  	task := &TransferTask{
    60  		TaskModel: &model.Task{
    61  			Model: gorm.Model{ID: 1},
    62  		},
    63  	}
    64  
    65  	// 无法创建文件系统
    66  	{
    67  		task.TaskProps.Parent = "test/not_exist"
    68  		task.User = &model.User{
    69  			Policy: model.Policy{
    70  				Type: "unknown",
    71  			},
    72  		}
    73  		mock.ExpectBegin()
    74  		mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1,
    75  			1))
    76  		mock.ExpectCommit()
    77  		task.Do()
    78  		asserts.NoError(mock.ExpectationsWereMet())
    79  		asserts.NotEmpty(task.GetError().Msg)
    80  	}
    81  
    82  	// 上传出错
    83  	{
    84  		task.User = &model.User{
    85  			Policy: model.Policy{
    86  				Type: "mock",
    87  			},
    88  		}
    89  		task.TaskProps.Src = []string{"test/not_exist"}
    90  		task.TaskProps.Parent = "test/not_exist"
    91  		// 更新错误
    92  		mock.ExpectBegin()
    93  		mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1,
    94  			1))
    95  		mock.ExpectCommit()
    96  		task.Do()
    97  		asserts.NoError(mock.ExpectationsWereMet())
    98  		asserts.NotEmpty(task.GetError().Msg)
    99  	}
   100  
   101  	// 替换目录前缀
   102  	{
   103  		task.User = &model.User{
   104  			Policy: model.Policy{
   105  				Type: "mock",
   106  			},
   107  		}
   108  		task.TaskProps.Src = []string{"test/not_exist"}
   109  		task.TaskProps.Parent = "test/not_exist"
   110  		task.TaskProps.TrimPath = true
   111  		// 更新错误
   112  		mock.ExpectBegin()
   113  		mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1,
   114  			1))
   115  		mock.ExpectCommit()
   116  		task.Do()
   117  		asserts.NoError(mock.ExpectationsWereMet())
   118  		asserts.NotEmpty(task.GetError().Msg)
   119  	}
   120  }
   121  
   122  func TestNewTransferTask(t *testing.T) {
   123  	asserts := assert.New(t)
   124  
   125  	// 成功
   126  	{
   127  		mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
   128  		mock.ExpectBegin()
   129  		mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1))
   130  		mock.ExpectCommit()
   131  		job, err := NewTransferTask(1, []string{}, "/", "/", false, 0, nil)
   132  		asserts.NoError(mock.ExpectationsWereMet())
   133  		asserts.NotNil(job)
   134  		asserts.NoError(err)
   135  	}
   136  
   137  	// 失败
   138  	{
   139  		mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
   140  		mock.ExpectBegin()
   141  		mock.ExpectExec("INSERT(.+)").WillReturnError(errors.New("error"))
   142  		mock.ExpectRollback()
   143  		job, err := NewTransferTask(1, []string{}, "/", "/", false, 0, nil)
   144  		asserts.NoError(mock.ExpectationsWereMet())
   145  		asserts.Nil(job)
   146  		asserts.Error(err)
   147  	}
   148  }
   149  
   150  func TestNewTransferTaskFromModel(t *testing.T) {
   151  	asserts := assert.New(t)
   152  
   153  	// 成功
   154  	{
   155  		mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
   156  		job, err := NewTransferTaskFromModel(&model.Task{Props: "{}"})
   157  		asserts.NoError(mock.ExpectationsWereMet())
   158  		asserts.NoError(err)
   159  		asserts.NotNil(job)
   160  	}
   161  
   162  	// JSON解析失败
   163  	{
   164  		mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
   165  		job, err := NewTransferTaskFromModel(&model.Task{Props: "?"})
   166  		asserts.NoError(mock.ExpectationsWereMet())
   167  		asserts.Error(err)
   168  		asserts.Nil(job)
   169  	}
   170  }