mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Move tests as seperate sub packages to reduce duplicated file names (#19951)
This commit is contained in:
		@@ -2,13 +2,14 @@
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package user
 | 
			
		||||
package user_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
	"code.gitea.io/gitea/models/unittest"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
@@ -17,14 +18,14 @@ import (
 | 
			
		||||
func TestGetEmailAddresses(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	emails, _ := GetEmailAddresses(int64(1))
 | 
			
		||||
	emails, _ := user_model.GetEmailAddresses(int64(1))
 | 
			
		||||
	if assert.Len(t, emails, 3) {
 | 
			
		||||
		assert.True(t, emails[0].IsPrimary)
 | 
			
		||||
		assert.True(t, emails[2].IsActivated)
 | 
			
		||||
		assert.False(t, emails[2].IsPrimary)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	emails, _ = GetEmailAddresses(int64(2))
 | 
			
		||||
	emails, _ = user_model.GetEmailAddresses(int64(2))
 | 
			
		||||
	if assert.Len(t, emails, 2) {
 | 
			
		||||
		assert.True(t, emails[0].IsPrimary)
 | 
			
		||||
		assert.True(t, emails[0].IsActivated)
 | 
			
		||||
@@ -34,18 +35,18 @@ func TestGetEmailAddresses(t *testing.T) {
 | 
			
		||||
func TestIsEmailUsed(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	isExist, _ := IsEmailUsed(db.DefaultContext, "")
 | 
			
		||||
	isExist, _ := user_model.IsEmailUsed(db.DefaultContext, "")
 | 
			
		||||
	assert.True(t, isExist)
 | 
			
		||||
	isExist, _ = IsEmailUsed(db.DefaultContext, "user11@example.com")
 | 
			
		||||
	isExist, _ = user_model.IsEmailUsed(db.DefaultContext, "user11@example.com")
 | 
			
		||||
	assert.True(t, isExist)
 | 
			
		||||
	isExist, _ = IsEmailUsed(db.DefaultContext, "user1234567890@example.com")
 | 
			
		||||
	isExist, _ = user_model.IsEmailUsed(db.DefaultContext, "user1234567890@example.com")
 | 
			
		||||
	assert.False(t, isExist)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestAddEmailAddress(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, AddEmailAddress(db.DefaultContext, &EmailAddress{
 | 
			
		||||
	assert.NoError(t, user_model.AddEmailAddress(db.DefaultContext, &user_model.EmailAddress{
 | 
			
		||||
		Email:       "user1234567890@example.com",
 | 
			
		||||
		LowerEmail:  "user1234567890@example.com",
 | 
			
		||||
		IsPrimary:   true,
 | 
			
		||||
@@ -53,55 +54,55 @@ func TestAddEmailAddress(t *testing.T) {
 | 
			
		||||
	}))
 | 
			
		||||
 | 
			
		||||
	// ErrEmailAlreadyUsed
 | 
			
		||||
	err := AddEmailAddress(db.DefaultContext, &EmailAddress{
 | 
			
		||||
	err := user_model.AddEmailAddress(db.DefaultContext, &user_model.EmailAddress{
 | 
			
		||||
		Email:      "user1234567890@example.com",
 | 
			
		||||
		LowerEmail: "user1234567890@example.com",
 | 
			
		||||
	})
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
	assert.True(t, IsErrEmailAlreadyUsed(err))
 | 
			
		||||
	assert.True(t, user_model.IsErrEmailAlreadyUsed(err))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestAddEmailAddresses(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	// insert multiple email address
 | 
			
		||||
	emails := make([]*EmailAddress, 2)
 | 
			
		||||
	emails[0] = &EmailAddress{
 | 
			
		||||
	emails := make([]*user_model.EmailAddress, 2)
 | 
			
		||||
	emails[0] = &user_model.EmailAddress{
 | 
			
		||||
		Email:       "user1234@example.com",
 | 
			
		||||
		LowerEmail:  "user1234@example.com",
 | 
			
		||||
		IsActivated: true,
 | 
			
		||||
	}
 | 
			
		||||
	emails[1] = &EmailAddress{
 | 
			
		||||
	emails[1] = &user_model.EmailAddress{
 | 
			
		||||
		Email:       "user5678@example.com",
 | 
			
		||||
		LowerEmail:  "user5678@example.com",
 | 
			
		||||
		IsActivated: true,
 | 
			
		||||
	}
 | 
			
		||||
	assert.NoError(t, AddEmailAddresses(emails))
 | 
			
		||||
	assert.NoError(t, user_model.AddEmailAddresses(emails))
 | 
			
		||||
 | 
			
		||||
	// ErrEmailAlreadyUsed
 | 
			
		||||
	err := AddEmailAddresses(emails)
 | 
			
		||||
	err := user_model.AddEmailAddresses(emails)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
	assert.True(t, IsErrEmailAlreadyUsed(err))
 | 
			
		||||
	assert.True(t, user_model.IsErrEmailAlreadyUsed(err))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestDeleteEmailAddress(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, DeleteEmailAddress(&EmailAddress{
 | 
			
		||||
	assert.NoError(t, user_model.DeleteEmailAddress(&user_model.EmailAddress{
 | 
			
		||||
		UID:        int64(1),
 | 
			
		||||
		ID:         int64(33),
 | 
			
		||||
		Email:      "user1-2@example.com",
 | 
			
		||||
		LowerEmail: "user1-2@example.com",
 | 
			
		||||
	}))
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, DeleteEmailAddress(&EmailAddress{
 | 
			
		||||
	assert.NoError(t, user_model.DeleteEmailAddress(&user_model.EmailAddress{
 | 
			
		||||
		UID:        int64(1),
 | 
			
		||||
		Email:      "user1-3@example.com",
 | 
			
		||||
		LowerEmail: "user1-3@example.com",
 | 
			
		||||
	}))
 | 
			
		||||
 | 
			
		||||
	// Email address does not exist
 | 
			
		||||
	err := DeleteEmailAddress(&EmailAddress{
 | 
			
		||||
	err := user_model.DeleteEmailAddress(&user_model.EmailAddress{
 | 
			
		||||
		UID:        int64(1),
 | 
			
		||||
		Email:      "user1234567890@example.com",
 | 
			
		||||
		LowerEmail: "user1234567890@example.com",
 | 
			
		||||
@@ -113,70 +114,70 @@ func TestDeleteEmailAddresses(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	// delete multiple email address
 | 
			
		||||
	emails := make([]*EmailAddress, 2)
 | 
			
		||||
	emails[0] = &EmailAddress{
 | 
			
		||||
	emails := make([]*user_model.EmailAddress, 2)
 | 
			
		||||
	emails[0] = &user_model.EmailAddress{
 | 
			
		||||
		UID:        int64(2),
 | 
			
		||||
		ID:         int64(3),
 | 
			
		||||
		Email:      "user2@example.com",
 | 
			
		||||
		LowerEmail: "user2@example.com",
 | 
			
		||||
	}
 | 
			
		||||
	emails[1] = &EmailAddress{
 | 
			
		||||
	emails[1] = &user_model.EmailAddress{
 | 
			
		||||
		UID:        int64(2),
 | 
			
		||||
		Email:      "user2-2@example.com",
 | 
			
		||||
		LowerEmail: "user2-2@example.com",
 | 
			
		||||
	}
 | 
			
		||||
	assert.NoError(t, DeleteEmailAddresses(emails))
 | 
			
		||||
	assert.NoError(t, user_model.DeleteEmailAddresses(emails))
 | 
			
		||||
 | 
			
		||||
	// ErrEmailAlreadyUsed
 | 
			
		||||
	err := DeleteEmailAddresses(emails)
 | 
			
		||||
	err := user_model.DeleteEmailAddresses(emails)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMakeEmailPrimary(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	email := &EmailAddress{
 | 
			
		||||
	email := &user_model.EmailAddress{
 | 
			
		||||
		Email: "user567890@example.com",
 | 
			
		||||
	}
 | 
			
		||||
	err := MakeEmailPrimary(email)
 | 
			
		||||
	err := user_model.MakeEmailPrimary(email)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
	assert.EqualError(t, err, ErrEmailAddressNotExist{Email: email.Email}.Error())
 | 
			
		||||
	assert.EqualError(t, err, user_model.ErrEmailAddressNotExist{Email: email.Email}.Error())
 | 
			
		||||
 | 
			
		||||
	email = &EmailAddress{
 | 
			
		||||
	email = &user_model.EmailAddress{
 | 
			
		||||
		Email: "user11@example.com",
 | 
			
		||||
	}
 | 
			
		||||
	err = MakeEmailPrimary(email)
 | 
			
		||||
	err = user_model.MakeEmailPrimary(email)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
	assert.EqualError(t, err, ErrEmailNotActivated.Error())
 | 
			
		||||
	assert.EqualError(t, err, user_model.ErrEmailNotActivated.Error())
 | 
			
		||||
 | 
			
		||||
	email = &EmailAddress{
 | 
			
		||||
	email = &user_model.EmailAddress{
 | 
			
		||||
		Email: "user9999999@example.com",
 | 
			
		||||
	}
 | 
			
		||||
	err = MakeEmailPrimary(email)
 | 
			
		||||
	err = user_model.MakeEmailPrimary(email)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
	assert.True(t, IsErrUserNotExist(err))
 | 
			
		||||
	assert.True(t, user_model.IsErrUserNotExist(err))
 | 
			
		||||
 | 
			
		||||
	email = &EmailAddress{
 | 
			
		||||
	email = &user_model.EmailAddress{
 | 
			
		||||
		Email: "user101@example.com",
 | 
			
		||||
	}
 | 
			
		||||
	err = MakeEmailPrimary(email)
 | 
			
		||||
	err = user_model.MakeEmailPrimary(email)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	user, _ := GetUserByID(int64(10))
 | 
			
		||||
	user, _ := user_model.GetUserByID(int64(10))
 | 
			
		||||
	assert.Equal(t, "user101@example.com", user.Email)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestActivate(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	email := &EmailAddress{
 | 
			
		||||
	email := &user_model.EmailAddress{
 | 
			
		||||
		ID:    int64(1),
 | 
			
		||||
		UID:   int64(1),
 | 
			
		||||
		Email: "user11@example.com",
 | 
			
		||||
	}
 | 
			
		||||
	assert.NoError(t, ActivateEmail(email))
 | 
			
		||||
	assert.NoError(t, user_model.ActivateEmail(email))
 | 
			
		||||
 | 
			
		||||
	emails, _ := GetEmailAddresses(int64(1))
 | 
			
		||||
	emails, _ := user_model.GetEmailAddresses(int64(1))
 | 
			
		||||
	assert.Len(t, emails, 3)
 | 
			
		||||
	assert.True(t, emails[0].IsActivated)
 | 
			
		||||
	assert.True(t, emails[0].IsPrimary)
 | 
			
		||||
@@ -189,17 +190,17 @@ func TestListEmails(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	// Must find all users and their emails
 | 
			
		||||
	opts := &SearchEmailOptions{
 | 
			
		||||
	opts := &user_model.SearchEmailOptions{
 | 
			
		||||
		ListOptions: db.ListOptions{
 | 
			
		||||
			PageSize: 10000,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	emails, count, err := SearchEmails(opts)
 | 
			
		||||
	emails, count, err := user_model.SearchEmails(opts)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.NotEqual(t, int64(0), count)
 | 
			
		||||
	assert.True(t, count > 5)
 | 
			
		||||
 | 
			
		||||
	contains := func(match func(s *SearchEmailResult) bool) bool {
 | 
			
		||||
	contains := func(match func(s *user_model.SearchEmailResult) bool) bool {
 | 
			
		||||
		for _, v := range emails {
 | 
			
		||||
			if match(v) {
 | 
			
		||||
				return true
 | 
			
		||||
@@ -208,46 +209,46 @@ func TestListEmails(t *testing.T) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	assert.True(t, contains(func(s *SearchEmailResult) bool { return s.UID == 18 }))
 | 
			
		||||
	assert.True(t, contains(func(s *user_model.SearchEmailResult) bool { return s.UID == 18 }))
 | 
			
		||||
	// 'user3' is an organization
 | 
			
		||||
	assert.False(t, contains(func(s *SearchEmailResult) bool { return s.UID == 3 }))
 | 
			
		||||
	assert.False(t, contains(func(s *user_model.SearchEmailResult) bool { return s.UID == 3 }))
 | 
			
		||||
 | 
			
		||||
	// Must find no records
 | 
			
		||||
	opts = &SearchEmailOptions{Keyword: "NOTFOUND"}
 | 
			
		||||
	emails, count, err = SearchEmails(opts)
 | 
			
		||||
	opts = &user_model.SearchEmailOptions{Keyword: "NOTFOUND"}
 | 
			
		||||
	emails, count, err = user_model.SearchEmails(opts)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Equal(t, int64(0), count)
 | 
			
		||||
 | 
			
		||||
	// Must find users 'user2', 'user28', etc.
 | 
			
		||||
	opts = &SearchEmailOptions{Keyword: "user2"}
 | 
			
		||||
	emails, count, err = SearchEmails(opts)
 | 
			
		||||
	opts = &user_model.SearchEmailOptions{Keyword: "user2"}
 | 
			
		||||
	emails, count, err = user_model.SearchEmails(opts)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.NotEqual(t, int64(0), count)
 | 
			
		||||
	assert.True(t, contains(func(s *SearchEmailResult) bool { return s.UID == 2 }))
 | 
			
		||||
	assert.True(t, contains(func(s *SearchEmailResult) bool { return s.UID == 27 }))
 | 
			
		||||
	assert.True(t, contains(func(s *user_model.SearchEmailResult) bool { return s.UID == 2 }))
 | 
			
		||||
	assert.True(t, contains(func(s *user_model.SearchEmailResult) bool { return s.UID == 27 }))
 | 
			
		||||
 | 
			
		||||
	// Must find only primary addresses (i.e. from the `user` table)
 | 
			
		||||
	opts = &SearchEmailOptions{IsPrimary: util.OptionalBoolTrue}
 | 
			
		||||
	emails, _, err = SearchEmails(opts)
 | 
			
		||||
	opts = &user_model.SearchEmailOptions{IsPrimary: util.OptionalBoolTrue}
 | 
			
		||||
	emails, _, err = user_model.SearchEmails(opts)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.True(t, contains(func(s *SearchEmailResult) bool { return s.IsPrimary }))
 | 
			
		||||
	assert.False(t, contains(func(s *SearchEmailResult) bool { return !s.IsPrimary }))
 | 
			
		||||
	assert.True(t, contains(func(s *user_model.SearchEmailResult) bool { return s.IsPrimary }))
 | 
			
		||||
	assert.False(t, contains(func(s *user_model.SearchEmailResult) bool { return !s.IsPrimary }))
 | 
			
		||||
 | 
			
		||||
	// Must find only inactive addresses (i.e. not validated)
 | 
			
		||||
	opts = &SearchEmailOptions{IsActivated: util.OptionalBoolFalse}
 | 
			
		||||
	emails, _, err = SearchEmails(opts)
 | 
			
		||||
	opts = &user_model.SearchEmailOptions{IsActivated: util.OptionalBoolFalse}
 | 
			
		||||
	emails, _, err = user_model.SearchEmails(opts)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.True(t, contains(func(s *SearchEmailResult) bool { return !s.IsActivated }))
 | 
			
		||||
	assert.False(t, contains(func(s *SearchEmailResult) bool { return s.IsActivated }))
 | 
			
		||||
	assert.True(t, contains(func(s *user_model.SearchEmailResult) bool { return !s.IsActivated }))
 | 
			
		||||
	assert.False(t, contains(func(s *user_model.SearchEmailResult) bool { return s.IsActivated }))
 | 
			
		||||
 | 
			
		||||
	// Must find more than one page, but retrieve only one
 | 
			
		||||
	opts = &SearchEmailOptions{
 | 
			
		||||
	opts = &user_model.SearchEmailOptions{
 | 
			
		||||
		ListOptions: db.ListOptions{
 | 
			
		||||
			PageSize: 5,
 | 
			
		||||
			Page:     1,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	emails, count, err = SearchEmails(opts)
 | 
			
		||||
	emails, count, err = user_model.SearchEmails(opts)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Len(t, emails, 5)
 | 
			
		||||
	assert.Greater(t, count, int64(len(emails)))
 | 
			
		||||
@@ -278,32 +279,32 @@ func TestEmailAddressValidate(t *testing.T) {
 | 
			
		||||
		`first|last@iana.org`:            nil,
 | 
			
		||||
		`first}last@iana.org`:            nil,
 | 
			
		||||
		`first~last@iana.org`:            nil,
 | 
			
		||||
		`first;last@iana.org`:            ErrEmailCharIsNotSupported{`first;last@iana.org`},
 | 
			
		||||
		".233@qq.com":                    ErrEmailInvalid{".233@qq.com"},
 | 
			
		||||
		"!233@qq.com":                    ErrEmailInvalid{"!233@qq.com"},
 | 
			
		||||
		"#233@qq.com":                    ErrEmailInvalid{"#233@qq.com"},
 | 
			
		||||
		"$233@qq.com":                    ErrEmailInvalid{"$233@qq.com"},
 | 
			
		||||
		"%233@qq.com":                    ErrEmailInvalid{"%233@qq.com"},
 | 
			
		||||
		"&233@qq.com":                    ErrEmailInvalid{"&233@qq.com"},
 | 
			
		||||
		"'233@qq.com":                    ErrEmailInvalid{"'233@qq.com"},
 | 
			
		||||
		"*233@qq.com":                    ErrEmailInvalid{"*233@qq.com"},
 | 
			
		||||
		"+233@qq.com":                    ErrEmailInvalid{"+233@qq.com"},
 | 
			
		||||
		"/233@qq.com":                    ErrEmailInvalid{"/233@qq.com"},
 | 
			
		||||
		"=233@qq.com":                    ErrEmailInvalid{"=233@qq.com"},
 | 
			
		||||
		"?233@qq.com":                    ErrEmailInvalid{"?233@qq.com"},
 | 
			
		||||
		"^233@qq.com":                    ErrEmailInvalid{"^233@qq.com"},
 | 
			
		||||
		"`233@qq.com":                    ErrEmailInvalid{"`233@qq.com"},
 | 
			
		||||
		"{233@qq.com":                    ErrEmailInvalid{"{233@qq.com"},
 | 
			
		||||
		"|233@qq.com":                    ErrEmailInvalid{"|233@qq.com"},
 | 
			
		||||
		"}233@qq.com":                    ErrEmailInvalid{"}233@qq.com"},
 | 
			
		||||
		"~233@qq.com":                    ErrEmailInvalid{"~233@qq.com"},
 | 
			
		||||
		";233@qq.com":                    ErrEmailCharIsNotSupported{";233@qq.com"},
 | 
			
		||||
		"Foo <foo@bar.com>":              ErrEmailCharIsNotSupported{"Foo <foo@bar.com>"},
 | 
			
		||||
		string([]byte{0xE2, 0x84, 0xAA}): ErrEmailCharIsNotSupported{string([]byte{0xE2, 0x84, 0xAA})},
 | 
			
		||||
		`first;last@iana.org`:            user_model.ErrEmailCharIsNotSupported{`first;last@iana.org`},
 | 
			
		||||
		".233@qq.com":                    user_model.ErrEmailInvalid{".233@qq.com"},
 | 
			
		||||
		"!233@qq.com":                    user_model.ErrEmailInvalid{"!233@qq.com"},
 | 
			
		||||
		"#233@qq.com":                    user_model.ErrEmailInvalid{"#233@qq.com"},
 | 
			
		||||
		"$233@qq.com":                    user_model.ErrEmailInvalid{"$233@qq.com"},
 | 
			
		||||
		"%233@qq.com":                    user_model.ErrEmailInvalid{"%233@qq.com"},
 | 
			
		||||
		"&233@qq.com":                    user_model.ErrEmailInvalid{"&233@qq.com"},
 | 
			
		||||
		"'233@qq.com":                    user_model.ErrEmailInvalid{"'233@qq.com"},
 | 
			
		||||
		"*233@qq.com":                    user_model.ErrEmailInvalid{"*233@qq.com"},
 | 
			
		||||
		"+233@qq.com":                    user_model.ErrEmailInvalid{"+233@qq.com"},
 | 
			
		||||
		"/233@qq.com":                    user_model.ErrEmailInvalid{"/233@qq.com"},
 | 
			
		||||
		"=233@qq.com":                    user_model.ErrEmailInvalid{"=233@qq.com"},
 | 
			
		||||
		"?233@qq.com":                    user_model.ErrEmailInvalid{"?233@qq.com"},
 | 
			
		||||
		"^233@qq.com":                    user_model.ErrEmailInvalid{"^233@qq.com"},
 | 
			
		||||
		"`233@qq.com":                    user_model.ErrEmailInvalid{"`233@qq.com"},
 | 
			
		||||
		"{233@qq.com":                    user_model.ErrEmailInvalid{"{233@qq.com"},
 | 
			
		||||
		"|233@qq.com":                    user_model.ErrEmailInvalid{"|233@qq.com"},
 | 
			
		||||
		"}233@qq.com":                    user_model.ErrEmailInvalid{"}233@qq.com"},
 | 
			
		||||
		"~233@qq.com":                    user_model.ErrEmailInvalid{"~233@qq.com"},
 | 
			
		||||
		";233@qq.com":                    user_model.ErrEmailCharIsNotSupported{";233@qq.com"},
 | 
			
		||||
		"Foo <foo@bar.com>":              user_model.ErrEmailCharIsNotSupported{"Foo <foo@bar.com>"},
 | 
			
		||||
		string([]byte{0xE2, 0x84, 0xAA}): user_model.ErrEmailCharIsNotSupported{string([]byte{0xE2, 0x84, 0xAA})},
 | 
			
		||||
	}
 | 
			
		||||
	for kase, err := range kases {
 | 
			
		||||
		t.Run(kase, func(t *testing.T) {
 | 
			
		||||
			assert.EqualValues(t, err, ValidateEmail(kase))
 | 
			
		||||
			assert.EqualValues(t, err, user_model.ValidateEmail(kase))
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,21 +2,22 @@
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package user
 | 
			
		||||
package user_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/unittest"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestIsFollowing(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
	assert.True(t, IsFollowing(4, 2))
 | 
			
		||||
	assert.False(t, IsFollowing(2, 4))
 | 
			
		||||
	assert.False(t, IsFollowing(5, unittest.NonexistentID))
 | 
			
		||||
	assert.False(t, IsFollowing(unittest.NonexistentID, 5))
 | 
			
		||||
	assert.False(t, IsFollowing(unittest.NonexistentID, unittest.NonexistentID))
 | 
			
		||||
	assert.True(t, user_model.IsFollowing(4, 2))
 | 
			
		||||
	assert.False(t, user_model.IsFollowing(2, 4))
 | 
			
		||||
	assert.False(t, user_model.IsFollowing(5, unittest.NonexistentID))
 | 
			
		||||
	assert.False(t, user_model.IsFollowing(unittest.NonexistentID, 5))
 | 
			
		||||
	assert.False(t, user_model.IsFollowing(unittest.NonexistentID, unittest.NonexistentID))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,26 +2,20 @@
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package user
 | 
			
		||||
package user_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/unittest"
 | 
			
		||||
 | 
			
		||||
	_ "code.gitea.io/gitea/models"
 | 
			
		||||
	_ "code.gitea.io/gitea/models/user"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestMain(m *testing.M) {
 | 
			
		||||
	unittest.MainTest(m, &unittest.TestOptions{
 | 
			
		||||
		GiteaRootPath: filepath.Join("..", ".."),
 | 
			
		||||
		FixtureFiles: []string{
 | 
			
		||||
			"email_address.yml",
 | 
			
		||||
			"user_redirect.yml",
 | 
			
		||||
			"follow.yml",
 | 
			
		||||
			"user_open_id.yml",
 | 
			
		||||
			"two_factor.yml",
 | 
			
		||||
			"oauth2_application.yml",
 | 
			
		||||
			"user.yml",
 | 
			
		||||
		},
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,13 @@
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package user
 | 
			
		||||
package user_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/unittest"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
@@ -15,7 +16,7 @@ import (
 | 
			
		||||
func TestGetUserOpenIDs(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	oids, err := GetUserOpenIDs(int64(1))
 | 
			
		||||
	oids, err := user_model.GetUserOpenIDs(int64(1))
 | 
			
		||||
	if assert.NoError(t, err) && assert.Len(t, oids, 2) {
 | 
			
		||||
		assert.Equal(t, "https://user1.domain1.tld/", oids[0].URI)
 | 
			
		||||
		assert.False(t, oids[0].Show)
 | 
			
		||||
@@ -23,7 +24,7 @@ func TestGetUserOpenIDs(t *testing.T) {
 | 
			
		||||
		assert.True(t, oids[1].Show)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	oids, err = GetUserOpenIDs(int64(2))
 | 
			
		||||
	oids, err = user_model.GetUserOpenIDs(int64(2))
 | 
			
		||||
	if assert.NoError(t, err) && assert.Len(t, oids, 1) {
 | 
			
		||||
		assert.Equal(t, "https://domain1.tld/user2/", oids[0].URI)
 | 
			
		||||
		assert.True(t, oids[0].Show)
 | 
			
		||||
@@ -32,28 +33,28 @@ func TestGetUserOpenIDs(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
func TestToggleUserOpenIDVisibility(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
	oids, err := GetUserOpenIDs(int64(2))
 | 
			
		||||
	oids, err := user_model.GetUserOpenIDs(int64(2))
 | 
			
		||||
	if !assert.NoError(t, err) || !assert.Len(t, oids, 1) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	assert.True(t, oids[0].Show)
 | 
			
		||||
 | 
			
		||||
	err = ToggleUserOpenIDVisibility(oids[0].ID)
 | 
			
		||||
	err = user_model.ToggleUserOpenIDVisibility(oids[0].ID)
 | 
			
		||||
	if !assert.NoError(t, err) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	oids, err = GetUserOpenIDs(int64(2))
 | 
			
		||||
	oids, err = user_model.GetUserOpenIDs(int64(2))
 | 
			
		||||
	if !assert.NoError(t, err) || !assert.Len(t, oids, 1) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	assert.False(t, oids[0].Show)
 | 
			
		||||
	err = ToggleUserOpenIDVisibility(oids[0].ID)
 | 
			
		||||
	err = user_model.ToggleUserOpenIDVisibility(oids[0].ID)
 | 
			
		||||
	if !assert.NoError(t, err) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	oids, err = GetUserOpenIDs(int64(2))
 | 
			
		||||
	oids, err = user_model.GetUserOpenIDs(int64(2))
 | 
			
		||||
	if !assert.NoError(t, err) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,13 @@
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package user
 | 
			
		||||
package user_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/unittest"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
@@ -15,10 +16,10 @@ import (
 | 
			
		||||
func TestLookupUserRedirect(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	userID, err := LookupUserRedirect("olduser1")
 | 
			
		||||
	userID, err := user_model.LookupUserRedirect("olduser1")
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.EqualValues(t, 1, userID)
 | 
			
		||||
 | 
			
		||||
	_, err = LookupUserRedirect("doesnotexist")
 | 
			
		||||
	assert.True(t, IsErrUserRedirectNotExist(err))
 | 
			
		||||
	_, err = user_model.LookupUserRedirect("doesnotexist")
 | 
			
		||||
	assert.True(t, user_model.IsErrUserRedirectNotExist(err))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,13 @@
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package user
 | 
			
		||||
package user_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/unittest"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
@@ -16,44 +17,44 @@ func TestSettings(t *testing.T) {
 | 
			
		||||
	keyName := "test_user_setting"
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	newSetting := &Setting{UserID: 99, SettingKey: keyName, SettingValue: "Gitea User Setting Test"}
 | 
			
		||||
	newSetting := &user_model.Setting{UserID: 99, SettingKey: keyName, SettingValue: "Gitea User Setting Test"}
 | 
			
		||||
 | 
			
		||||
	// create setting
 | 
			
		||||
	err := SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue)
 | 
			
		||||
	err := user_model.SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	// test about saving unchanged values
 | 
			
		||||
	err = SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue)
 | 
			
		||||
	err = user_model.SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	// get specific setting
 | 
			
		||||
	settings, err := GetUserSettings(99, []string{keyName})
 | 
			
		||||
	settings, err := user_model.GetUserSettings(99, []string{keyName})
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Len(t, settings, 1)
 | 
			
		||||
	assert.EqualValues(t, newSetting.SettingValue, settings[keyName].SettingValue)
 | 
			
		||||
 | 
			
		||||
	settingValue, err := GetUserSetting(99, keyName)
 | 
			
		||||
	settingValue, err := user_model.GetUserSetting(99, keyName)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.EqualValues(t, newSetting.SettingValue, settingValue)
 | 
			
		||||
 | 
			
		||||
	settingValue, err = GetUserSetting(99, "no_such")
 | 
			
		||||
	settingValue, err = user_model.GetUserSetting(99, "no_such")
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.EqualValues(t, "", settingValue)
 | 
			
		||||
 | 
			
		||||
	// updated setting
 | 
			
		||||
	updatedSetting := &Setting{UserID: 99, SettingKey: keyName, SettingValue: "Updated"}
 | 
			
		||||
	err = SetUserSetting(updatedSetting.UserID, updatedSetting.SettingKey, updatedSetting.SettingValue)
 | 
			
		||||
	updatedSetting := &user_model.Setting{UserID: 99, SettingKey: keyName, SettingValue: "Updated"}
 | 
			
		||||
	err = user_model.SetUserSetting(updatedSetting.UserID, updatedSetting.SettingKey, updatedSetting.SettingValue)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	// get all settings
 | 
			
		||||
	settings, err = GetUserAllSettings(99)
 | 
			
		||||
	settings, err = user_model.GetUserAllSettings(99)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Len(t, settings, 1)
 | 
			
		||||
	assert.EqualValues(t, updatedSetting.SettingValue, settings[updatedSetting.SettingKey].SettingValue)
 | 
			
		||||
 | 
			
		||||
	// delete setting
 | 
			
		||||
	err = DeleteUserSetting(99, keyName)
 | 
			
		||||
	err = user_model.DeleteUserSetting(99, keyName)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	settings, err = GetUserAllSettings(99)
 | 
			
		||||
	settings, err = user_model.GetUserAllSettings(99)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Len(t, settings, 0)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
// Use of this source code is governed by a MIT-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package user
 | 
			
		||||
package user_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"math/rand"
 | 
			
		||||
@@ -12,6 +12,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/models/auth"
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
	"code.gitea.io/gitea/models/unittest"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
@@ -22,7 +23,7 @@ import (
 | 
			
		||||
func TestOAuth2Application_LoadUser(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
	app := unittest.AssertExistsAndLoadBean(t, &auth.OAuth2Application{ID: 1}).(*auth.OAuth2Application)
 | 
			
		||||
	user, err := GetUserByID(app.UID)
 | 
			
		||||
	user, err := user_model.GetUserByID(app.UID)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.NotNil(t, user)
 | 
			
		||||
}
 | 
			
		||||
@@ -31,19 +32,19 @@ func TestGetUserEmailsByNames(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	// ignore none active user email
 | 
			
		||||
	assert.Equal(t, []string{"user8@example.com"}, GetUserEmailsByNames(db.DefaultContext, []string{"user8", "user9"}))
 | 
			
		||||
	assert.Equal(t, []string{"user8@example.com", "user5@example.com"}, GetUserEmailsByNames(db.DefaultContext, []string{"user8", "user5"}))
 | 
			
		||||
	assert.Equal(t, []string{"user8@example.com"}, user_model.GetUserEmailsByNames(db.DefaultContext, []string{"user8", "user9"}))
 | 
			
		||||
	assert.Equal(t, []string{"user8@example.com", "user5@example.com"}, user_model.GetUserEmailsByNames(db.DefaultContext, []string{"user8", "user5"}))
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, []string{"user8@example.com"}, GetUserEmailsByNames(db.DefaultContext, []string{"user8", "user7"}))
 | 
			
		||||
	assert.Equal(t, []string{"user8@example.com"}, user_model.GetUserEmailsByNames(db.DefaultContext, []string{"user8", "user7"}))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCanCreateOrganization(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	admin := unittest.AssertExistsAndLoadBean(t, &User{ID: 1}).(*User)
 | 
			
		||||
	admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User)
 | 
			
		||||
	assert.True(t, admin.CanCreateOrganization())
 | 
			
		||||
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
 | 
			
		||||
	assert.True(t, user.CanCreateOrganization())
 | 
			
		||||
	// Disable user create organization permission.
 | 
			
		||||
	user.AllowCreateOrganization = false
 | 
			
		||||
@@ -57,8 +58,8 @@ func TestCanCreateOrganization(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
func TestSearchUsers(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
	testSuccess := func(opts *SearchUserOptions, expectedUserOrOrgIDs []int64) {
 | 
			
		||||
		users, _, err := SearchUsers(opts)
 | 
			
		||||
	testSuccess := func(opts *user_model.SearchUserOptions, expectedUserOrOrgIDs []int64) {
 | 
			
		||||
		users, _, err := user_model.SearchUsers(opts)
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		if assert.Len(t, users, len(expectedUserOrOrgIDs), opts) {
 | 
			
		||||
			for i, expectedID := range expectedUserOrOrgIDs {
 | 
			
		||||
@@ -68,58 +69,58 @@ func TestSearchUsers(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// test orgs
 | 
			
		||||
	testOrgSuccess := func(opts *SearchUserOptions, expectedOrgIDs []int64) {
 | 
			
		||||
		opts.Type = UserTypeOrganization
 | 
			
		||||
	testOrgSuccess := func(opts *user_model.SearchUserOptions, expectedOrgIDs []int64) {
 | 
			
		||||
		opts.Type = user_model.UserTypeOrganization
 | 
			
		||||
		testSuccess(opts, expectedOrgIDs)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	testOrgSuccess(&SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1, PageSize: 2}},
 | 
			
		||||
	testOrgSuccess(&user_model.SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1, PageSize: 2}},
 | 
			
		||||
		[]int64{3, 6})
 | 
			
		||||
 | 
			
		||||
	testOrgSuccess(&SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 2, PageSize: 2}},
 | 
			
		||||
	testOrgSuccess(&user_model.SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 2, PageSize: 2}},
 | 
			
		||||
		[]int64{7, 17})
 | 
			
		||||
 | 
			
		||||
	testOrgSuccess(&SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 3, PageSize: 2}},
 | 
			
		||||
	testOrgSuccess(&user_model.SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 3, PageSize: 2}},
 | 
			
		||||
		[]int64{19, 25})
 | 
			
		||||
 | 
			
		||||
	testOrgSuccess(&SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 4, PageSize: 2}},
 | 
			
		||||
	testOrgSuccess(&user_model.SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 4, PageSize: 2}},
 | 
			
		||||
		[]int64{26})
 | 
			
		||||
 | 
			
		||||
	testOrgSuccess(&SearchUserOptions{ListOptions: db.ListOptions{Page: 5, PageSize: 2}},
 | 
			
		||||
	testOrgSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 5, PageSize: 2}},
 | 
			
		||||
		[]int64{})
 | 
			
		||||
 | 
			
		||||
	// test users
 | 
			
		||||
	testUserSuccess := func(opts *SearchUserOptions, expectedUserIDs []int64) {
 | 
			
		||||
		opts.Type = UserTypeIndividual
 | 
			
		||||
	testUserSuccess := func(opts *user_model.SearchUserOptions, expectedUserIDs []int64) {
 | 
			
		||||
		opts.Type = user_model.UserTypeIndividual
 | 
			
		||||
		testSuccess(opts, expectedUserIDs)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	testUserSuccess(&SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1}},
 | 
			
		||||
	testUserSuccess(&user_model.SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1}},
 | 
			
		||||
		[]int64{1, 2, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21, 24, 27, 28, 29, 30, 32})
 | 
			
		||||
 | 
			
		||||
	testUserSuccess(&SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolFalse},
 | 
			
		||||
	testUserSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolFalse},
 | 
			
		||||
		[]int64{9})
 | 
			
		||||
 | 
			
		||||
	testUserSuccess(&SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolTrue},
 | 
			
		||||
	testUserSuccess(&user_model.SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolTrue},
 | 
			
		||||
		[]int64{1, 2, 4, 5, 8, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21, 24, 28, 29, 30, 32})
 | 
			
		||||
 | 
			
		||||
	testUserSuccess(&SearchUserOptions{Keyword: "user1", OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolTrue},
 | 
			
		||||
	testUserSuccess(&user_model.SearchUserOptions{Keyword: "user1", OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolTrue},
 | 
			
		||||
		[]int64{1, 10, 11, 12, 13, 14, 15, 16, 18})
 | 
			
		||||
 | 
			
		||||
	// order by name asc default
 | 
			
		||||
	testUserSuccess(&SearchUserOptions{Keyword: "user1", ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolTrue},
 | 
			
		||||
	testUserSuccess(&user_model.SearchUserOptions{Keyword: "user1", ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolTrue},
 | 
			
		||||
		[]int64{1, 10, 11, 12, 13, 14, 15, 16, 18})
 | 
			
		||||
 | 
			
		||||
	testUserSuccess(&SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsAdmin: util.OptionalBoolTrue},
 | 
			
		||||
	testUserSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsAdmin: util.OptionalBoolTrue},
 | 
			
		||||
		[]int64{1})
 | 
			
		||||
 | 
			
		||||
	testUserSuccess(&SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsRestricted: util.OptionalBoolTrue},
 | 
			
		||||
	testUserSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsRestricted: util.OptionalBoolTrue},
 | 
			
		||||
		[]int64{29, 30})
 | 
			
		||||
 | 
			
		||||
	testUserSuccess(&SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsProhibitLogin: util.OptionalBoolTrue},
 | 
			
		||||
	testUserSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsProhibitLogin: util.OptionalBoolTrue},
 | 
			
		||||
		[]int64{30})
 | 
			
		||||
 | 
			
		||||
	testUserSuccess(&SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsTwoFactorEnabled: util.OptionalBoolTrue},
 | 
			
		||||
	testUserSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsTwoFactorEnabled: util.OptionalBoolTrue},
 | 
			
		||||
		[]int64{24})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -130,34 +131,34 @@ func TestEmailNotificationPreferences(t *testing.T) {
 | 
			
		||||
		expected string
 | 
			
		||||
		userID   int64
 | 
			
		||||
	}{
 | 
			
		||||
		{EmailNotificationsEnabled, 1},
 | 
			
		||||
		{EmailNotificationsEnabled, 2},
 | 
			
		||||
		{EmailNotificationsOnMention, 3},
 | 
			
		||||
		{EmailNotificationsOnMention, 4},
 | 
			
		||||
		{EmailNotificationsEnabled, 5},
 | 
			
		||||
		{EmailNotificationsEnabled, 6},
 | 
			
		||||
		{EmailNotificationsDisabled, 7},
 | 
			
		||||
		{EmailNotificationsEnabled, 8},
 | 
			
		||||
		{EmailNotificationsOnMention, 9},
 | 
			
		||||
		{user_model.EmailNotificationsEnabled, 1},
 | 
			
		||||
		{user_model.EmailNotificationsEnabled, 2},
 | 
			
		||||
		{user_model.EmailNotificationsOnMention, 3},
 | 
			
		||||
		{user_model.EmailNotificationsOnMention, 4},
 | 
			
		||||
		{user_model.EmailNotificationsEnabled, 5},
 | 
			
		||||
		{user_model.EmailNotificationsEnabled, 6},
 | 
			
		||||
		{user_model.EmailNotificationsDisabled, 7},
 | 
			
		||||
		{user_model.EmailNotificationsEnabled, 8},
 | 
			
		||||
		{user_model.EmailNotificationsOnMention, 9},
 | 
			
		||||
	} {
 | 
			
		||||
		user := unittest.AssertExistsAndLoadBean(t, &User{ID: test.userID}).(*User)
 | 
			
		||||
		user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: test.userID}).(*user_model.User)
 | 
			
		||||
		assert.Equal(t, test.expected, user.EmailNotifications())
 | 
			
		||||
 | 
			
		||||
		// Try all possible settings
 | 
			
		||||
		assert.NoError(t, SetEmailNotifications(user, EmailNotificationsEnabled))
 | 
			
		||||
		assert.Equal(t, EmailNotificationsEnabled, user.EmailNotifications())
 | 
			
		||||
		assert.NoError(t, user_model.SetEmailNotifications(user, user_model.EmailNotificationsEnabled))
 | 
			
		||||
		assert.Equal(t, user_model.EmailNotificationsEnabled, user.EmailNotifications())
 | 
			
		||||
 | 
			
		||||
		assert.NoError(t, SetEmailNotifications(user, EmailNotificationsOnMention))
 | 
			
		||||
		assert.Equal(t, EmailNotificationsOnMention, user.EmailNotifications())
 | 
			
		||||
		assert.NoError(t, user_model.SetEmailNotifications(user, user_model.EmailNotificationsOnMention))
 | 
			
		||||
		assert.Equal(t, user_model.EmailNotificationsOnMention, user.EmailNotifications())
 | 
			
		||||
 | 
			
		||||
		assert.NoError(t, SetEmailNotifications(user, EmailNotificationsDisabled))
 | 
			
		||||
		assert.Equal(t, EmailNotificationsDisabled, user.EmailNotifications())
 | 
			
		||||
		assert.NoError(t, user_model.SetEmailNotifications(user, user_model.EmailNotificationsDisabled))
 | 
			
		||||
		assert.Equal(t, user_model.EmailNotificationsDisabled, user.EmailNotifications())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestHashPasswordDeterministic(t *testing.T) {
 | 
			
		||||
	b := make([]byte, 16)
 | 
			
		||||
	u := &User{}
 | 
			
		||||
	u := &user_model.User{}
 | 
			
		||||
	algos := []string{"argon2", "pbkdf2", "scrypt", "bcrypt"}
 | 
			
		||||
	for j := 0; j < len(algos); j++ {
 | 
			
		||||
		u.PasswdHashAlgo = algos[j]
 | 
			
		||||
@@ -184,7 +185,7 @@ func BenchmarkHashPassword(b *testing.B) {
 | 
			
		||||
	// BenchmarkHashPassword ensures that it takes a reasonable amount of time
 | 
			
		||||
	// to hash a password - in order to protect from brute-force attacks.
 | 
			
		||||
	pass := "password1337"
 | 
			
		||||
	u := &User{Passwd: pass}
 | 
			
		||||
	u := &user_model.User{Passwd: pass}
 | 
			
		||||
	b.ResetTimer()
 | 
			
		||||
	for i := 0; i < b.N; i++ {
 | 
			
		||||
		u.SetPassword(pass)
 | 
			
		||||
@@ -192,7 +193,7 @@ func BenchmarkHashPassword(b *testing.B) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNewGitSig(t *testing.T) {
 | 
			
		||||
	users := make([]*User, 0, 20)
 | 
			
		||||
	users := make([]*user_model.User, 0, 20)
 | 
			
		||||
	err := db.GetEngine(db.DefaultContext).Find(&users)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
@@ -206,7 +207,7 @@ func TestNewGitSig(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestDisplayName(t *testing.T) {
 | 
			
		||||
	users := make([]*User, 0, 20)
 | 
			
		||||
	users := make([]*user_model.User, 0, 20)
 | 
			
		||||
	err := db.GetEngine(db.DefaultContext).Find(&users)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
@@ -221,7 +222,7 @@ func TestDisplayName(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCreateUserInvalidEmail(t *testing.T) {
 | 
			
		||||
	user := &User{
 | 
			
		||||
	user := &user_model.User{
 | 
			
		||||
		Name:               "GiteaBot",
 | 
			
		||||
		Email:              "GiteaBot@gitea.io\r\n",
 | 
			
		||||
		Passwd:             ";p['////..-++']",
 | 
			
		||||
@@ -230,35 +231,35 @@ func TestCreateUserInvalidEmail(t *testing.T) {
 | 
			
		||||
		MustChangePassword: false,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := CreateUser(user)
 | 
			
		||||
	err := user_model.CreateUser(user)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
	assert.True(t, IsErrEmailCharIsNotSupported(err))
 | 
			
		||||
	assert.True(t, user_model.IsErrEmailCharIsNotSupported(err))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCreateUserEmailAlreadyUsed(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
 | 
			
		||||
 | 
			
		||||
	// add new user with user2's email
 | 
			
		||||
	user.Name = "testuser"
 | 
			
		||||
	user.LowerName = strings.ToLower(user.Name)
 | 
			
		||||
	user.ID = 0
 | 
			
		||||
	err := CreateUser(user)
 | 
			
		||||
	err := user_model.CreateUser(user)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
	assert.True(t, IsErrEmailAlreadyUsed(err))
 | 
			
		||||
	assert.True(t, user_model.IsErrEmailAlreadyUsed(err))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestGetUserIDsByNames(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	// ignore non existing
 | 
			
		||||
	IDs, err := GetUserIDsByNames([]string{"user1", "user2", "none_existing_user"}, true)
 | 
			
		||||
	IDs, err := user_model.GetUserIDsByNames([]string{"user1", "user2", "none_existing_user"}, true)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Equal(t, []int64{1, 2}, IDs)
 | 
			
		||||
 | 
			
		||||
	// ignore non existing
 | 
			
		||||
	IDs, err = GetUserIDsByNames([]string{"user1", "do_not_exist"}, false)
 | 
			
		||||
	IDs, err = user_model.GetUserIDsByNames([]string{"user1", "do_not_exist"}, false)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
	assert.Equal(t, []int64(nil), IDs)
 | 
			
		||||
}
 | 
			
		||||
@@ -266,14 +267,14 @@ func TestGetUserIDsByNames(t *testing.T) {
 | 
			
		||||
func TestGetMaileableUsersByIDs(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	results, err := GetMaileableUsersByIDs([]int64{1, 4}, false)
 | 
			
		||||
	results, err := user_model.GetMaileableUsersByIDs([]int64{1, 4}, false)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Len(t, results, 1)
 | 
			
		||||
	if len(results) > 1 {
 | 
			
		||||
		assert.Equal(t, results[0].ID, 1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	results, err = GetMaileableUsersByIDs([]int64{1, 4}, true)
 | 
			
		||||
	results, err = user_model.GetMaileableUsersByIDs([]int64{1, 4}, true)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Len(t, results, 2)
 | 
			
		||||
	if len(results) > 2 {
 | 
			
		||||
@@ -284,36 +285,36 @@ func TestGetMaileableUsersByIDs(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
func TestUpdateUser(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
 | 
			
		||||
 | 
			
		||||
	user.KeepActivityPrivate = true
 | 
			
		||||
	assert.NoError(t, UpdateUser(db.DefaultContext, user, false))
 | 
			
		||||
	user = unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
 | 
			
		||||
	assert.NoError(t, user_model.UpdateUser(db.DefaultContext, user, false))
 | 
			
		||||
	user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
 | 
			
		||||
	assert.True(t, user.KeepActivityPrivate)
 | 
			
		||||
 | 
			
		||||
	setting.Service.AllowedUserVisibilityModesSlice = []bool{true, false, false}
 | 
			
		||||
	user.KeepActivityPrivate = false
 | 
			
		||||
	user.Visibility = structs.VisibleTypePrivate
 | 
			
		||||
	assert.Error(t, UpdateUser(db.DefaultContext, user, false))
 | 
			
		||||
	user = unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
 | 
			
		||||
	assert.Error(t, user_model.UpdateUser(db.DefaultContext, user, false))
 | 
			
		||||
	user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
 | 
			
		||||
	assert.True(t, user.KeepActivityPrivate)
 | 
			
		||||
 | 
			
		||||
	user.Email = "no mail@mail.org"
 | 
			
		||||
	assert.Error(t, UpdateUser(db.DefaultContext, user, true))
 | 
			
		||||
	assert.Error(t, user_model.UpdateUser(db.DefaultContext, user, true))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNewUserRedirect(t *testing.T) {
 | 
			
		||||
	// redirect to a completely new name
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &User{ID: 1}).(*User)
 | 
			
		||||
	assert.NoError(t, NewUserRedirect(db.DefaultContext, user.ID, user.Name, "newusername"))
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User)
 | 
			
		||||
	assert.NoError(t, user_model.NewUserRedirect(db.DefaultContext, user.ID, user.Name, "newusername"))
 | 
			
		||||
 | 
			
		||||
	unittest.AssertExistsAndLoadBean(t, &Redirect{
 | 
			
		||||
	unittest.AssertExistsAndLoadBean(t, &user_model.Redirect{
 | 
			
		||||
		LowerName:      user.LowerName,
 | 
			
		||||
		RedirectUserID: user.ID,
 | 
			
		||||
	})
 | 
			
		||||
	unittest.AssertExistsAndLoadBean(t, &Redirect{
 | 
			
		||||
	unittest.AssertExistsAndLoadBean(t, &user_model.Redirect{
 | 
			
		||||
		LowerName:      "olduser1",
 | 
			
		||||
		RedirectUserID: user.ID,
 | 
			
		||||
	})
 | 
			
		||||
@@ -323,14 +324,14 @@ func TestNewUserRedirect2(t *testing.T) {
 | 
			
		||||
	// redirect to previously used name
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &User{ID: 1}).(*User)
 | 
			
		||||
	assert.NoError(t, NewUserRedirect(db.DefaultContext, user.ID, user.Name, "olduser1"))
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User)
 | 
			
		||||
	assert.NoError(t, user_model.NewUserRedirect(db.DefaultContext, user.ID, user.Name, "olduser1"))
 | 
			
		||||
 | 
			
		||||
	unittest.AssertExistsAndLoadBean(t, &Redirect{
 | 
			
		||||
	unittest.AssertExistsAndLoadBean(t, &user_model.Redirect{
 | 
			
		||||
		LowerName:      user.LowerName,
 | 
			
		||||
		RedirectUserID: user.ID,
 | 
			
		||||
	})
 | 
			
		||||
	unittest.AssertNotExistsBean(t, &Redirect{
 | 
			
		||||
	unittest.AssertNotExistsBean(t, &user_model.Redirect{
 | 
			
		||||
		LowerName:      "olduser1",
 | 
			
		||||
		RedirectUserID: user.ID,
 | 
			
		||||
	})
 | 
			
		||||
@@ -340,10 +341,10 @@ func TestNewUserRedirect3(t *testing.T) {
 | 
			
		||||
	// redirect for a previously-unredirected user
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
 | 
			
		||||
	assert.NoError(t, NewUserRedirect(db.DefaultContext, user.ID, user.Name, "newusername"))
 | 
			
		||||
	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
 | 
			
		||||
	assert.NoError(t, user_model.NewUserRedirect(db.DefaultContext, user.ID, user.Name, "newusername"))
 | 
			
		||||
 | 
			
		||||
	unittest.AssertExistsAndLoadBean(t, &Redirect{
 | 
			
		||||
	unittest.AssertExistsAndLoadBean(t, &user_model.Redirect{
 | 
			
		||||
		LowerName:      user.LowerName,
 | 
			
		||||
		RedirectUserID: user.ID,
 | 
			
		||||
	})
 | 
			
		||||
@@ -352,18 +353,47 @@ func TestNewUserRedirect3(t *testing.T) {
 | 
			
		||||
func TestGetUserByOpenID(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	_, err := GetUserByOpenID("https://unknown")
 | 
			
		||||
	_, err := user_model.GetUserByOpenID("https://unknown")
 | 
			
		||||
	if assert.Error(t, err) {
 | 
			
		||||
		assert.True(t, IsErrUserNotExist(err))
 | 
			
		||||
		assert.True(t, user_model.IsErrUserNotExist(err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	user, err := GetUserByOpenID("https://user1.domain1.tld")
 | 
			
		||||
	user, err := user_model.GetUserByOpenID("https://user1.domain1.tld")
 | 
			
		||||
	if assert.NoError(t, err) {
 | 
			
		||||
		assert.Equal(t, int64(1), user.ID)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	user, err = GetUserByOpenID("https://domain1.tld/user2/")
 | 
			
		||||
	user, err = user_model.GetUserByOpenID("https://domain1.tld/user2/")
 | 
			
		||||
	if assert.NoError(t, err) {
 | 
			
		||||
		assert.Equal(t, int64(2), user.ID)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestFollowUser(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	testSuccess := func(followerID, followedID int64) {
 | 
			
		||||
		assert.NoError(t, user_model.FollowUser(followerID, followedID))
 | 
			
		||||
		unittest.AssertExistsAndLoadBean(t, &user_model.Follow{UserID: followerID, FollowID: followedID})
 | 
			
		||||
	}
 | 
			
		||||
	testSuccess(4, 2)
 | 
			
		||||
	testSuccess(5, 2)
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, user_model.FollowUser(2, 2))
 | 
			
		||||
 | 
			
		||||
	unittest.CheckConsistencyFor(t, &user_model.User{})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestUnfollowUser(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	testSuccess := func(followerID, followedID int64) {
 | 
			
		||||
		assert.NoError(t, user_model.UnfollowUser(followerID, followedID))
 | 
			
		||||
		unittest.AssertNotExistsBean(t, &user_model.Follow{UserID: followerID, FollowID: followedID})
 | 
			
		||||
	}
 | 
			
		||||
	testSuccess(4, 2)
 | 
			
		||||
	testSuccess(5, 2)
 | 
			
		||||
	testSuccess(2, 2)
 | 
			
		||||
 | 
			
		||||
	unittest.CheckConsistencyFor(t, &user_model.User{})
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user