github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/task/compress_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 TestCompressTask_Props(t *testing.T) {
    16  	asserts := assert.New(t)
    17  	task := &CompressTask{
    18  		User: &model.User{},
    19  	}
    20  	asserts.NotEmpty(task.Props())
    21  	asserts.Equal(CompressTaskType, task.Type())
    22  	asserts.EqualValues(0, task.Creator())
    23  	asserts.Nil(task.Model())
    24  }
    25  
    26  func TestCompressTask_SetStatus(t *testing.T) {
    27  	asserts := assert.New(t)
    28  	task := &CompressTask{
    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 TestCompressTask_SetError(t *testing.T) {
    42  	asserts := assert.New(t)
    43  	task := &CompressTask{
    44  		User: &model.User{},
    45  		TaskModel: &model.Task{
    46  			Model: gorm.Model{ID: 1},
    47  		},
    48  		zipPath: "test/TestCompressTask_SetError",
    49  	}
    50  	zipFile, _ := util.CreatNestedFile("test/TestCompressTask_SetError")
    51  	zipFile.Close()
    52  
    53  	mock.ExpectBegin()
    54  	mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1))
    55  	mock.ExpectCommit()
    56  
    57  	task.SetErrorMsg("error")
    58  	asserts.NoError(mock.ExpectationsWereMet())
    59  	asserts.False(util.Exists("test/TestCompressTask_SetError"))
    60  	asserts.Equal("error", task.GetError().Msg)
    61  }
    62  
    63  func TestCompressTask_Do(t *testing.T) {
    64  	asserts := assert.New(t)
    65  	task := &CompressTask{
    66  		TaskModel: &model.Task{
    67  			Model: gorm.Model{ID: 1},
    68  		},
    69  	}
    70  
    71  	// 无法创建文件系统
    72  	{
    73  		task.User = &model.User{
    74  			Policy: model.Policy{
    75  				Type: "unknown",
    76  			},
    77  		}
    78  		mock.ExpectBegin()
    79  		mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1,
    80  			1))
    81  		mock.ExpectCommit()
    82  		task.Do()
    83  		asserts.NoError(mock.ExpectationsWereMet())
    84  		asserts.NotEmpty(task.GetError().Msg)
    85  	}
    86  
    87  	// 压缩出错
    88  	{
    89  		task.User = &model.User{
    90  			Policy: model.Policy{
    91  				Type: "mock",
    92  			},
    93  		}
    94  		task.TaskProps.Dirs = []uint{1}
    95  		// 更新进度
    96  		mock.ExpectBegin()
    97  		mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1,
    98  			1))
    99  		mock.ExpectCommit()
   100  		// 查找目录
   101  		mock.ExpectQuery("SELECT(.+)").WillReturnError(errors.New("error"))
   102  		// 更新错误
   103  		mock.ExpectBegin()
   104  		mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1,
   105  			1))
   106  		mock.ExpectCommit()
   107  		task.Do()
   108  		asserts.NoError(mock.ExpectationsWereMet())
   109  		asserts.NotEmpty(task.GetError().Msg)
   110  	}
   111  
   112  	// 上传出错
   113  	{
   114  		task.User = &model.User{
   115  			Policy: model.Policy{
   116  				Type:    "mock",
   117  				MaxSize: 1,
   118  			},
   119  		}
   120  		task.TaskProps.Dirs = []uint{1}
   121  		cache.Set("setting_temp_path", "test", 0)
   122  		// 更新进度
   123  		mock.ExpectBegin()
   124  		mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1,
   125  			1))
   126  		mock.ExpectCommit()
   127  		// 查找目录
   128  		mock.ExpectQuery("SELECT(.+)folders").
   129  			WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
   130  		// 查找文件
   131  		mock.ExpectQuery("SELECT(.+)files").
   132  			WillReturnRows(sqlmock.NewRows([]string{"id"}))
   133  		// 查找子文件
   134  		mock.ExpectQuery("SELECT(.+)files").
   135  			WillReturnRows(sqlmock.NewRows([]string{"id"}))
   136  		// 查找子目录
   137  		mock.ExpectQuery("SELECT(.+)folders").
   138  			WillReturnRows(sqlmock.NewRows([]string{"id"}))
   139  		// 更新错误
   140  		mock.ExpectBegin()
   141  		mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1,
   142  			1))
   143  		mock.ExpectCommit()
   144  		task.Do()
   145  		asserts.NoError(mock.ExpectationsWereMet())
   146  		asserts.NotEmpty(task.GetError().Msg)
   147  		asserts.True(util.IsEmpty(util.RelativePath("test/compress")))
   148  	}
   149  }
   150  
   151  func TestNewCompressTask(t *testing.T) {
   152  	asserts := assert.New(t)
   153  
   154  	// 成功
   155  	{
   156  		mock.ExpectBegin()
   157  		mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1))
   158  		mock.ExpectCommit()
   159  		job, err := NewCompressTask(&model.User{}, "/", []uint{12}, []uint{})
   160  		asserts.NoError(mock.ExpectationsWereMet())
   161  		asserts.NotNil(job)
   162  		asserts.NoError(err)
   163  	}
   164  
   165  	// 失败
   166  	{
   167  		mock.ExpectBegin()
   168  		mock.ExpectExec("INSERT(.+)").WillReturnError(errors.New("error"))
   169  		mock.ExpectRollback()
   170  		job, err := NewCompressTask(&model.User{}, "/", []uint{12}, []uint{})
   171  		asserts.NoError(mock.ExpectationsWereMet())
   172  		asserts.Nil(job)
   173  		asserts.Error(err)
   174  	}
   175  }
   176  
   177  func TestNewCompressTaskFromModel(t *testing.T) {
   178  	asserts := assert.New(t)
   179  
   180  	// 成功
   181  	{
   182  		mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
   183  		job, err := NewCompressTaskFromModel(&model.Task{Props: "{}"})
   184  		asserts.NoError(mock.ExpectationsWereMet())
   185  		asserts.NoError(err)
   186  		asserts.NotNil(job)
   187  	}
   188  
   189  	// JSON解析失败
   190  	{
   191  		mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
   192  		job, err := NewCompressTaskFromModel(&model.Task{Props: ""})
   193  		asserts.NoError(mock.ExpectationsWereMet())
   194  		asserts.Error(err)
   195  		asserts.Nil(job)
   196  	}
   197  }