code.gitea.io/gitea@v1.22.3/services/user/user_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package user 5 6 import ( 7 "fmt" 8 "strings" 9 "testing" 10 "time" 11 12 "code.gitea.io/gitea/models" 13 "code.gitea.io/gitea/models/auth" 14 "code.gitea.io/gitea/models/db" 15 "code.gitea.io/gitea/models/organization" 16 repo_model "code.gitea.io/gitea/models/repo" 17 "code.gitea.io/gitea/models/unittest" 18 user_model "code.gitea.io/gitea/models/user" 19 "code.gitea.io/gitea/modules/setting" 20 "code.gitea.io/gitea/modules/timeutil" 21 22 "github.com/stretchr/testify/assert" 23 ) 24 25 func TestMain(m *testing.M) { 26 unittest.MainTest(m) 27 } 28 29 func TestDeleteUser(t *testing.T) { 30 test := func(userID int64) { 31 assert.NoError(t, unittest.PrepareTestDatabase()) 32 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID}) 33 34 ownedRepos := make([]*repo_model.Repository, 0, 10) 35 assert.NoError(t, db.GetEngine(db.DefaultContext).Find(&ownedRepos, &repo_model.Repository{OwnerID: userID})) 36 if len(ownedRepos) > 0 { 37 err := DeleteUser(db.DefaultContext, user, false) 38 assert.Error(t, err) 39 assert.True(t, models.IsErrUserOwnRepos(err)) 40 return 41 } 42 43 orgUsers := make([]*organization.OrgUser, 0, 10) 44 assert.NoError(t, db.GetEngine(db.DefaultContext).Find(&orgUsers, &organization.OrgUser{UID: userID})) 45 for _, orgUser := range orgUsers { 46 org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: orgUser.OrgID}) 47 if err := models.RemoveOrgUser(db.DefaultContext, org, user); err != nil { 48 assert.True(t, organization.IsErrLastOrgOwner(err)) 49 return 50 } 51 } 52 assert.NoError(t, DeleteUser(db.DefaultContext, user, false)) 53 unittest.AssertNotExistsBean(t, &user_model.User{ID: userID}) 54 unittest.CheckConsistencyFor(t, &user_model.User{}, &repo_model.Repository{}) 55 } 56 test(2) 57 test(4) 58 test(8) 59 test(11) 60 61 org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) 62 assert.Error(t, DeleteUser(db.DefaultContext, org, false)) 63 } 64 65 func TestPurgeUser(t *testing.T) { 66 test := func(userID int64) { 67 assert.NoError(t, unittest.PrepareTestDatabase()) 68 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID}) 69 70 err := DeleteUser(db.DefaultContext, user, true) 71 assert.NoError(t, err) 72 73 unittest.AssertNotExistsBean(t, &user_model.User{ID: userID}) 74 unittest.CheckConsistencyFor(t, &user_model.User{}, &repo_model.Repository{}) 75 } 76 test(2) 77 test(4) 78 test(8) 79 test(11) 80 81 org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) 82 assert.Error(t, DeleteUser(db.DefaultContext, org, false)) 83 } 84 85 func TestCreateUser(t *testing.T) { 86 user := &user_model.User{ 87 Name: "GiteaBot", 88 Email: "GiteaBot@gitea.io", 89 Passwd: ";p['////..-++']", 90 IsAdmin: false, 91 Theme: setting.UI.DefaultTheme, 92 MustChangePassword: false, 93 } 94 95 assert.NoError(t, user_model.CreateUser(db.DefaultContext, user)) 96 97 assert.NoError(t, DeleteUser(db.DefaultContext, user, false)) 98 } 99 100 func TestRenameUser(t *testing.T) { 101 assert.NoError(t, unittest.PrepareTestDatabase()) 102 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 21}) 103 104 t.Run("Non-Local", func(t *testing.T) { 105 u := &user_model.User{ 106 Type: user_model.UserTypeIndividual, 107 LoginType: auth.OAuth2, 108 } 109 assert.ErrorIs(t, RenameUser(db.DefaultContext, u, "user_rename"), user_model.ErrUserIsNotLocal{}) 110 }) 111 112 t.Run("Same username", func(t *testing.T) { 113 assert.NoError(t, RenameUser(db.DefaultContext, user, user.Name)) 114 }) 115 116 t.Run("Non usable username", func(t *testing.T) { 117 usernames := []string{"--diff", "aa.png", ".well-known", "search", "aaa.atom"} 118 for _, username := range usernames { 119 t.Run(username, func(t *testing.T) { 120 assert.Error(t, user_model.IsUsableUsername(username)) 121 assert.Error(t, RenameUser(db.DefaultContext, user, username)) 122 }) 123 } 124 }) 125 126 t.Run("Only capitalization", func(t *testing.T) { 127 caps := strings.ToUpper(user.Name) 128 unittest.AssertNotExistsBean(t, &user_model.User{ID: user.ID, Name: caps}) 129 unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: user.Name}) 130 131 assert.NoError(t, RenameUser(db.DefaultContext, user, caps)) 132 133 unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: user.ID, Name: caps}) 134 unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: caps}) 135 }) 136 137 t.Run("Already exists", func(t *testing.T) { 138 existUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) 139 140 assert.ErrorIs(t, RenameUser(db.DefaultContext, user, existUser.Name), user_model.ErrUserAlreadyExist{Name: existUser.Name}) 141 assert.ErrorIs(t, RenameUser(db.DefaultContext, user, existUser.LowerName), user_model.ErrUserAlreadyExist{Name: existUser.LowerName}) 142 newUsername := fmt.Sprintf("uSEr%d", existUser.ID) 143 assert.ErrorIs(t, RenameUser(db.DefaultContext, user, newUsername), user_model.ErrUserAlreadyExist{Name: newUsername}) 144 }) 145 146 t.Run("Normal", func(t *testing.T) { 147 oldUsername := user.Name 148 newUsername := "User_Rename" 149 150 assert.NoError(t, RenameUser(db.DefaultContext, user, newUsername)) 151 unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: user.ID, Name: newUsername, LowerName: strings.ToLower(newUsername)}) 152 153 redirectUID, err := user_model.LookupUserRedirect(db.DefaultContext, oldUsername) 154 assert.NoError(t, err) 155 assert.EqualValues(t, user.ID, redirectUID) 156 157 unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: user.Name}) 158 }) 159 } 160 161 func TestCreateUser_Issue5882(t *testing.T) { 162 // Init settings 163 _ = setting.Admin 164 165 passwd := ".//.;1;;//.,-=_" 166 167 tt := []struct { 168 user *user_model.User 169 disableOrgCreation bool 170 }{ 171 {&user_model.User{Name: "GiteaBot", Email: "GiteaBot@gitea.io", Passwd: passwd, MustChangePassword: false}, false}, 172 {&user_model.User{Name: "GiteaBot2", Email: "GiteaBot2@gitea.io", Passwd: passwd, MustChangePassword: false}, true}, 173 } 174 175 setting.Service.DefaultAllowCreateOrganization = true 176 177 for _, v := range tt { 178 setting.Admin.DisableRegularOrgCreation = v.disableOrgCreation 179 180 assert.NoError(t, user_model.CreateUser(db.DefaultContext, v.user)) 181 182 u, err := user_model.GetUserByEmail(db.DefaultContext, v.user.Email) 183 assert.NoError(t, err) 184 185 assert.Equal(t, !u.AllowCreateOrganization, v.disableOrgCreation) 186 187 assert.NoError(t, DeleteUser(db.DefaultContext, v.user, false)) 188 } 189 } 190 191 func TestDeleteInactiveUsers(t *testing.T) { 192 addUser := func(name, email string, createdUnix timeutil.TimeStamp, active bool) { 193 inactiveUser := &user_model.User{Name: name, LowerName: strings.ToLower(name), Email: email, CreatedUnix: createdUnix, IsActive: active} 194 _, err := db.GetEngine(db.DefaultContext).NoAutoTime().Insert(inactiveUser) 195 assert.NoError(t, err) 196 inactiveUserEmail := &user_model.EmailAddress{UID: inactiveUser.ID, IsPrimary: true, Email: email, LowerEmail: strings.ToLower(email), IsActivated: active} 197 err = db.Insert(db.DefaultContext, inactiveUserEmail) 198 assert.NoError(t, err) 199 } 200 addUser("user-inactive-10", "user-inactive-10@test.com", timeutil.TimeStampNow().Add(-600), false) 201 addUser("user-inactive-5", "user-inactive-5@test.com", timeutil.TimeStampNow().Add(-300), false) 202 addUser("user-active-10", "user-active-10@test.com", timeutil.TimeStampNow().Add(-600), true) 203 addUser("user-active-5", "user-active-5@test.com", timeutil.TimeStampNow().Add(-300), true) 204 unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user-inactive-10"}) 205 unittest.AssertExistsAndLoadBean(t, &user_model.EmailAddress{Email: "user-inactive-10@test.com"}) 206 assert.NoError(t, DeleteInactiveUsers(db.DefaultContext, 8*time.Minute)) 207 unittest.AssertNotExistsBean(t, &user_model.User{Name: "user-inactive-10"}) 208 unittest.AssertNotExistsBean(t, &user_model.EmailAddress{Email: "user-inactive-10@test.com"}) 209 unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user-inactive-5"}) 210 unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user-active-10"}) 211 unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user-active-5"}) 212 }