package model import ( "encoding/json" "github.com/DATA-DOG/go-sqlmock" "github.com/HFO4/cloudreve/pkg/cache" "github.com/jinzhu/gorm" "github.com/pkg/errors" "github.com/stretchr/testify/assert" "testing" ) func TestGetUserByID(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 := GetUserByID(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 = GetUserByID(1) asserts.Error(err) 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{} err := user.SetPassword("Cause Sega does what nintendon't") asserts.NoError(err) asserts.NotEmpty(user.Password) } func TestUser_CheckPassword(t *testing.T) { asserts := assert.New(t) user := User{} err := user.SetPassword("Cause Sega does what nintendon't") asserts.NoError(err) //密码正确 res, err := user.CheckPassword("Cause Sega does what nintendon't") asserts.NoError(err) asserts.True(res) //密码错误 res, err = user.CheckPassword("Cause Sega does what Nintendon't") asserts.NoError(err) asserts.False(res) //密码字段为空 user = User{} res, err = user.CheckPassword("Cause Sega does what nintendon't") asserts.Error(err) asserts.False(res) } func TestNewUser(t *testing.T) { asserts := assert.New(t) newUser := NewUser() asserts.IsType(User{}, newUser) asserts.Empty(newUser.Avatar) } func TestUser_AfterFind(t *testing.T) { asserts := assert.New(t) cache.Deletes([]string{"1"}, "policy_") policyRows := sqlmock.NewRows([]string{"id", "name"}). AddRow(1, "默认存储策略") mock.ExpectQuery("^SELECT (.+)").WillReturnRows(policyRows) newUser := NewUser() err := newUser.AfterFind() err = newUser.BeforeSave() expected := UserOption{} err = json.Unmarshal([]byte(newUser.Options), &expected) asserts.NoError(err) asserts.NoError(mock.ExpectationsWereMet()) asserts.Equal(expected, newUser.OptionsSerialized) asserts.Equal("默认存储策略", newUser.Policy.Name) } func TestUser_BeforeSave(t *testing.T) { asserts := assert.New(t) newUser := NewUser() err := newUser.BeforeSave() expected, err := json.Marshal(newUser.OptionsSerialized) asserts.NoError(err) asserts.Equal(string(expected), newUser.Options) } func TestUser_GetPolicyID(t *testing.T) { asserts := assert.New(t) newUser := NewUser() testCases := []struct { preferred uint available []uint expected uint }{ { available: []uint{1}, expected: 1, }, { available: []uint{5, 2, 3}, expected: 5, }, { preferred: 1, available: []uint{5, 1, 3}, expected: 1, }, { preferred: 9, available: []uint{5, 1, 3}, expected: 5, }, } for key, testCase := range testCases { newUser.OptionsSerialized.PreferredPolicy = testCase.preferred newUser.Group.PolicyList = testCase.available asserts.Equal(testCase.expected, newUser.GetPolicyID(0), "测试用例 #%d 未通过", key) } } func TestUser_GetRemainingCapacity(t *testing.T) { asserts := assert.New(t) newUser := NewUser() cache.Set("pack_size_0", uint64(0), 0) newUser.Group.MaxStorage = 100 asserts.Equal(uint64(100), newUser.GetRemainingCapacity()) newUser.Group.MaxStorage = 100 newUser.Storage = 1 asserts.Equal(uint64(99), newUser.GetRemainingCapacity()) newUser.Group.MaxStorage = 100 newUser.Storage = 100 asserts.Equal(uint64(0), newUser.GetRemainingCapacity()) newUser.Group.MaxStorage = 100 newUser.Storage = 200 asserts.Equal(uint64(0), newUser.GetRemainingCapacity()) cache.Set("pack_size_0", uint64(10), 0) newUser.Group.MaxStorage = 100 newUser.Storage = 101 asserts.Equal(uint64(9), newUser.GetRemainingCapacity()) } func TestUser_DeductionCapacity(t *testing.T) { asserts := assert.New(t) cache.Deletes([]string{"1"}, "policy_") userRows := sqlmock.NewRows([]string{"id", "deleted_at", "storage", "options", "group_id"}). AddRow(1, nil, 0, "{}", 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) newUser, err := GetUserByID(1) newUser.Group.MaxStorage = 100 cache.Set("pack_size_1", uint64(0), 0) asserts.NoError(err) asserts.NoError(mock.ExpectationsWereMet()) asserts.Equal(false, newUser.IncreaseStorage(101)) asserts.Equal(uint64(0), newUser.Storage) asserts.Equal(true, newUser.IncreaseStorage(1)) asserts.Equal(uint64(1), newUser.Storage) asserts.Equal(true, newUser.IncreaseStorage(99)) asserts.Equal(uint64(100), newUser.Storage) asserts.Equal(false, newUser.IncreaseStorage(1)) asserts.Equal(uint64(100), newUser.Storage) cache.Set("pack_size_1", uint64(1), 0) asserts.Equal(true, newUser.IncreaseStorage(1)) asserts.Equal(uint64(101), newUser.Storage) asserts.True(newUser.IncreaseStorage(0)) } func TestUser_DeductionStorage(t *testing.T) { asserts := assert.New(t) // 减少零 { user := User{Storage: 1} asserts.True(user.DeductionStorage(0)) asserts.Equal(uint64(1), user.Storage) } // 正常 { user := User{ Model: gorm.Model{ID: 1}, Storage: 10, } mock.ExpectBegin() mock.ExpectExec("UPDATE(.+)").WithArgs(5, sqlmock.AnyArg(), 1).WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() asserts.True(user.DeductionStorage(5)) asserts.NoError(mock.ExpectationsWereMet()) asserts.Equal(uint64(5), user.Storage) } // 减少的超出可用的 { user := User{ Model: gorm.Model{ID: 1}, Storage: 10, } mock.ExpectBegin() mock.ExpectExec("UPDATE(.+)").WithArgs(0, sqlmock.AnyArg(), 1).WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() asserts.False(user.DeductionStorage(20)) asserts.NoError(mock.ExpectationsWereMet()) asserts.Equal(uint64(0), user.Storage) } } func TestUser_IncreaseStorageWithoutCheck(t *testing.T) { asserts := assert.New(t) // 增加零 { user := User{} user.IncreaseStorageWithoutCheck(0) asserts.Equal(uint64(0), user.Storage) } // 减少零 { user := User{ Model: gorm.Model{ID: 1}, } mock.ExpectBegin() mock.ExpectExec("UPDATE(.+)").WithArgs(10, sqlmock.AnyArg(), 1).WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() user.IncreaseStorageWithoutCheck(10) asserts.NoError(mock.ExpectationsWereMet()) asserts.Equal(uint64(10), user.Storage) } } func TestGetUserByEmail(t *testing.T) { asserts := assert.New(t) mock.ExpectQuery("SELECT(.+)").WithArgs(Active, "abslant@foxmail.com").WillReturnRows(sqlmock.NewRows([]string{"id", "email"})) _, err := GetUserByEmail("abslant@foxmail.com") asserts.Error(err) asserts.NoError(mock.ExpectationsWereMet()) } func TestUser_AfterCreate(t *testing.T) { asserts := assert.New(t) user := User{Model: gorm.Model{ID: 1}} mock.ExpectBegin() mock.ExpectExec("INSERT(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() err := user.AfterCreate(DB) asserts.NoError(err) asserts.NoError(mock.ExpectationsWereMet()) } func TestUser_Root(t *testing.T) { asserts := assert.New(t) user := User{Model: gorm.Model{ID: 1}} // 根目录存在 { mock.ExpectQuery("SELECT(.+)").WithArgs(1).WillReturnRows(sqlmock.NewRows([]string{"id", "name"}).AddRow(1, "根目录")) root, err := user.Root() asserts.NoError(mock.ExpectationsWereMet()) asserts.NoError(err) asserts.Equal("根目录", root.Name) } // 根目录不存在 { mock.ExpectQuery("SELECT(.+)").WithArgs(1).WillReturnRows(sqlmock.NewRows([]string{"id", "name"})) _, err := user.Root() asserts.NoError(mock.ExpectationsWereMet()) asserts.Error(err) } } func TestUser_PayScore(t *testing.T) { asserts := assert.New(t) user := User{Score: 5} asserts.True(user.PayScore(0)) asserts.False(user.PayScore(10)) mock.ExpectBegin() mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() asserts.True(user.PayScore(5)) asserts.EqualValues(0, user.Score) asserts.NoError(mock.ExpectationsWereMet()) } func TestUser_AddScore(t *testing.T) { asserts := assert.New(t) user := User{Score: 5} mock.ExpectBegin() mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() user.AddScore(5) asserts.NoError(mock.ExpectationsWereMet()) asserts.EqualValues(10, user.Score) } func TestNewAnonymousUser(t *testing.T) { asserts := assert.New(t) mock.ExpectQuery("SELECT(.+)").WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(3)) user := NewAnonymousUser() asserts.NoError(mock.ExpectationsWereMet()) asserts.NotNil(user) asserts.EqualValues(3, user.Group.ID) } func TestUser_IsAnonymous(t *testing.T) { asserts := assert.New(t) user := User{} asserts.True(user.IsAnonymous()) 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) } func TestUser_UpdateOptions(t *testing.T) { asserts := assert.New(t) user := User{} mock.ExpectBegin() mock.ExpectExec("UPDATE(.+)").WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() asserts.NoError(user.UpdateOptions()) asserts.NoError(mock.ExpectationsWereMet()) }