From 0502a0f21250456259ec0f492b62b79397bcda06 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Mon, 17 Feb 2020 14:04:48 +0800 Subject: [PATCH] Test: share/storage/user model --- middleware/share_test.go | 44 +++++++++++++++++++++++ models/share.go | 10 +++--- models/share_test.go | 72 +++++++++++++++++++++++++++++++++++++ models/storage_pack_test.go | 47 ++++++++++++++++++++++++ models/user_test.go | 63 ++++++++++++++++++++++++++++++++ models/webdav_test.go | 15 ++++++++ 6 files changed, 246 insertions(+), 5 deletions(-) create mode 100644 models/webdav_test.go diff --git a/middleware/share_test.go b/middleware/share_test.go index 16ae822..6b75c30 100644 --- a/middleware/share_test.go +++ b/middleware/share_test.go @@ -143,3 +143,47 @@ func TestBeforeShareDownload(t *testing.T) { asserts.False(c.IsAborted()) } } + +func TestShareOwner(t *testing.T) { + asserts := assert.New(t) + rec := httptest.NewRecorder() + testFunc := ShareOwner() + + // 未登录 + { + c, _ := gin.CreateTestContext(rec) + testFunc(c) + asserts.True(c.IsAborted()) + + c, _ = gin.CreateTestContext(rec) + c.Set("share", &model.Share{}) + testFunc(c) + asserts.True(c.IsAborted()) + } + + // 非用户所创建分享 + { + c, _ := gin.CreateTestContext(rec) + testFunc(c) + asserts.True(c.IsAborted()) + + c, _ = gin.CreateTestContext(rec) + c.Set("share", &model.Share{User: model.User{Model: gorm.Model{ID: 1}}}) + c.Set("user", &model.User{}) + testFunc(c) + asserts.True(c.IsAborted()) + } + + // 正常 + { + c, _ := gin.CreateTestContext(rec) + testFunc(c) + asserts.True(c.IsAborted()) + + c, _ = gin.CreateTestContext(rec) + c.Set("share", &model.Share{}) + c.Set("user", &model.User{}) + testFunc(c) + asserts.False(c.IsAborted()) + } +} diff --git a/models/share.go b/models/share.go index 3fe636d..74b3767 100644 --- a/models/share.go +++ b/models/share.go @@ -67,6 +67,11 @@ func (share *Share) IsAvailable() bool { return false } + // 检查创建者状态 + if share.Creator().Status != Active { + return false + } + // 检查源对象是否存在 var sourceID uint if share.IsDir { @@ -81,11 +86,6 @@ func (share *Share) IsAvailable() bool { return false } - // 检查创建者状态 - if share.Creator().Status != Active { - return false - } - return true } diff --git a/models/share_test.go b/models/share_test.go index e390a29..a8fb364 100644 --- a/models/share_test.go +++ b/models/share_test.go @@ -114,6 +114,17 @@ func TestShare_IsAvailable(t *testing.T) { asserts.True(share.IsAvailable()) asserts.NoError(mock.ExpectationsWereMet()) } + + // 用户被封禁 + { + share := Share{ + RemainDownloads: -1, + SourceID: 2, + IsDir: true, + User: User{Status: Baned}, + } + asserts.False(share.IsAvailable()) + } } func TestShare_GetCreator(t *testing.T) { @@ -320,3 +331,64 @@ func TestShare_Viewed(t *testing.T) { asserts.NoError(mock.ExpectationsWereMet()) asserts.EqualValues(1, share.Views) } + +func TestShare_UpdateAndDelete(t *testing.T) { + asserts := assert.New(t) + share := Share{} + + { + mock.ExpectBegin() + mock.ExpectExec("UPDATE(.+)"). + WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + err := share.Update(map[string]interface{}{"id": 1}) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.NoError(err) + } + + { + mock.ExpectBegin() + mock.ExpectExec("UPDATE(.+)"). + WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + err := share.Delete() + asserts.NoError(mock.ExpectationsWereMet()) + asserts.NoError(err) + } + + { + mock.ExpectBegin() + mock.ExpectExec("UPDATE(.+)"). + WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + err := DeleteShareBySourceIDs([]uint{1}, true) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.NoError(err) + } + +} + +func TestListShares(t *testing.T) { + asserts := assert.New(t) + + mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(2).AddRow(2)) + mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1).AddRow(2)) + + res, total := ListShares(1, 1, 10, "desc", true) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Len(res, 2) + asserts.Equal(2, total) +} + +func TestSearchShares(t *testing.T) { + asserts := assert.New(t) + + mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1)) + mock.ExpectQuery("SELECT(.+)"). + WithArgs("", sqlmock.AnyArg(), "%1%2%"). + WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1)) + res, total := SearchShares(1, 10, "id", "1 2") + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Len(res, 1) + asserts.Equal(1, total) +} diff --git a/models/storage_pack_test.go b/models/storage_pack_test.go index d4a3856..27b60ca 100644 --- a/models/storage_pack_test.go +++ b/models/storage_pack_test.go @@ -1,6 +1,7 @@ package model import ( + "errors" "github.com/DATA-DOG/go-sqlmock" "github.com/jinzhu/gorm" "github.com/stretchr/testify/assert" @@ -37,3 +38,49 @@ func TestUser_GetAvailablePackSize(t *testing.T) { } } + +func TestStoragePack_Create(t *testing.T) { + asserts := assert.New(t) + pack := &StoragePack{} + + // 成功 + { + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + id, err := pack.Create() + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Equal(uint(1), id) + asserts.NoError(err) + } + + // 失败 + { + mock.ExpectBegin() + mock.ExpectExec("INSERT(.+)").WillReturnError(errors.New("error")) + mock.ExpectRollback() + id, err := pack.Create() + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Equal(uint(0), id) + asserts.Error(err) + } +} + +func TestGetExpiredStoragePack(t *testing.T) { + asserts := assert.New(t) + mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"})) + res := GetExpiredStoragePack() + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Len(res, 0) +} + +func TestStoragePack_Delete(t *testing.T) { + asserts := assert.New(t) + pack := &StoragePack{} + mock.ExpectBegin() + mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + asserts.NoError(pack.Delete()) + asserts.NoError(mock.ExpectationsWereMet()) + +} diff --git a/models/user_test.go b/models/user_test.go index 0da77c0..7029229 100644 --- a/models/user_test.go +++ b/models/user_test.go @@ -62,6 +62,58 @@ func TestGetUserByID(t *testing.T) { asserts.Equal(User{}, user) } +func TestGetActiveUserByID(t *testing.T) { + asserts := assert.New(t) + cache.Deletes([]string{"1"}, "policy_") + //找到用户时 + userRows := sqlmock.NewRows([]string{"id", "deleted_at", "email", "options", "group_id"}). + AddRow(1, nil, "admin@cloudreve.org", "{}", 1) + mock.ExpectQuery("^SELECT (.+)").WillReturnRows(userRows) + + groupRows := sqlmock.NewRows([]string{"id", "name", "policies"}). + AddRow(1, "管理员", "[1]") + mock.ExpectQuery("^SELECT (.+)").WillReturnRows(groupRows) + + policyRows := sqlmock.NewRows([]string{"id", "name"}). + AddRow(1, "默认存储策略") + mock.ExpectQuery("^SELECT (.+)").WillReturnRows(policyRows) + + user, err := GetActiveUserByID(1) + asserts.NoError(err) + asserts.Equal(User{ + Model: gorm.Model{ + ID: 1, + DeletedAt: nil, + }, + Email: "admin@cloudreve.org", + Options: "{}", + GroupID: 1, + Group: Group{ + Model: gorm.Model{ + ID: 1, + }, + Name: "管理员", + Policies: "[1]", + PolicyList: []uint{1}, + }, + Policy: Policy{ + Model: gorm.Model{ + ID: 1, + }, + OptionsSerialized: PolicyOption{ + FileType: []string{}, + }, + Name: "默认存储策略", + }, + }, user) + + //未找到用户时 + mock.ExpectQuery("^SELECT (.+)").WillReturnError(errors.New("not found")) + user, err = GetActiveUserByID(1) + asserts.Error(err) + asserts.Equal(User{}, user) +} + func TestUser_SetPassword(t *testing.T) { asserts := assert.New(t) user := User{} @@ -387,3 +439,14 @@ func TestUser_IsAnonymous(t *testing.T) { user.ID = 1 asserts.False(user.IsAnonymous()) } + +func TestUser_SetStatus(t *testing.T) { + asserts := assert.New(t) + user := User{} + mock.ExpectBegin() + mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectCommit() + user.SetStatus(Baned) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Equal(Baned, user.Status) +} diff --git a/models/webdav_test.go b/models/webdav_test.go new file mode 100644 index 0000000..2b5dc6f --- /dev/null +++ b/models/webdav_test.go @@ -0,0 +1,15 @@ +package model + +import ( + "github.com/DATA-DOG/go-sqlmock" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestGetWebdavByPassword(t *testing.T) { + asserts := assert.New(t) + mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"})) + _, err := GetWebdavByPassword("e", 1) + asserts.NoError(mock.ExpectationsWereMet()) + asserts.Error(err) +}