Test: model.Tags / modifications

This commit is contained in:
HFO4
2020-02-12 13:19:25 +08:00
parent 15f4b1819b
commit bb63ea7142
17 changed files with 352 additions and 55 deletions

View File

@@ -36,6 +36,7 @@ func TestDummyAria2(t *testing.T) {
}
func TestInit(t *testing.T) {
MAX_RETRY = 0
asserts := assert.New(t)
cache.Set("setting_aria2_token", "1", 0)
cache.Set("setting_aria2_call_timeout", "5", 0)

View File

@@ -32,6 +32,8 @@ type StatusEvent struct {
Status int
}
var MAX_RETRY = 10
// NewMonitor 新建上传状态监控
func NewMonitor(task *model.Download) {
monitor := &Monitor{
@@ -73,7 +75,7 @@ func (monitor *Monitor) Update() bool {
util.Log().Warning("无法获取下载任务[%s]的状态,%s", monitor.Task.GID, err)
// 十次重试后认定为任务失败
if monitor.retried > 10 {
if monitor.retried > MAX_RETRY {
util.Log().Warning("无法获取下载任务[%s]的状态,超过最大重试次数限制,%s", monitor.Task.GID, err)
monitor.setErrorStatus(err)
monitor.RemoveTempFolder()

View File

@@ -50,6 +50,7 @@ func TestNewMonitor(t *testing.T) {
func TestMonitor_Loop(t *testing.T) {
asserts := assert.New(t)
notifier := make(chan StatusEvent)
MAX_RETRY = 0
monitor := &Monitor{
Task: &model.Download{GID: "gid"},
Interval: time.Duration(1) * time.Second,
@@ -72,11 +73,13 @@ func TestMonitor_Update(t *testing.T) {
// 无法获取状态
{
MAX_RETRY = 1
testInstance := new(InstanceMock)
testInstance.On("Status", testMock.Anything).Return(rpc.StatusInfo{}, errors.New("error"))
file, _ := util.CreatNestedFile("TestMonitor_Update/1")
file.Close()
Instance = testInstance
asserts.False(monitor.Update())
asserts.True(monitor.Update())
testInstance.AssertExpectations(t)
asserts.False(util.Exists("TestMonitor_Update"))

View File

@@ -73,7 +73,7 @@ func TestFileSystem_GetContent(t *testing.T) {
}
// 文件不存在
rs, err := fs.GetContent(ctx, "not exist file")
rs, err := fs.GetContent(ctx, 1)
asserts.Equal(ErrObjectNotExist, err)
asserts.Nil(rs)
fs.CleanTargets()
@@ -84,39 +84,30 @@ func TestFileSystem_GetContent(t *testing.T) {
_ = file.Close()
cache.Deletes([]string{"1"}, "policy_")
mock.ExpectQuery("SELECT(.+)").
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policy_id"}).AddRow(1, "TestFileSystem_GetContent.txt", 1))
mock.ExpectQuery("SELECT(.+)poli(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "type"}).AddRow(1, "unknown"))
rs, err = fs.GetContent(ctx, "/TestFileSystem_GetContent.txt")
rs, err = fs.GetContent(ctx, 1)
asserts.Error(err)
asserts.NoError(mock.ExpectationsWereMet())
fs.CleanTargets()
// 打开文件失败
cache.Deletes([]string{"1"}, "policy_")
mock.ExpectQuery("SELECT(.+)").
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policy_id"}).AddRow(1, "TestFileSystem_GetContent.txt", 1))
mock.ExpectQuery("SELECT(.+)poli(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "type", "source_name"}).AddRow(1, "local", "not exist"))
rs, err = fs.GetContent(ctx, "/TestFileSystem_GetContent.txt")
rs, err = fs.GetContent(ctx, 1)
asserts.Equal(serializer.CodeIOFailed, err.(serializer.AppError).Code)
asserts.NoError(mock.ExpectationsWereMet())
fs.CleanTargets()
// 打开成功
cache.Deletes([]string{"1"}, "policy_")
mock.ExpectQuery("SELECT(.+)").
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policy_id", "source_name"}).AddRow(1, "TestFileSystem_GetContent.txt", 1, "TestFileSystem_GetContent.txt"))
mock.ExpectQuery("SELECT(.+)poli(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "type"}).AddRow(1, "local"))
rs, err = fs.GetContent(ctx, "/TestFileSystem_GetContent.txt")
rs, err = fs.GetContent(ctx, 1)
asserts.NoError(err)
asserts.NoError(mock.ExpectationsWereMet())
}
@@ -141,29 +132,23 @@ func TestFileSystem_GetDownloadContent(t *testing.T) {
_ = file.Close()
cache.Deletes([]string{"599"}, "policy_")
mock.ExpectQuery("SELECT(.+)").
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policy_id", "source_name"}).AddRow(1, "TestFileSystem_GetDownloadContent.txt", 599, "TestFileSystem_GetDownloadContent.txt"))
mock.ExpectQuery("SELECT(.+)poli(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "type"}).AddRow(1, "local"))
// 无限速
cache.Deletes([]string{"599"}, "policy_")
_, err = fs.GetDownloadContent(ctx, "/TestFileSystem_GetDownloadContent.txt")
_, err = fs.GetDownloadContent(ctx, 1)
asserts.NoError(err)
asserts.NoError(mock.ExpectationsWereMet())
fs.CleanTargets()
// 有限速
cache.Deletes([]string{"599"}, "policy_")
mock.ExpectQuery("SELECT(.+)").
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policy_id", "source_name"}).AddRow(1, "TestFileSystem_GetDownloadContent.txt", 599, "TestFileSystem_GetDownloadContent.txt"))
mock.ExpectQuery("SELECT(.+)poli(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "type"}).AddRow(1, "local"))
fs.User.Group.SpeedLimit = 1
_, err = fs.GetDownloadContent(ctx, "/TestFileSystem_GetDownloadContent.txt")
_, err = fs.GetDownloadContent(ctx, 1)
asserts.NoError(err)
asserts.NoError(mock.ExpectationsWereMet())
}
@@ -411,9 +396,6 @@ func TestFileSystem_GetDownloadURL(t *testing.T) {
cache.Set("setting_siteURL", "https://cloudreve.org", 0)
asserts.NoError(err)
// 查找文件
mock.ExpectQuery("SELECT(.+)").
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policy_id"}).AddRow(1, "1.txt", 35))
// 查找上传策略
mock.ExpectQuery("SELECT(.+)").
@@ -422,7 +404,7 @@ func TestFileSystem_GetDownloadURL(t *testing.T) {
AddRow(35, "local", true),
)
// 相关设置
downloadURL, err := fs.GetDownloadURL(ctx, "/1.txt", "download_timeout")
downloadURL, err := fs.GetDownloadURL(ctx, 1, "download_timeout")
asserts.NoError(mock.ExpectationsWereMet())
asserts.NoError(err)
asserts.NotEmpty(downloadURL)
@@ -436,12 +418,9 @@ func TestFileSystem_GetDownloadURL(t *testing.T) {
err = cache.Deletes([]string{"download_timeout"}, "setting_")
asserts.NoError(err)
// 查找文件
mock.ExpectQuery("SELECT(.+)").
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policy_id"}))
downloadURL, err := fs.GetDownloadURL(ctx, "/1.txt", "download_timeout")
downloadURL, err := fs.GetDownloadURL(ctx, 1, "download_timeout")
asserts.NoError(mock.ExpectationsWereMet())
asserts.Error(err)
asserts.Empty(downloadURL)
@@ -455,9 +434,6 @@ func TestFileSystem_GetDownloadURL(t *testing.T) {
err = cache.Deletes([]string{"download_timeout"}, "setting_")
asserts.NoError(err)
// 查找文件
mock.ExpectQuery("SELECT(.+)").
WithArgs(1).
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id", "name", "policy_id"}).AddRow(1, "1.txt", 35))
// 查找上传策略
mock.ExpectQuery("SELECT(.+)").
@@ -466,7 +442,7 @@ func TestFileSystem_GetDownloadURL(t *testing.T) {
AddRow(35, "unknown", true),
)
downloadURL, err := fs.GetDownloadURL(ctx, "/1.txt", "download_timeout")
downloadURL, err := fs.GetDownloadURL(ctx, 1, "download_timeout")
asserts.NoError(mock.ExpectationsWereMet())
asserts.Error(err)
asserts.Empty(downloadURL)
@@ -511,7 +487,7 @@ func TestFileSystem_Preview(t *testing.T) {
User: &model.User{},
}
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}))
resp, err := fs.Preview(ctx, "/1.txt", false)
resp, err := fs.Preview(ctx, 1, false)
asserts.NoError(mock.ExpectationsWereMet())
asserts.Error(err)
asserts.Nil(resp)
@@ -531,7 +507,7 @@ func TestFileSystem_Preview(t *testing.T) {
},
},
}
resp, err := fs.Preview(ctx, "/1.txt", false)
resp, err := fs.Preview(ctx, 1, false)
asserts.Error(err)
asserts.Nil(resp)
}
@@ -551,7 +527,7 @@ func TestFileSystem_Preview(t *testing.T) {
},
},
}
resp, err := fs.Preview(ctx, "/1.txt", false)
resp, err := fs.Preview(ctx, 1, false)
asserts.NoError(err)
asserts.NotNil(resp)
asserts.False(resp.Redirect)
@@ -574,7 +550,7 @@ func TestFileSystem_Preview(t *testing.T) {
},
}
asserts.NoError(cache.Set("setting_preview_timeout", "233", 0))
resp, err := fs.Preview(ctx, "/1.txt", false)
resp, err := fs.Preview(ctx, 1, false)
asserts.NoError(err)
asserts.NotNil(resp)
asserts.True(resp.Redirect)
@@ -597,7 +573,7 @@ func TestFileSystem_Preview(t *testing.T) {
},
}
asserts.NoError(cache.Set("setting_maxEditSize", "10", 0))
resp, err := fs.Preview(ctx, "/1.txt", true)
resp, err := fs.Preview(ctx, 1, true)
asserts.Equal(ErrFileSizeTooBig, err)
asserts.Nil(resp)
}
@@ -615,3 +591,18 @@ func TestFileSystem_ResetFileIDIfNotExist(t *testing.T) {
}
asserts.Equal(ErrObjectNotExist, fs.resetFileIDIfNotExist(ctx, 1))
}
func TestFileSystem_Search(t *testing.T) {
asserts := assert.New(t)
ctx := context.Background()
fs := &FileSystem{
User: &model.User{},
}
fs.User.ID = 1
mock.ExpectQuery("SELECT(.+)").WithArgs(1, "k1", "k2").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1))
res, err := fs.Search(ctx, "k1", "k2")
asserts.NoError(mock.ExpectationsWereMet())
asserts.NoError(err)
asserts.Len(res, 1)
}

View File

@@ -136,7 +136,7 @@ func TestGenericAfterUpload(t *testing.T) {
mock.NewRows([]string{"name"}),
)
err = GenericAfterUpload(ctx, &fs)
asserts.Equal(ErrPathNotExist, err)
asserts.Equal(ErrRootProtected, err)
asserts.NoError(mock.ExpectationsWereMet())
// 文件已存在

View File

@@ -390,7 +390,6 @@ func (fs *FileSystem) CreateDirectory(ctx context.Context, fullPath string) (*mo
}
// SaveTo 将别人分享的文件转存到目标路径下
// TODO 测试
func (fs *FileSystem) SaveTo(ctx context.Context, path string) error {
// 获取父目录
isExist, folder := fs.IsPathExist(path)

View File

@@ -0,0 +1,92 @@
package serializer
import (
model "github.com/HFO4/cloudreve/models"
"github.com/HFO4/cloudreve/pkg/cache"
"github.com/jinzhu/gorm"
"github.com/stretchr/testify/assert"
"github.com/zyxar/argo/rpc"
"testing"
)
func TestBuildFinishedListResponse(t *testing.T) {
asserts := assert.New(t)
tasks := []model.Download{
{
StatusInfo: rpc.StatusInfo{
Files: []rpc.FileInfo{
{
Path: "/file/name.txt",
},
},
},
Task: &model.Task{
Model: gorm.Model{},
Error: "error",
},
},
{
StatusInfo: rpc.StatusInfo{
Files: []rpc.FileInfo{
{
Path: "/file/name1.txt",
},
{
Path: "/file/name2.txt",
},
},
},
},
}
tasks[1].StatusInfo.BitTorrent.Info.Name = "name.txt"
res := BuildFinishedListResponse(tasks).Data.([]FinishedListResponse)
asserts.Len(res, 2)
asserts.Equal("name.txt", res[1].Name)
asserts.Equal("name.txt", res[0].Name)
asserts.Equal("name.txt", res[0].Files[0].Path)
asserts.Equal("name1.txt", res[1].Files[0].Path)
asserts.Equal("name2.txt", res[1].Files[1].Path)
asserts.EqualValues(0, res[0].TaskStatus)
asserts.Equal("error", res[0].TaskError)
}
func TestBuildDownloadingResponse(t *testing.T) {
asserts := assert.New(t)
cache.Set("setting_aria2_interval", "10", 0)
tasks := []model.Download{
{
StatusInfo: rpc.StatusInfo{
Files: []rpc.FileInfo{
{
Path: "/file/name.txt",
},
},
},
Task: &model.Task{
Model: gorm.Model{},
Error: "error",
},
},
{
StatusInfo: rpc.StatusInfo{
Files: []rpc.FileInfo{
{
Path: "/file/name1.txt",
},
{
Path: "/file/name2.txt",
},
},
},
},
}
tasks[1].StatusInfo.BitTorrent.Info.Name = "name.txt"
res := BuildDownloadingResponse(tasks).Data.([]DownloadListResponse)
asserts.Len(res, 2)
asserts.Equal("name1.txt", res[1].Name)
asserts.Equal("name.txt", res[0].Name)
asserts.Equal("name.txt", res[0].Info.Files[0].Path)
asserts.Equal("name1.txt", res[1].Info.Files[0].Path)
asserts.Equal("name2.txt", res[1].Info.Files[1].Path)
}

View File

@@ -92,7 +92,7 @@ func BuildUser(user model.User) User {
ShareDownload: user.Group.OptionsSerialized.ShareDownload,
CompressEnabled: user.Group.OptionsSerialized.ArchiveTask,
},
Tags: BuildTagRes(tags),
Tags: buildTagRes(tags),
}
}
@@ -121,20 +121,20 @@ func BuildUserStorageResponse(user model.User) Response {
}
}
// BuildTagRes 构建标签列表
func BuildTagRes(tags []model.Tag) []tag {
// buildTagRes 构建标签列表
func buildTagRes(tags []model.Tag) []tag {
res := make([]tag, 0, len(tags))
for i := 0; i < len(tags); i++ {
newTag := tag{
ID: hashid.HashID(tags[i].ID, hashid.TagID),
Name: tags[i].Name,
Icon: tags[i].Icon,
Color: tags[i].Color,
Type: tags[i].Type,
Expression: tags[i].Expression,
ID: hashid.HashID(tags[i].ID, hashid.TagID),
Name: tags[i].Name,
Icon: tags[i].Icon,
Color: tags[i].Color,
Type: tags[i].Type,
}
if newTag.Type == 0 {
newTag.Expression = ""
if newTag.Type != 0 {
newTag.Expression = tags[i].Expression
}
res = append(res, newTag)
}

View File

@@ -1,18 +1,38 @@
package serializer
import (
"database/sql"
"github.com/DATA-DOG/go-sqlmock"
model "github.com/HFO4/cloudreve/models"
"github.com/HFO4/cloudreve/pkg/cache"
"github.com/jinzhu/gorm"
"github.com/stretchr/testify/assert"
"testing"
)
var mock sqlmock.Sqlmock
// TestMain 初始化数据库Mock
func TestMain(m *testing.M) {
var db *sql.DB
var err error
db, mock, err = sqlmock.New()
if err != nil {
panic("An error was not expected when opening a stub database connection")
}
model.DB, _ = gorm.Open("mysql", db)
defer db.Close()
m.Run()
}
func TestBuildUser(t *testing.T) {
asserts := assert.New(t)
user := model.User{
Policy: model.Policy{MaxSize: 1024 * 1024},
}
mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}))
res := BuildUser(user)
asserts.NoError(mock.ExpectationsWereMet())
asserts.Equal("1.00mb", res.Policy.MaxSize)
}
@@ -72,3 +92,21 @@ func TestBuildUserStorageResponse(t *testing.T) {
asserts.Equal(uint64(5), res.Data.(storage).Free)
}
}
func TestBuildTagRes(t *testing.T) {
asserts := assert.New(t)
tags := []model.Tag{
{
Type: 0,
Expression: "exp",
},
{
Type: 1,
Expression: "exp",
},
}
res := buildTagRes(tags)
asserts.Len(res, 2)
asserts.Equal("", res[0].Expression)
asserts.Equal("exp", res[1].Expression)
}