mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Move tests as seperate sub packages to reduce duplicated file names (#19951)
This commit is contained in:
		| @@ -32,7 +32,7 @@ type Context struct { | |||||||
| 	e Engine | 	e Engine | ||||||
| } | } | ||||||
|  |  | ||||||
| // WithEngine returns a db.Context from a context.Context and db.Engine | // WithEngine returns a Context from a context.Context and Engine | ||||||
| func WithEngine(ctx context.Context, e Engine) *Context { | func WithEngine(ctx context.Context, e Engine) *Context { | ||||||
| 	return &Context{ | 	return &Context{ | ||||||
| 		Context: ctx, | 		Context: ctx, | ||||||
|   | |||||||
							
								
								
									
										56
									
								
								models/db/engine_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								models/db/engine_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | |||||||
|  | // Copyright 2019 The Gitea Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a MIT-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
|  | package db_test | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"os" | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"testing" | ||||||
|  |  | ||||||
|  | 	"code.gitea.io/gitea/models/db" | ||||||
|  | 	issues_model "code.gitea.io/gitea/models/issues" | ||||||
|  | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  | 	"code.gitea.io/gitea/modules/setting" | ||||||
|  |  | ||||||
|  | 	"github.com/stretchr/testify/assert" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func TestDumpDatabase(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	dir, err := os.MkdirTemp(os.TempDir(), "dump") | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	type Version struct { | ||||||
|  | 		ID      int64 `xorm:"pk autoincr"` | ||||||
|  | 		Version int64 | ||||||
|  | 	} | ||||||
|  | 	assert.NoError(t, db.GetEngine(db.DefaultContext).Sync2(new(Version))) | ||||||
|  |  | ||||||
|  | 	for _, dbType := range setting.SupportedDatabaseTypes { | ||||||
|  | 		assert.NoError(t, db.DumpDatabase(filepath.Join(dir, dbType+".sql"), dbType)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestDeleteOrphanedObjects(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	countBefore, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{}) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	_, err = db.GetEngine(db.DefaultContext).Insert(&issues_model.PullRequest{IssueID: 1000}, &issues_model.PullRequest{IssueID: 1001}, &issues_model.PullRequest{IssueID: 1003}) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	orphaned, err := db.CountOrphanedObjects("pull_request", "issue", "pull_request.issue_id=issue.id") | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	assert.EqualValues(t, 3, orphaned) | ||||||
|  |  | ||||||
|  | 	err = db.DeleteOrphanedObjects("pull_request", "issue", "pull_request.issue_id=issue.id") | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	countAfter, err := db.GetEngine(db.DefaultContext).Count(&issues_model.PullRequest{}) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	assert.EqualValues(t, countBefore, countAfter) | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								models/db/main_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								models/db/main_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | // Copyright 2020 The Gitea Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a MIT-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
|  | package db_test | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"testing" | ||||||
|  |  | ||||||
|  | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  |  | ||||||
|  | 	_ "code.gitea.io/gitea/models" | ||||||
|  | 	_ "code.gitea.io/gitea/models/repo" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func TestMain(m *testing.M) { | ||||||
|  | 	unittest.MainTest(m, &unittest.TestOptions{ | ||||||
|  | 		GiteaRootPath: filepath.Join("..", ".."), | ||||||
|  | 	}) | ||||||
|  | } | ||||||
| @@ -1,34 +0,0 @@ | |||||||
| // Copyright 2019 The Gitea Authors. All rights reserved. |  | ||||||
| // Use of this source code is governed by a MIT-style |  | ||||||
| // license that can be found in the LICENSE file. |  | ||||||
|  |  | ||||||
| package models |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"os" |  | ||||||
| 	"path/filepath" |  | ||||||
| 	"testing" |  | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" |  | ||||||
| 	"code.gitea.io/gitea/modules/setting" |  | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func TestDumpDatabase(t *testing.T) { |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	dir, err := os.MkdirTemp(os.TempDir(), "dump") |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	type Version struct { |  | ||||||
| 		ID      int64 `xorm:"pk autoincr"` |  | ||||||
| 		Version int64 |  | ||||||
| 	} |  | ||||||
| 	assert.NoError(t, db.GetEngine(db.DefaultContext).Sync2(new(Version))) |  | ||||||
|  |  | ||||||
| 	for _, dbType := range setting.SupportedDatabaseTypes { |  | ||||||
| 		assert.NoError(t, db.DumpDatabase(filepath.Join(dir, dbType+".sql"), dbType)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -8,8 +8,9 @@ import ( | |||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	_ "code.gitea.io/gitea/models" |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  |  | ||||||
|  | 	_ "code.gitea.io/gitea/models" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestMain(m *testing.M) { | func TestMain(m *testing.M) { | ||||||
|   | |||||||
| @@ -8,13 +8,14 @@ import ( | |||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	_ "code.gitea.io/gitea/models" |  | ||||||
| 	issues_model "code.gitea.io/gitea/models/issues" | 	issues_model "code.gitea.io/gitea/models/issues" | ||||||
| 	_ "code.gitea.io/gitea/models/repo" |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
| 	_ "code.gitea.io/gitea/models/user" |  | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
|  |  | ||||||
|  | 	_ "code.gitea.io/gitea/models" | ||||||
|  | 	_ "code.gitea.io/gitea/models/repo" | ||||||
|  | 	_ "code.gitea.io/gitea/models/user" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,12 +7,9 @@ package models | |||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" |  | ||||||
| 	"code.gitea.io/gitea/models/organization" | 	"code.gitea.io/gitea/models/organization" | ||||||
| 	repo_model "code.gitea.io/gitea/models/repo" |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
| 	user_model "code.gitea.io/gitea/models/user" | 	user_model "code.gitea.io/gitea/models/user" | ||||||
| 	"code.gitea.io/gitea/modules/setting" |  | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| @@ -62,115 +59,3 @@ func TestRemoveOrgUser(t *testing.T) { | |||||||
| 	unittest.AssertExistsAndLoadBean(t, &organization.OrgUser{OrgID: 7, UID: 5}) | 	unittest.AssertExistsAndLoadBean(t, &organization.OrgUser{OrgID: 7, UID: 5}) | ||||||
| 	unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{}) | 	unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{}) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestUser_RemoveOrgRepo(t *testing.T) { |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
| 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) |  | ||||||
| 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: org.ID}).(*repo_model.Repository) |  | ||||||
|  |  | ||||||
| 	// remove a repo that does belong to org |  | ||||||
| 	unittest.AssertExistsAndLoadBean(t, &organization.TeamRepo{RepoID: repo.ID, OrgID: org.ID}) |  | ||||||
| 	assert.NoError(t, organization.RemoveOrgRepo(db.DefaultContext, org.ID, repo.ID)) |  | ||||||
| 	unittest.AssertNotExistsBean(t, &organization.TeamRepo{RepoID: repo.ID, OrgID: org.ID}) |  | ||||||
| 	unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repo.ID}) // repo should still exist |  | ||||||
|  |  | ||||||
| 	// remove a repo that does not belong to org |  | ||||||
| 	assert.NoError(t, organization.RemoveOrgRepo(db.DefaultContext, org.ID, repo.ID)) |  | ||||||
| 	unittest.AssertNotExistsBean(t, &organization.TeamRepo{RepoID: repo.ID, OrgID: org.ID}) |  | ||||||
|  |  | ||||||
| 	assert.NoError(t, organization.RemoveOrgRepo(db.DefaultContext, org.ID, unittest.NonexistentID)) |  | ||||||
|  |  | ||||||
| 	unittest.CheckConsistencyFor(t, |  | ||||||
| 		&user_model.User{ID: org.ID}, |  | ||||||
| 		&organization.Team{OrgID: org.ID}, |  | ||||||
| 		&repo_model.Repository{ID: repo.ID}) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestCreateOrganization(t *testing.T) { |  | ||||||
| 	// successful creation of org |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) |  | ||||||
| 	const newOrgName = "neworg" |  | ||||||
| 	org := &organization.Organization{ |  | ||||||
| 		Name: newOrgName, |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	unittest.AssertNotExistsBean(t, &user_model.User{Name: newOrgName, Type: user_model.UserTypeOrganization}) |  | ||||||
| 	assert.NoError(t, organization.CreateOrganization(org, owner)) |  | ||||||
| 	org = unittest.AssertExistsAndLoadBean(t, |  | ||||||
| 		&organization.Organization{Name: newOrgName, Type: user_model.UserTypeOrganization}).(*organization.Organization) |  | ||||||
| 	ownerTeam := unittest.AssertExistsAndLoadBean(t, |  | ||||||
| 		&organization.Team{Name: organization.OwnerTeamName, OrgID: org.ID}).(*organization.Team) |  | ||||||
| 	unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{UID: owner.ID, TeamID: ownerTeam.ID}) |  | ||||||
| 	unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{}) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestCreateOrganization2(t *testing.T) { |  | ||||||
| 	// unauthorized creation of org |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User) |  | ||||||
| 	const newOrgName = "neworg" |  | ||||||
| 	org := &organization.Organization{ |  | ||||||
| 		Name: newOrgName, |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	unittest.AssertNotExistsBean(t, &organization.Organization{Name: newOrgName, Type: user_model.UserTypeOrganization}) |  | ||||||
| 	err := organization.CreateOrganization(org, owner) |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| 	assert.True(t, organization.IsErrUserNotAllowedCreateOrg(err)) |  | ||||||
| 	unittest.AssertNotExistsBean(t, &organization.Organization{Name: newOrgName, Type: user_model.UserTypeOrganization}) |  | ||||||
| 	unittest.CheckConsistencyFor(t, &organization.Organization{}, &organization.Team{}) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestCreateOrganization3(t *testing.T) { |  | ||||||
| 	// create org with same name as existent org |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) |  | ||||||
| 	org := &organization.Organization{Name: "user3"}                      // should already exist |  | ||||||
| 	unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: org.Name}) // sanity check |  | ||||||
| 	err := organization.CreateOrganization(org, owner) |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| 	assert.True(t, user_model.IsErrUserAlreadyExist(err)) |  | ||||||
| 	unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{}) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestCreateOrganization4(t *testing.T) { |  | ||||||
| 	// create org with unusable name |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) |  | ||||||
| 	err := organization.CreateOrganization(&organization.Organization{Name: "assets"}, owner) |  | ||||||
| 	assert.Error(t, err) |  | ||||||
| 	assert.True(t, db.IsErrNameReserved(err)) |  | ||||||
| 	unittest.CheckConsistencyFor(t, &organization.Organization{}, &organization.Team{}) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestAddOrgUser(t *testing.T) { |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
| 	testSuccess := func(orgID, userID int64, isPublic bool) { |  | ||||||
| 		org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID}).(*user_model.User) |  | ||||||
| 		expectedNumMembers := org.NumMembers |  | ||||||
| 		if !unittest.BeanExists(t, &organization.OrgUser{OrgID: orgID, UID: userID}) { |  | ||||||
| 			expectedNumMembers++ |  | ||||||
| 		} |  | ||||||
| 		assert.NoError(t, organization.AddOrgUser(orgID, userID)) |  | ||||||
| 		ou := &organization.OrgUser{OrgID: orgID, UID: userID} |  | ||||||
| 		unittest.AssertExistsAndLoadBean(t, ou) |  | ||||||
| 		assert.Equal(t, isPublic, ou.IsPublic) |  | ||||||
| 		org = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID}).(*user_model.User) |  | ||||||
| 		assert.EqualValues(t, expectedNumMembers, org.NumMembers) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	setting.Service.DefaultOrgMemberVisible = false |  | ||||||
| 	testSuccess(3, 5, false) |  | ||||||
| 	testSuccess(3, 5, false) |  | ||||||
| 	testSuccess(6, 2, false) |  | ||||||
|  |  | ||||||
| 	setting.Service.DefaultOrgMemberVisible = true |  | ||||||
| 	testSuccess(6, 3, true) |  | ||||||
|  |  | ||||||
| 	unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{}) |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -2,26 +2,22 @@ | |||||||
| // Use of this source code is governed by a MIT-style | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package organization | package organization_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  |  | ||||||
|  | 	_ "code.gitea.io/gitea/models" | ||||||
|  | 	_ "code.gitea.io/gitea/models/organization" | ||||||
|  | 	_ "code.gitea.io/gitea/models/repo" | ||||||
|  | 	_ "code.gitea.io/gitea/models/user" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestMain(m *testing.M) { | func TestMain(m *testing.M) { | ||||||
| 	unittest.MainTest(m, &unittest.TestOptions{ | 	unittest.MainTest(m, &unittest.TestOptions{ | ||||||
| 		GiteaRootPath: filepath.Join("..", ".."), | 		GiteaRootPath: filepath.Join("..", ".."), | ||||||
| 		FixtureFiles: []string{ |  | ||||||
| 			"user.yml", |  | ||||||
| 			"org_user.yml", |  | ||||||
| 			"team.yml", |  | ||||||
| 			"team_repo.yml", |  | ||||||
| 			"team_unit.yml", |  | ||||||
| 			"team_user.yml", |  | ||||||
| 			"repository.yml", |  | ||||||
| 		}, |  | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,12 +2,13 @@ | |||||||
| // Use of this source code is governed by a MIT-style | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package organization | package organization_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
|  | 	"code.gitea.io/gitea/models/organization" | ||||||
| 	repo_model "code.gitea.io/gitea/models/repo" | 	repo_model "code.gitea.io/gitea/models/repo" | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
| 	user_model "code.gitea.io/gitea/models/user" | 	user_model "code.gitea.io/gitea/models/user" | ||||||
| @@ -30,7 +31,7 @@ func TestUser_IsOwnedBy(t *testing.T) { | |||||||
| 		{2, 2, false}, // user2 is not an organization | 		{2, 2, false}, // user2 is not an organization | ||||||
| 		{2, 3, false}, | 		{2, 3, false}, | ||||||
| 	} { | 	} { | ||||||
| 		org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: testCase.OrgID}).(*Organization) | 		org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: testCase.OrgID}).(*organization.Organization) | ||||||
| 		isOwner, err := org.IsOwnedBy(testCase.UserID) | 		isOwner, err := org.IsOwnedBy(testCase.UserID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		assert.Equal(t, testCase.ExpectedOwner, isOwner) | 		assert.Equal(t, testCase.ExpectedOwner, isOwner) | ||||||
| @@ -51,7 +52,7 @@ func TestUser_IsOrgMember(t *testing.T) { | |||||||
| 		{2, 2, false}, // user2 is not an organization | 		{2, 2, false}, // user2 is not an organization | ||||||
| 		{2, 3, false}, | 		{2, 3, false}, | ||||||
| 	} { | 	} { | ||||||
| 		org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: testCase.OrgID}).(*Organization) | 		org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: testCase.OrgID}).(*organization.Organization) | ||||||
| 		isMember, err := org.IsOrgMember(testCase.UserID) | 		isMember, err := org.IsOrgMember(testCase.UserID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		assert.Equal(t, testCase.ExpectedMember, isMember) | 		assert.Equal(t, testCase.ExpectedMember, isMember) | ||||||
| @@ -60,35 +61,35 @@ func TestUser_IsOrgMember(t *testing.T) { | |||||||
|  |  | ||||||
| func TestUser_GetTeam(t *testing.T) { | func TestUser_GetTeam(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization) | 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) | ||||||
| 	team, err := org.GetTeam("team1") | 	team, err := org.GetTeam("team1") | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, org.ID, team.OrgID) | 	assert.Equal(t, org.ID, team.OrgID) | ||||||
| 	assert.Equal(t, "team1", team.LowerName) | 	assert.Equal(t, "team1", team.LowerName) | ||||||
|  |  | ||||||
| 	_, err = org.GetTeam("does not exist") | 	_, err = org.GetTeam("does not exist") | ||||||
| 	assert.True(t, IsErrTeamNotExist(err)) | 	assert.True(t, organization.IsErrTeamNotExist(err)) | ||||||
|  |  | ||||||
| 	nonOrg := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 2}).(*Organization) | 	nonOrg := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 2}).(*organization.Organization) | ||||||
| 	_, err = nonOrg.GetTeam("team") | 	_, err = nonOrg.GetTeam("team") | ||||||
| 	assert.True(t, IsErrTeamNotExist(err)) | 	assert.True(t, organization.IsErrTeamNotExist(err)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestUser_GetOwnerTeam(t *testing.T) { | func TestUser_GetOwnerTeam(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization) | 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) | ||||||
| 	team, err := org.GetOwnerTeam() | 	team, err := org.GetOwnerTeam() | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, org.ID, team.OrgID) | 	assert.Equal(t, org.ID, team.OrgID) | ||||||
|  |  | ||||||
| 	nonOrg := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 2}).(*Organization) | 	nonOrg := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 2}).(*organization.Organization) | ||||||
| 	_, err = nonOrg.GetOwnerTeam() | 	_, err = nonOrg.GetOwnerTeam() | ||||||
| 	assert.True(t, IsErrTeamNotExist(err)) | 	assert.True(t, organization.IsErrTeamNotExist(err)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestUser_GetTeams(t *testing.T) { | func TestUser_GetTeams(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization) | 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) | ||||||
| 	teams, err := org.LoadTeams() | 	teams, err := org.LoadTeams() | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	if assert.Len(t, teams, 4) { | 	if assert.Len(t, teams, 4) { | ||||||
| @@ -101,7 +102,7 @@ func TestUser_GetTeams(t *testing.T) { | |||||||
|  |  | ||||||
| func TestUser_GetMembers(t *testing.T) { | func TestUser_GetMembers(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization) | 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) | ||||||
| 	members, _, err := org.GetMembers() | 	members, _, err := org.GetMembers() | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	if assert.Len(t, members, 3) { | 	if assert.Len(t, members, 3) { | ||||||
| @@ -114,23 +115,23 @@ func TestUser_GetMembers(t *testing.T) { | |||||||
| func TestGetOrgByName(t *testing.T) { | func TestGetOrgByName(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	org, err := GetOrgByName("user3") | 	org, err := organization.GetOrgByName("user3") | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.EqualValues(t, 3, org.ID) | 	assert.EqualValues(t, 3, org.ID) | ||||||
| 	assert.Equal(t, "user3", org.Name) | 	assert.Equal(t, "user3", org.Name) | ||||||
|  |  | ||||||
| 	_, err = GetOrgByName("user2") // user2 is an individual | 	_, err = organization.GetOrgByName("user2") // user2 is an individual | ||||||
| 	assert.True(t, IsErrOrgNotExist(err)) | 	assert.True(t, organization.IsErrOrgNotExist(err)) | ||||||
|  |  | ||||||
| 	_, err = GetOrgByName("") // corner case | 	_, err = organization.GetOrgByName("") // corner case | ||||||
| 	assert.True(t, IsErrOrgNotExist(err)) | 	assert.True(t, organization.IsErrOrgNotExist(err)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestCountOrganizations(t *testing.T) { | func TestCountOrganizations(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	expected, err := db.GetEngine(db.DefaultContext).Where("type=?", user_model.UserTypeOrganization).Count(&Organization{}) | 	expected, err := db.GetEngine(db.DefaultContext).Where("type=?", user_model.UserTypeOrganization).Count(&organization.Organization{}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	cnt, err := CountOrgs(FindOrgOptions{IncludePrivate: true}) | 	cnt, err := organization.CountOrgs(organization.FindOrgOptions{IncludePrivate: true}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, expected, cnt) | 	assert.Equal(t, expected, cnt) | ||||||
| } | } | ||||||
| @@ -138,7 +139,7 @@ func TestCountOrganizations(t *testing.T) { | |||||||
| func TestIsOrganizationOwner(t *testing.T) { | func TestIsOrganizationOwner(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	test := func(orgID, userID int64, expected bool) { | 	test := func(orgID, userID int64, expected bool) { | ||||||
| 		isOwner, err := IsOrganizationOwner(db.DefaultContext, orgID, userID) | 		isOwner, err := organization.IsOrganizationOwner(db.DefaultContext, orgID, userID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		assert.EqualValues(t, expected, isOwner) | 		assert.EqualValues(t, expected, isOwner) | ||||||
| 	} | 	} | ||||||
| @@ -152,7 +153,7 @@ func TestIsOrganizationOwner(t *testing.T) { | |||||||
| func TestIsOrganizationMember(t *testing.T) { | func TestIsOrganizationMember(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	test := func(orgID, userID int64, expected bool) { | 	test := func(orgID, userID int64, expected bool) { | ||||||
| 		isMember, err := IsOrganizationMember(db.DefaultContext, orgID, userID) | 		isMember, err := organization.IsOrganizationMember(db.DefaultContext, orgID, userID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		assert.EqualValues(t, expected, isMember) | 		assert.EqualValues(t, expected, isMember) | ||||||
| 	} | 	} | ||||||
| @@ -167,7 +168,7 @@ func TestIsOrganizationMember(t *testing.T) { | |||||||
| func TestIsPublicMembership(t *testing.T) { | func TestIsPublicMembership(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	test := func(orgID, userID int64, expected bool) { | 	test := func(orgID, userID int64, expected bool) { | ||||||
| 		isMember, err := IsPublicMembership(orgID, userID) | 		isMember, err := organization.IsPublicMembership(orgID, userID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		assert.EqualValues(t, expected, isMember) | 		assert.EqualValues(t, expected, isMember) | ||||||
| 	} | 	} | ||||||
| @@ -182,7 +183,7 @@ func TestIsPublicMembership(t *testing.T) { | |||||||
| func TestFindOrgs(t *testing.T) { | func TestFindOrgs(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	orgs, err := FindOrgs(FindOrgOptions{ | 	orgs, err := organization.FindOrgs(organization.FindOrgOptions{ | ||||||
| 		UserID:         4, | 		UserID:         4, | ||||||
| 		IncludePrivate: true, | 		IncludePrivate: true, | ||||||
| 	}) | 	}) | ||||||
| @@ -191,14 +192,14 @@ func TestFindOrgs(t *testing.T) { | |||||||
| 		assert.EqualValues(t, 3, orgs[0].ID) | 		assert.EqualValues(t, 3, orgs[0].ID) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	orgs, err = FindOrgs(FindOrgOptions{ | 	orgs, err = organization.FindOrgs(organization.FindOrgOptions{ | ||||||
| 		UserID:         4, | 		UserID:         4, | ||||||
| 		IncludePrivate: false, | 		IncludePrivate: false, | ||||||
| 	}) | 	}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Len(t, orgs, 0) | 	assert.Len(t, orgs, 0) | ||||||
|  |  | ||||||
| 	total, err := CountOrgs(FindOrgOptions{ | 	total, err := organization.CountOrgs(organization.FindOrgOptions{ | ||||||
| 		UserID:         4, | 		UserID:         4, | ||||||
| 		IncludePrivate: true, | 		IncludePrivate: true, | ||||||
| 	}) | 	}) | ||||||
| @@ -209,16 +210,16 @@ func TestFindOrgs(t *testing.T) { | |||||||
| func TestGetOrgUsersByUserID(t *testing.T) { | func TestGetOrgUsersByUserID(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	orgUsers, err := GetOrgUsersByUserID(5, &SearchOrganizationsOptions{All: true}) | 	orgUsers, err := organization.GetOrgUsersByUserID(5, &organization.SearchOrganizationsOptions{All: true}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	if assert.Len(t, orgUsers, 2) { | 	if assert.Len(t, orgUsers, 2) { | ||||||
| 		assert.Equal(t, OrgUser{ | 		assert.Equal(t, organization.OrgUser{ | ||||||
| 			ID:       orgUsers[0].ID, | 			ID:       orgUsers[0].ID, | ||||||
| 			OrgID:    6, | 			OrgID:    6, | ||||||
| 			UID:      5, | 			UID:      5, | ||||||
| 			IsPublic: true, | 			IsPublic: true, | ||||||
| 		}, *orgUsers[0]) | 		}, *orgUsers[0]) | ||||||
| 		assert.Equal(t, OrgUser{ | 		assert.Equal(t, organization.OrgUser{ | ||||||
| 			ID:       orgUsers[1].ID, | 			ID:       orgUsers[1].ID, | ||||||
| 			OrgID:    7, | 			OrgID:    7, | ||||||
| 			UID:      5, | 			UID:      5, | ||||||
| @@ -226,12 +227,12 @@ func TestGetOrgUsersByUserID(t *testing.T) { | |||||||
| 		}, *orgUsers[1]) | 		}, *orgUsers[1]) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	publicOrgUsers, err := GetOrgUsersByUserID(5, &SearchOrganizationsOptions{All: false}) | 	publicOrgUsers, err := organization.GetOrgUsersByUserID(5, &organization.SearchOrganizationsOptions{All: false}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Len(t, publicOrgUsers, 1) | 	assert.Len(t, publicOrgUsers, 1) | ||||||
| 	assert.Equal(t, *orgUsers[0], *publicOrgUsers[0]) | 	assert.Equal(t, *orgUsers[0], *publicOrgUsers[0]) | ||||||
|  |  | ||||||
| 	orgUsers, err = GetOrgUsersByUserID(1, &SearchOrganizationsOptions{All: true}) | 	orgUsers, err = organization.GetOrgUsersByUserID(1, &organization.SearchOrganizationsOptions{All: true}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Len(t, orgUsers, 0) | 	assert.Len(t, orgUsers, 0) | ||||||
| } | } | ||||||
| @@ -239,20 +240,20 @@ func TestGetOrgUsersByUserID(t *testing.T) { | |||||||
| func TestGetOrgUsersByOrgID(t *testing.T) { | func TestGetOrgUsersByOrgID(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	orgUsers, err := GetOrgUsersByOrgID(db.DefaultContext, &FindOrgMembersOpts{ | 	orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ | ||||||
| 		ListOptions: db.ListOptions{}, | 		ListOptions: db.ListOptions{}, | ||||||
| 		OrgID:       3, | 		OrgID:       3, | ||||||
| 		PublicOnly:  false, | 		PublicOnly:  false, | ||||||
| 	}) | 	}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	if assert.Len(t, orgUsers, 3) { | 	if assert.Len(t, orgUsers, 3) { | ||||||
| 		assert.Equal(t, OrgUser{ | 		assert.Equal(t, organization.OrgUser{ | ||||||
| 			ID:       orgUsers[0].ID, | 			ID:       orgUsers[0].ID, | ||||||
| 			OrgID:    3, | 			OrgID:    3, | ||||||
| 			UID:      2, | 			UID:      2, | ||||||
| 			IsPublic: true, | 			IsPublic: true, | ||||||
| 		}, *orgUsers[0]) | 		}, *orgUsers[0]) | ||||||
| 		assert.Equal(t, OrgUser{ | 		assert.Equal(t, organization.OrgUser{ | ||||||
| 			ID:       orgUsers[1].ID, | 			ID:       orgUsers[1].ID, | ||||||
| 			OrgID:    3, | 			OrgID:    3, | ||||||
| 			UID:      4, | 			UID:      4, | ||||||
| @@ -260,7 +261,7 @@ func TestGetOrgUsersByOrgID(t *testing.T) { | |||||||
| 		}, *orgUsers[1]) | 		}, *orgUsers[1]) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	orgUsers, err = GetOrgUsersByOrgID(db.DefaultContext, &FindOrgMembersOpts{ | 	orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ | ||||||
| 		ListOptions: db.ListOptions{}, | 		ListOptions: db.ListOptions{}, | ||||||
| 		OrgID:       unittest.NonexistentID, | 		OrgID:       unittest.NonexistentID, | ||||||
| 		PublicOnly:  false, | 		PublicOnly:  false, | ||||||
| @@ -273,20 +274,20 @@ func TestChangeOrgUserStatus(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	testSuccess := func(orgID, userID int64, public bool) { | 	testSuccess := func(orgID, userID int64, public bool) { | ||||||
| 		assert.NoError(t, ChangeOrgUserStatus(orgID, userID, public)) | 		assert.NoError(t, organization.ChangeOrgUserStatus(orgID, userID, public)) | ||||||
| 		orgUser := unittest.AssertExistsAndLoadBean(t, &OrgUser{OrgID: orgID, UID: userID}).(*OrgUser) | 		orgUser := unittest.AssertExistsAndLoadBean(t, &organization.OrgUser{OrgID: orgID, UID: userID}).(*organization.OrgUser) | ||||||
| 		assert.Equal(t, public, orgUser.IsPublic) | 		assert.Equal(t, public, orgUser.IsPublic) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	testSuccess(3, 2, false) | 	testSuccess(3, 2, false) | ||||||
| 	testSuccess(3, 2, false) | 	testSuccess(3, 2, false) | ||||||
| 	testSuccess(3, 4, true) | 	testSuccess(3, 4, true) | ||||||
| 	assert.NoError(t, ChangeOrgUserStatus(unittest.NonexistentID, unittest.NonexistentID, true)) | 	assert.NoError(t, organization.ChangeOrgUserStatus(unittest.NonexistentID, unittest.NonexistentID, true)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestUser_GetUserTeamIDs(t *testing.T) { | func TestUser_GetUserTeamIDs(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization) | 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) | ||||||
| 	testSuccess := func(userID int64, expected []int64) { | 	testSuccess := func(userID int64, expected []int64) { | ||||||
| 		teamIDs, err := org.GetUserTeamIDs(userID) | 		teamIDs, err := org.GetUserTeamIDs(userID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| @@ -299,9 +300,9 @@ func TestUser_GetUserTeamIDs(t *testing.T) { | |||||||
|  |  | ||||||
| func TestAccessibleReposEnv_CountRepos(t *testing.T) { | func TestAccessibleReposEnv_CountRepos(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization) | 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) | ||||||
| 	testSuccess := func(userID, expectedCount int64) { | 	testSuccess := func(userID, expectedCount int64) { | ||||||
| 		env, err := AccessibleReposEnv(db.DefaultContext, org, userID) | 		env, err := organization.AccessibleReposEnv(db.DefaultContext, org, userID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		count, err := env.CountRepos() | 		count, err := env.CountRepos() | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| @@ -313,9 +314,9 @@ func TestAccessibleReposEnv_CountRepos(t *testing.T) { | |||||||
|  |  | ||||||
| func TestAccessibleReposEnv_RepoIDs(t *testing.T) { | func TestAccessibleReposEnv_RepoIDs(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization) | 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) | ||||||
| 	testSuccess := func(userID, _, pageSize int64, expectedRepoIDs []int64) { | 	testSuccess := func(userID, _, pageSize int64, expectedRepoIDs []int64) { | ||||||
| 		env, err := AccessibleReposEnv(db.DefaultContext, org, userID) | 		env, err := organization.AccessibleReposEnv(db.DefaultContext, org, userID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		repoIDs, err := env.RepoIDs(1, 100) | 		repoIDs, err := env.RepoIDs(1, 100) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| @@ -327,9 +328,9 @@ func TestAccessibleReposEnv_RepoIDs(t *testing.T) { | |||||||
|  |  | ||||||
| func TestAccessibleReposEnv_Repos(t *testing.T) { | func TestAccessibleReposEnv_Repos(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization) | 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) | ||||||
| 	testSuccess := func(userID int64, expectedRepoIDs []int64) { | 	testSuccess := func(userID int64, expectedRepoIDs []int64) { | ||||||
| 		env, err := AccessibleReposEnv(db.DefaultContext, org, userID) | 		env, err := organization.AccessibleReposEnv(db.DefaultContext, org, userID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		repos, err := env.Repos(1, 100) | 		repos, err := env.Repos(1, 100) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| @@ -346,9 +347,9 @@ func TestAccessibleReposEnv_Repos(t *testing.T) { | |||||||
|  |  | ||||||
| func TestAccessibleReposEnv_MirrorRepos(t *testing.T) { | func TestAccessibleReposEnv_MirrorRepos(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization) | 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) | ||||||
| 	testSuccess := func(userID int64, expectedRepoIDs []int64) { | 	testSuccess := func(userID int64, expectedRepoIDs []int64) { | ||||||
| 		env, err := AccessibleReposEnv(db.DefaultContext, org, userID) | 		env, err := organization.AccessibleReposEnv(db.DefaultContext, org, userID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		repos, err := env.MirrorRepos() | 		repos, err := env.MirrorRepos() | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| @@ -369,18 +370,18 @@ func TestHasOrgVisibleTypePublic(t *testing.T) { | |||||||
| 	user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User) | 	user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User) | ||||||
|  |  | ||||||
| 	const newOrgName = "test-org-public" | 	const newOrgName = "test-org-public" | ||||||
| 	org := &Organization{ | 	org := &organization.Organization{ | ||||||
| 		Name:       newOrgName, | 		Name:       newOrgName, | ||||||
| 		Visibility: structs.VisibleTypePublic, | 		Visibility: structs.VisibleTypePublic, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	unittest.AssertNotExistsBean(t, &user_model.User{Name: org.Name, Type: user_model.UserTypeOrganization}) | 	unittest.AssertNotExistsBean(t, &user_model.User{Name: org.Name, Type: user_model.UserTypeOrganization}) | ||||||
| 	assert.NoError(t, CreateOrganization(org, owner)) | 	assert.NoError(t, organization.CreateOrganization(org, owner)) | ||||||
| 	org = unittest.AssertExistsAndLoadBean(t, | 	org = unittest.AssertExistsAndLoadBean(t, | ||||||
| 		&Organization{Name: org.Name, Type: user_model.UserTypeOrganization}).(*Organization) | 		&organization.Organization{Name: org.Name, Type: user_model.UserTypeOrganization}).(*organization.Organization) | ||||||
| 	test1 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), owner) | 	test1 := organization.HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), owner) | ||||||
| 	test2 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), user3) | 	test2 := organization.HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), user3) | ||||||
| 	test3 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), nil) | 	test3 := organization.HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), nil) | ||||||
| 	assert.True(t, test1) // owner of org | 	assert.True(t, test1) // owner of org | ||||||
| 	assert.True(t, test2) // user not a part of org | 	assert.True(t, test2) // user not a part of org | ||||||
| 	assert.True(t, test3) // logged out user | 	assert.True(t, test3) // logged out user | ||||||
| @@ -392,18 +393,18 @@ func TestHasOrgVisibleTypeLimited(t *testing.T) { | |||||||
| 	user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User) | 	user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User) | ||||||
|  |  | ||||||
| 	const newOrgName = "test-org-limited" | 	const newOrgName = "test-org-limited" | ||||||
| 	org := &Organization{ | 	org := &organization.Organization{ | ||||||
| 		Name:       newOrgName, | 		Name:       newOrgName, | ||||||
| 		Visibility: structs.VisibleTypeLimited, | 		Visibility: structs.VisibleTypeLimited, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	unittest.AssertNotExistsBean(t, &user_model.User{Name: org.Name, Type: user_model.UserTypeOrganization}) | 	unittest.AssertNotExistsBean(t, &user_model.User{Name: org.Name, Type: user_model.UserTypeOrganization}) | ||||||
| 	assert.NoError(t, CreateOrganization(org, owner)) | 	assert.NoError(t, organization.CreateOrganization(org, owner)) | ||||||
| 	org = unittest.AssertExistsAndLoadBean(t, | 	org = unittest.AssertExistsAndLoadBean(t, | ||||||
| 		&Organization{Name: org.Name, Type: user_model.UserTypeOrganization}).(*Organization) | 		&organization.Organization{Name: org.Name, Type: user_model.UserTypeOrganization}).(*organization.Organization) | ||||||
| 	test1 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), owner) | 	test1 := organization.HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), owner) | ||||||
| 	test2 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), user3) | 	test2 := organization.HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), user3) | ||||||
| 	test3 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), nil) | 	test3 := organization.HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), nil) | ||||||
| 	assert.True(t, test1)  // owner of org | 	assert.True(t, test1)  // owner of org | ||||||
| 	assert.True(t, test2)  // user not a part of org | 	assert.True(t, test2)  // user not a part of org | ||||||
| 	assert.False(t, test3) // logged out user | 	assert.False(t, test3) // logged out user | ||||||
| @@ -415,18 +416,18 @@ func TestHasOrgVisibleTypePrivate(t *testing.T) { | |||||||
| 	user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User) | 	user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User) | ||||||
|  |  | ||||||
| 	const newOrgName = "test-org-private" | 	const newOrgName = "test-org-private" | ||||||
| 	org := &Organization{ | 	org := &organization.Organization{ | ||||||
| 		Name:       newOrgName, | 		Name:       newOrgName, | ||||||
| 		Visibility: structs.VisibleTypePrivate, | 		Visibility: structs.VisibleTypePrivate, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	unittest.AssertNotExistsBean(t, &user_model.User{Name: org.Name, Type: user_model.UserTypeOrganization}) | 	unittest.AssertNotExistsBean(t, &user_model.User{Name: org.Name, Type: user_model.UserTypeOrganization}) | ||||||
| 	assert.NoError(t, CreateOrganization(org, owner)) | 	assert.NoError(t, organization.CreateOrganization(org, owner)) | ||||||
| 	org = unittest.AssertExistsAndLoadBean(t, | 	org = unittest.AssertExistsAndLoadBean(t, | ||||||
| 		&Organization{Name: org.Name, Type: user_model.UserTypeOrganization}).(*Organization) | 		&organization.Organization{Name: org.Name, Type: user_model.UserTypeOrganization}).(*organization.Organization) | ||||||
| 	test1 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), owner) | 	test1 := organization.HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), owner) | ||||||
| 	test2 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), user3) | 	test2 := organization.HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), user3) | ||||||
| 	test3 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), nil) | 	test3 := organization.HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), nil) | ||||||
| 	assert.True(t, test1)  // owner of org | 	assert.True(t, test1)  // owner of org | ||||||
| 	assert.False(t, test2) // user not a part of org | 	assert.False(t, test2) // user not a part of org | ||||||
| 	assert.False(t, test3) // logged out user | 	assert.False(t, test3) // logged out user | ||||||
| @@ -435,7 +436,7 @@ func TestHasOrgVisibleTypePrivate(t *testing.T) { | |||||||
| func TestGetUsersWhoCanCreateOrgRepo(t *testing.T) { | func TestGetUsersWhoCanCreateOrgRepo(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	users, err := GetUsersWhoCanCreateOrgRepo(db.DefaultContext, 3) | 	users, err := organization.GetUsersWhoCanCreateOrgRepo(db.DefaultContext, 3) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Len(t, users, 2) | 	assert.Len(t, users, 2) | ||||||
| 	var ids []int64 | 	var ids []int64 | ||||||
| @@ -444,8 +445,93 @@ func TestGetUsersWhoCanCreateOrgRepo(t *testing.T) { | |||||||
| 	} | 	} | ||||||
| 	assert.ElementsMatch(t, ids, []int64{2, 28}) | 	assert.ElementsMatch(t, ids, []int64{2, 28}) | ||||||
|  |  | ||||||
| 	users, err = GetUsersWhoCanCreateOrgRepo(db.DefaultContext, 7) | 	users, err = organization.GetUsersWhoCanCreateOrgRepo(db.DefaultContext, 7) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Len(t, users, 1) | 	assert.Len(t, users, 1) | ||||||
| 	assert.EqualValues(t, 5, users[0].ID) | 	assert.EqualValues(t, 5, users[0].ID) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestUser_RemoveOrgRepo(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  | 	org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization) | ||||||
|  | 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: org.ID}).(*repo_model.Repository) | ||||||
|  |  | ||||||
|  | 	// remove a repo that does belong to org | ||||||
|  | 	unittest.AssertExistsAndLoadBean(t, &organization.TeamRepo{RepoID: repo.ID, OrgID: org.ID}) | ||||||
|  | 	assert.NoError(t, organization.RemoveOrgRepo(db.DefaultContext, org.ID, repo.ID)) | ||||||
|  | 	unittest.AssertNotExistsBean(t, &organization.TeamRepo{RepoID: repo.ID, OrgID: org.ID}) | ||||||
|  | 	unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: repo.ID}) // repo should still exist | ||||||
|  |  | ||||||
|  | 	// remove a repo that does not belong to org | ||||||
|  | 	assert.NoError(t, organization.RemoveOrgRepo(db.DefaultContext, org.ID, repo.ID)) | ||||||
|  | 	unittest.AssertNotExistsBean(t, &organization.TeamRepo{RepoID: repo.ID, OrgID: org.ID}) | ||||||
|  |  | ||||||
|  | 	assert.NoError(t, organization.RemoveOrgRepo(db.DefaultContext, org.ID, unittest.NonexistentID)) | ||||||
|  |  | ||||||
|  | 	unittest.CheckConsistencyFor(t, | ||||||
|  | 		&user_model.User{ID: org.ID}, | ||||||
|  | 		&organization.Team{OrgID: org.ID}, | ||||||
|  | 		&repo_model.Repository{ID: repo.ID}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestCreateOrganization(t *testing.T) { | ||||||
|  | 	// successful creation of org | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) | ||||||
|  | 	const newOrgName = "neworg" | ||||||
|  | 	org := &organization.Organization{ | ||||||
|  | 		Name: newOrgName, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	unittest.AssertNotExistsBean(t, &user_model.User{Name: newOrgName, Type: user_model.UserTypeOrganization}) | ||||||
|  | 	assert.NoError(t, organization.CreateOrganization(org, owner)) | ||||||
|  | 	org = unittest.AssertExistsAndLoadBean(t, | ||||||
|  | 		&organization.Organization{Name: newOrgName, Type: user_model.UserTypeOrganization}).(*organization.Organization) | ||||||
|  | 	ownerTeam := unittest.AssertExistsAndLoadBean(t, | ||||||
|  | 		&organization.Team{Name: organization.OwnerTeamName, OrgID: org.ID}).(*organization.Team) | ||||||
|  | 	unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{UID: owner.ID, TeamID: ownerTeam.ID}) | ||||||
|  | 	unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestCreateOrganization2(t *testing.T) { | ||||||
|  | 	// unauthorized creation of org | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User) | ||||||
|  | 	const newOrgName = "neworg" | ||||||
|  | 	org := &organization.Organization{ | ||||||
|  | 		Name: newOrgName, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	unittest.AssertNotExistsBean(t, &organization.Organization{Name: newOrgName, Type: user_model.UserTypeOrganization}) | ||||||
|  | 	err := organization.CreateOrganization(org, owner) | ||||||
|  | 	assert.Error(t, err) | ||||||
|  | 	assert.True(t, organization.IsErrUserNotAllowedCreateOrg(err)) | ||||||
|  | 	unittest.AssertNotExistsBean(t, &organization.Organization{Name: newOrgName, Type: user_model.UserTypeOrganization}) | ||||||
|  | 	unittest.CheckConsistencyFor(t, &organization.Organization{}, &organization.Team{}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestCreateOrganization3(t *testing.T) { | ||||||
|  | 	// create org with same name as existent org | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) | ||||||
|  | 	org := &organization.Organization{Name: "user3"}                      // should already exist | ||||||
|  | 	unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: org.Name}) // sanity check | ||||||
|  | 	err := organization.CreateOrganization(org, owner) | ||||||
|  | 	assert.Error(t, err) | ||||||
|  | 	assert.True(t, user_model.IsErrUserAlreadyExist(err)) | ||||||
|  | 	unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestCreateOrganization4(t *testing.T) { | ||||||
|  | 	// create org with unusable name | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) | ||||||
|  | 	err := organization.CreateOrganization(&organization.Organization{Name: "assets"}, owner) | ||||||
|  | 	assert.Error(t, err) | ||||||
|  | 	assert.True(t, db.IsErrNameReserved(err)) | ||||||
|  | 	unittest.CheckConsistencyFor(t, &organization.Organization{}, &organization.Team{}) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -2,15 +2,17 @@ | |||||||
| // Use of this source code is governed by a MIT-style | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package organization | package organization_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
|  | 	"code.gitea.io/gitea/models/organization" | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
| 	user_model "code.gitea.io/gitea/models/user" | 	user_model "code.gitea.io/gitea/models/user" | ||||||
|  | 	"code.gitea.io/gitea/modules/setting" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| @@ -38,7 +40,7 @@ func TestUserIsPublicMember(t *testing.T) { | |||||||
| func testUserIsPublicMember(t *testing.T, uid, orgID int64, expected bool) { | func testUserIsPublicMember(t *testing.T, uid, orgID int64, expected bool) { | ||||||
| 	user, err := user_model.GetUserByID(uid) | 	user, err := user_model.GetUserByID(uid) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	is, err := IsPublicMembership(orgID, user.ID) | 	is, err := organization.IsPublicMembership(orgID, user.ID) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, expected, is) | 	assert.Equal(t, expected, is) | ||||||
| } | } | ||||||
| @@ -66,7 +68,7 @@ func TestIsUserOrgOwner(t *testing.T) { | |||||||
| func testIsUserOrgOwner(t *testing.T, uid, orgID int64, expected bool) { | func testIsUserOrgOwner(t *testing.T, uid, orgID int64, expected bool) { | ||||||
| 	user, err := user_model.GetUserByID(uid) | 	user, err := user_model.GetUserByID(uid) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	is, err := IsOrganizationOwner(db.DefaultContext, orgID, user.ID) | 	is, err := organization.IsOrganizationOwner(db.DefaultContext, orgID, user.ID) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, expected, is) | 	assert.Equal(t, expected, is) | ||||||
| } | } | ||||||
| @@ -91,7 +93,7 @@ func TestUserListIsPublicMember(t *testing.T) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func testUserListIsPublicMember(t *testing.T, orgID int64, expected map[int64]bool) { | func testUserListIsPublicMember(t *testing.T, orgID int64, expected map[int64]bool) { | ||||||
| 	org, err := GetOrgByID(db.DefaultContext, orgID) | 	org, err := organization.GetOrgByID(db.DefaultContext, orgID) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	_, membersIsPublic, err := org.GetMembers() | 	_, membersIsPublic, err := org.GetMembers() | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| @@ -118,9 +120,36 @@ func TestUserListIsUserOrgOwner(t *testing.T) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func testUserListIsUserOrgOwner(t *testing.T, orgID int64, expected map[int64]bool) { | func testUserListIsUserOrgOwner(t *testing.T, orgID int64, expected map[int64]bool) { | ||||||
| 	org, err := GetOrgByID(db.DefaultContext, orgID) | 	org, err := organization.GetOrgByID(db.DefaultContext, orgID) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	members, _, err := org.GetMembers() | 	members, _, err := org.GetMembers() | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, expected, IsUserOrgOwner(members, orgID)) | 	assert.Equal(t, expected, organization.IsUserOrgOwner(members, orgID)) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestAddOrgUser(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  | 	testSuccess := func(orgID, userID int64, isPublic bool) { | ||||||
|  | 		org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID}).(*user_model.User) | ||||||
|  | 		expectedNumMembers := org.NumMembers | ||||||
|  | 		if !unittest.BeanExists(t, &organization.OrgUser{OrgID: orgID, UID: userID}) { | ||||||
|  | 			expectedNumMembers++ | ||||||
|  | 		} | ||||||
|  | 		assert.NoError(t, organization.AddOrgUser(orgID, userID)) | ||||||
|  | 		ou := &organization.OrgUser{OrgID: orgID, UID: userID} | ||||||
|  | 		unittest.AssertExistsAndLoadBean(t, ou) | ||||||
|  | 		assert.Equal(t, isPublic, ou.IsPublic) | ||||||
|  | 		org = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: orgID}).(*user_model.User) | ||||||
|  | 		assert.EqualValues(t, expectedNumMembers, org.NumMembers) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	setting.Service.DefaultOrgMemberVisible = false | ||||||
|  | 	testSuccess(3, 5, false) | ||||||
|  | 	testSuccess(3, 5, false) | ||||||
|  | 	testSuccess(6, 2, false) | ||||||
|  |  | ||||||
|  | 	setting.Service.DefaultOrgMemberVisible = true | ||||||
|  | 	testSuccess(6, 3, true) | ||||||
|  |  | ||||||
|  | 	unittest.CheckConsistencyFor(t, &user_model.User{}, &organization.Team{}) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,12 +2,13 @@ | |||||||
| // Use of this source code is governed by a MIT-style | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package organization | package organization_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
|  | 	"code.gitea.io/gitea/models/organization" | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| @@ -16,22 +17,22 @@ import ( | |||||||
| func TestTeam_IsOwnerTeam(t *testing.T) { | func TestTeam_IsOwnerTeam(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	team := unittest.AssertExistsAndLoadBean(t, &Team{ID: 1}).(*Team) | 	team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 1}).(*organization.Team) | ||||||
| 	assert.True(t, team.IsOwnerTeam()) | 	assert.True(t, team.IsOwnerTeam()) | ||||||
|  |  | ||||||
| 	team = unittest.AssertExistsAndLoadBean(t, &Team{ID: 2}).(*Team) | 	team = unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 2}).(*organization.Team) | ||||||
| 	assert.False(t, team.IsOwnerTeam()) | 	assert.False(t, team.IsOwnerTeam()) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestTeam_IsMember(t *testing.T) { | func TestTeam_IsMember(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	team := unittest.AssertExistsAndLoadBean(t, &Team{ID: 1}).(*Team) | 	team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 1}).(*organization.Team) | ||||||
| 	assert.True(t, team.IsMember(2)) | 	assert.True(t, team.IsMember(2)) | ||||||
| 	assert.False(t, team.IsMember(4)) | 	assert.False(t, team.IsMember(4)) | ||||||
| 	assert.False(t, team.IsMember(unittest.NonexistentID)) | 	assert.False(t, team.IsMember(unittest.NonexistentID)) | ||||||
|  |  | ||||||
| 	team = unittest.AssertExistsAndLoadBean(t, &Team{ID: 2}).(*Team) | 	team = unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 2}).(*organization.Team) | ||||||
| 	assert.True(t, team.IsMember(2)) | 	assert.True(t, team.IsMember(2)) | ||||||
| 	assert.True(t, team.IsMember(4)) | 	assert.True(t, team.IsMember(4)) | ||||||
| 	assert.False(t, team.IsMember(unittest.NonexistentID)) | 	assert.False(t, team.IsMember(unittest.NonexistentID)) | ||||||
| @@ -41,11 +42,11 @@ func TestTeam_GetRepositories(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	test := func(teamID int64) { | 	test := func(teamID int64) { | ||||||
| 		team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team) | 		team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: teamID}).(*organization.Team) | ||||||
| 		assert.NoError(t, team.GetRepositoriesCtx(db.DefaultContext)) | 		assert.NoError(t, team.GetRepositoriesCtx(db.DefaultContext)) | ||||||
| 		assert.Len(t, team.Repos, team.NumRepos) | 		assert.Len(t, team.Repos, team.NumRepos) | ||||||
| 		for _, repo := range team.Repos { | 		for _, repo := range team.Repos { | ||||||
| 			unittest.AssertExistsAndLoadBean(t, &TeamRepo{TeamID: teamID, RepoID: repo.ID}) | 			unittest.AssertExistsAndLoadBean(t, &organization.TeamRepo{TeamID: teamID, RepoID: repo.ID}) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	test(1) | 	test(1) | ||||||
| @@ -56,11 +57,11 @@ func TestTeam_GetMembers(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	test := func(teamID int64) { | 	test := func(teamID int64) { | ||||||
| 		team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team) | 		team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: teamID}).(*organization.Team) | ||||||
| 		assert.NoError(t, team.GetMembersCtx(db.DefaultContext)) | 		assert.NoError(t, team.GetMembersCtx(db.DefaultContext)) | ||||||
| 		assert.Len(t, team.Members, team.NumMembers) | 		assert.Len(t, team.Members, team.NumMembers) | ||||||
| 		for _, member := range team.Members { | 		for _, member := range team.Members { | ||||||
| 			unittest.AssertExistsAndLoadBean(t, &TeamUser{UID: member.ID, TeamID: teamID}) | 			unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{UID: member.ID, TeamID: teamID}) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	test(1) | 	test(1) | ||||||
| @@ -71,7 +72,7 @@ func TestGetTeam(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	testSuccess := func(orgID int64, name string) { | 	testSuccess := func(orgID int64, name string) { | ||||||
| 		team, err := GetTeam(db.DefaultContext, orgID, name) | 		team, err := organization.GetTeam(db.DefaultContext, orgID, name) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		assert.EqualValues(t, orgID, team.OrgID) | 		assert.EqualValues(t, orgID, team.OrgID) | ||||||
| 		assert.Equal(t, name, team.Name) | 		assert.Equal(t, name, team.Name) | ||||||
| @@ -79,9 +80,9 @@ func TestGetTeam(t *testing.T) { | |||||||
| 	testSuccess(3, "Owners") | 	testSuccess(3, "Owners") | ||||||
| 	testSuccess(3, "team1") | 	testSuccess(3, "team1") | ||||||
|  |  | ||||||
| 	_, err := GetTeam(db.DefaultContext, 3, "nonexistent") | 	_, err := organization.GetTeam(db.DefaultContext, 3, "nonexistent") | ||||||
| 	assert.Error(t, err) | 	assert.Error(t, err) | ||||||
| 	_, err = GetTeam(db.DefaultContext, unittest.NonexistentID, "Owners") | 	_, err = organization.GetTeam(db.DefaultContext, unittest.NonexistentID, "Owners") | ||||||
| 	assert.Error(t, err) | 	assert.Error(t, err) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -89,7 +90,7 @@ func TestGetTeamByID(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	testSuccess := func(teamID int64) { | 	testSuccess := func(teamID int64) { | ||||||
| 		team, err := GetTeamByID(db.DefaultContext, teamID) | 		team, err := organization.GetTeamByID(db.DefaultContext, teamID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		assert.EqualValues(t, teamID, team.ID) | 		assert.EqualValues(t, teamID, team.ID) | ||||||
| 	} | 	} | ||||||
| @@ -98,14 +99,14 @@ func TestGetTeamByID(t *testing.T) { | |||||||
| 	testSuccess(3) | 	testSuccess(3) | ||||||
| 	testSuccess(4) | 	testSuccess(4) | ||||||
|  |  | ||||||
| 	_, err := GetTeamByID(db.DefaultContext, unittest.NonexistentID) | 	_, err := organization.GetTeamByID(db.DefaultContext, unittest.NonexistentID) | ||||||
| 	assert.Error(t, err) | 	assert.Error(t, err) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestIsTeamMember(t *testing.T) { | func TestIsTeamMember(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	test := func(orgID, teamID, userID int64, expected bool) { | 	test := func(orgID, teamID, userID int64, expected bool) { | ||||||
| 		isMember, err := IsTeamMember(db.DefaultContext, orgID, teamID, userID) | 		isMember, err := organization.IsTeamMember(db.DefaultContext, orgID, teamID, userID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		assert.Equal(t, expected, isMember) | 		assert.Equal(t, expected, isMember) | ||||||
| 	} | 	} | ||||||
| @@ -125,14 +126,14 @@ func TestGetTeamMembers(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	test := func(teamID int64) { | 	test := func(teamID int64) { | ||||||
| 		team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team) | 		team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: teamID}).(*organization.Team) | ||||||
| 		members, err := GetTeamMembers(db.DefaultContext, &SearchMembersOptions{ | 		members, err := organization.GetTeamMembers(db.DefaultContext, &organization.SearchMembersOptions{ | ||||||
| 			TeamID: teamID, | 			TeamID: teamID, | ||||||
| 		}) | 		}) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		assert.Len(t, members, team.NumMembers) | 		assert.Len(t, members, team.NumMembers) | ||||||
| 		for _, member := range members { | 		for _, member := range members { | ||||||
| 			unittest.AssertExistsAndLoadBean(t, &TeamUser{UID: member.ID, TeamID: teamID}) | 			unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{UID: member.ID, TeamID: teamID}) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	test(1) | 	test(1) | ||||||
| @@ -142,10 +143,10 @@ func TestGetTeamMembers(t *testing.T) { | |||||||
| func TestGetUserTeams(t *testing.T) { | func TestGetUserTeams(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	test := func(userID int64) { | 	test := func(userID int64) { | ||||||
| 		teams, _, err := SearchTeam(&SearchTeamOptions{UserID: userID}) | 		teams, _, err := organization.SearchTeam(&organization.SearchTeamOptions{UserID: userID}) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		for _, team := range teams { | 		for _, team := range teams { | ||||||
| 			unittest.AssertExistsAndLoadBean(t, &TeamUser{TeamID: team.ID, UID: userID}) | 			unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{TeamID: team.ID, UID: userID}) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	test(2) | 	test(2) | ||||||
| @@ -156,11 +157,11 @@ func TestGetUserTeams(t *testing.T) { | |||||||
| func TestGetUserOrgTeams(t *testing.T) { | func TestGetUserOrgTeams(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	test := func(orgID, userID int64) { | 	test := func(orgID, userID int64) { | ||||||
| 		teams, err := GetUserOrgTeams(db.DefaultContext, orgID, userID) | 		teams, err := organization.GetUserOrgTeams(db.DefaultContext, orgID, userID) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		for _, team := range teams { | 		for _, team := range teams { | ||||||
| 			assert.EqualValues(t, orgID, team.OrgID) | 			assert.EqualValues(t, orgID, team.OrgID) | ||||||
| 			unittest.AssertExistsAndLoadBean(t, &TeamUser{TeamID: team.ID, UID: userID}) | 			unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{TeamID: team.ID, UID: userID}) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	test(3, 2) | 	test(3, 2) | ||||||
| @@ -172,8 +173,8 @@ func TestHasTeamRepo(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	test := func(teamID, repoID int64, expected bool) { | 	test := func(teamID, repoID int64, expected bool) { | ||||||
| 		team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team) | 		team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: teamID}).(*organization.Team) | ||||||
| 		assert.Equal(t, expected, HasTeamRepo(db.DefaultContext, team.OrgID, teamID, repoID)) | 		assert.Equal(t, expected, organization.HasTeamRepo(db.DefaultContext, team.OrgID, teamID, repoID)) | ||||||
| 	} | 	} | ||||||
| 	test(1, 1, false) | 	test(1, 1, false) | ||||||
| 	test(1, 3, true) | 	test(1, 3, true) | ||||||
| @@ -188,7 +189,7 @@ func TestUsersInTeamsCount(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	test := func(teamIDs, userIDs []int64, expected int64) { | 	test := func(teamIDs, userIDs []int64, expected int64) { | ||||||
| 		count, err := UsersInTeamsCount(teamIDs, userIDs) | 		count, err := organization.UsersInTeamsCount(teamIDs, userIDs) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		assert.Equal(t, expected, count) | 		assert.Equal(t, expected, count) | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -2,14 +2,18 @@ | |||||||
| // Use of this source code is governed by a MIT-style | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package access | package access_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
|  | 	"code.gitea.io/gitea/models" | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
| 	"code.gitea.io/gitea/models/perm" | 	"code.gitea.io/gitea/models/organization" | ||||||
|  | 	perm_model "code.gitea.io/gitea/models/perm" | ||||||
|  | 	access_model "code.gitea.io/gitea/models/perm/access" | ||||||
| 	repo_model "code.gitea.io/gitea/models/repo" | 	repo_model "code.gitea.io/gitea/models/repo" | ||||||
|  | 	"code.gitea.io/gitea/models/unit" | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
| 	user_model "code.gitea.io/gitea/models/user" | 	user_model "code.gitea.io/gitea/models/user" | ||||||
|  |  | ||||||
| @@ -35,36 +39,36 @@ func TestAccessLevel(t *testing.T) { | |||||||
| 	// org. owned private repo | 	// org. owned private repo | ||||||
| 	repo24 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 24}).(*repo_model.Repository) | 	repo24 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 24}).(*repo_model.Repository) | ||||||
|  |  | ||||||
| 	level, err := AccessLevel(user2, repo1) | 	level, err := access_model.AccessLevel(user2, repo1) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, perm.AccessModeOwner, level) | 	assert.Equal(t, perm_model.AccessModeOwner, level) | ||||||
|  |  | ||||||
| 	level, err = AccessLevel(user2, repo3) | 	level, err = access_model.AccessLevel(user2, repo3) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, perm.AccessModeOwner, level) | 	assert.Equal(t, perm_model.AccessModeOwner, level) | ||||||
|  |  | ||||||
| 	level, err = AccessLevel(user5, repo1) | 	level, err = access_model.AccessLevel(user5, repo1) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, perm.AccessModeRead, level) | 	assert.Equal(t, perm_model.AccessModeRead, level) | ||||||
|  |  | ||||||
| 	level, err = AccessLevel(user5, repo3) | 	level, err = access_model.AccessLevel(user5, repo3) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, perm.AccessModeNone, level) | 	assert.Equal(t, perm_model.AccessModeNone, level) | ||||||
|  |  | ||||||
| 	// restricted user has no access to a public repo | 	// restricted user has no access to a public repo | ||||||
| 	level, err = AccessLevel(user29, repo1) | 	level, err = access_model.AccessLevel(user29, repo1) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, perm.AccessModeNone, level) | 	assert.Equal(t, perm_model.AccessModeNone, level) | ||||||
|  |  | ||||||
| 	// ... unless he's a collaborator | 	// ... unless he's a collaborator | ||||||
| 	level, err = AccessLevel(user29, repo4) | 	level, err = access_model.AccessLevel(user29, repo4) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, perm.AccessModeWrite, level) | 	assert.Equal(t, perm_model.AccessModeWrite, level) | ||||||
|  |  | ||||||
| 	// ... or a team member | 	// ... or a team member | ||||||
| 	level, err = AccessLevel(user29, repo24) | 	level, err = access_model.AccessLevel(user29, repo24) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, perm.AccessModeRead, level) | 	assert.Equal(t, perm_model.AccessModeRead, level) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestHasAccess(t *testing.T) { | func TestHasAccess(t *testing.T) { | ||||||
| @@ -79,17 +83,17 @@ func TestHasAccess(t *testing.T) { | |||||||
| 	repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}).(*repo_model.Repository) | 	repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}).(*repo_model.Repository) | ||||||
| 	assert.True(t, repo2.IsPrivate) | 	assert.True(t, repo2.IsPrivate) | ||||||
|  |  | ||||||
| 	has, err := HasAccess(db.DefaultContext, user1.ID, repo1) | 	has, err := access_model.HasAccess(db.DefaultContext, user1.ID, repo1) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.True(t, has) | 	assert.True(t, has) | ||||||
|  |  | ||||||
| 	_, err = HasAccess(db.DefaultContext, user1.ID, repo2) | 	_, err = access_model.HasAccess(db.DefaultContext, user1.ID, repo2) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
| 	_, err = HasAccess(db.DefaultContext, user2.ID, repo1) | 	_, err = access_model.HasAccess(db.DefaultContext, user2.ID, repo1) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
| 	_, err = HasAccess(db.DefaultContext, user2.ID, repo2) | 	_, err = access_model.HasAccess(db.DefaultContext, user2.ID, repo2) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -101,13 +105,13 @@ func TestRepository_RecalculateAccesses(t *testing.T) { | |||||||
|  |  | ||||||
| 	_, err := db.GetEngine(db.DefaultContext).Delete(&repo_model.Collaboration{UserID: 2, RepoID: 3}) | 	_, err := db.GetEngine(db.DefaultContext).Delete(&repo_model.Collaboration{UserID: 2, RepoID: 3}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.NoError(t, RecalculateAccesses(db.DefaultContext, repo1)) | 	assert.NoError(t, access_model.RecalculateAccesses(db.DefaultContext, repo1)) | ||||||
|  |  | ||||||
| 	access := &Access{UserID: 2, RepoID: 3} | 	access := &access_model.Access{UserID: 2, RepoID: 3} | ||||||
| 	has, err := db.GetEngine(db.DefaultContext).Get(access) | 	has, err := db.GetEngine(db.DefaultContext).Get(access) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.True(t, has) | 	assert.True(t, has) | ||||||
| 	assert.Equal(t, perm.AccessModeOwner, access.Mode) | 	assert.Equal(t, perm_model.AccessModeOwner, access.Mode) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestRepository_RecalculateAccesses2(t *testing.T) { | func TestRepository_RecalculateAccesses2(t *testing.T) { | ||||||
| @@ -118,9 +122,255 @@ func TestRepository_RecalculateAccesses2(t *testing.T) { | |||||||
|  |  | ||||||
| 	_, err := db.GetEngine(db.DefaultContext).Delete(&repo_model.Collaboration{UserID: 4, RepoID: 4}) | 	_, err := db.GetEngine(db.DefaultContext).Delete(&repo_model.Collaboration{UserID: 4, RepoID: 4}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.NoError(t, RecalculateAccesses(db.DefaultContext, repo1)) | 	assert.NoError(t, access_model.RecalculateAccesses(db.DefaultContext, repo1)) | ||||||
|  |  | ||||||
| 	has, err := db.GetEngine(db.DefaultContext).Get(&Access{UserID: 4, RepoID: 4}) | 	has, err := db.GetEngine(db.DefaultContext).Get(&access_model.Access{UserID: 4, RepoID: 4}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.False(t, has) | 	assert.False(t, has) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestRepoPermissionPublicNonOrgRepo(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	// public non-organization repo | ||||||
|  | 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4}).(*repo_model.Repository) | ||||||
|  | 	assert.NoError(t, repo.LoadUnits(db.DefaultContext)) | ||||||
|  |  | ||||||
|  | 	// plain user | ||||||
|  | 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) | ||||||
|  | 	perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.False(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// change to collaborator | ||||||
|  | 	assert.NoError(t, models.AddCollaborator(repo, user)) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// collaborator | ||||||
|  | 	collaborator := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, collaborator) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// owner | ||||||
|  | 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// admin | ||||||
|  | 	admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestRepoPermissionPrivateNonOrgRepo(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	// private non-organization repo | ||||||
|  | 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository) | ||||||
|  | 	assert.NoError(t, repo.LoadUnits(db.DefaultContext)) | ||||||
|  |  | ||||||
|  | 	// plain user | ||||||
|  | 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}).(*user_model.User) | ||||||
|  | 	perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.False(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.False(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// change to collaborator to default write access | ||||||
|  | 	assert.NoError(t, models.AddCollaborator(repo, user)) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, user.ID, perm_model.AccessModeRead)) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.False(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// owner | ||||||
|  | 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// admin | ||||||
|  | 	admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestRepoPermissionPublicOrgRepo(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	// public organization repo | ||||||
|  | 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 32}).(*repo_model.Repository) | ||||||
|  | 	assert.NoError(t, repo.LoadUnits(db.DefaultContext)) | ||||||
|  |  | ||||||
|  | 	// plain user | ||||||
|  | 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User) | ||||||
|  | 	perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.False(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// change to collaborator to default write access | ||||||
|  | 	assert.NoError(t, models.AddCollaborator(repo, user)) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, user.ID, perm_model.AccessModeRead)) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.False(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// org member team owner | ||||||
|  | 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// org member team tester | ||||||
|  | 	member := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 15}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, member) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 	} | ||||||
|  | 	assert.True(t, perm.CanWrite(unit.TypeIssues)) | ||||||
|  | 	assert.False(t, perm.CanWrite(unit.TypeCode)) | ||||||
|  |  | ||||||
|  | 	// admin | ||||||
|  | 	admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestRepoPermissionPrivateOrgRepo(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	// private organization repo | ||||||
|  | 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 24}).(*repo_model.Repository) | ||||||
|  | 	assert.NoError(t, repo.LoadUnits(db.DefaultContext)) | ||||||
|  |  | ||||||
|  | 	// plain user | ||||||
|  | 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User) | ||||||
|  | 	perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.False(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.False(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// change to collaborator to default write access | ||||||
|  | 	assert.NoError(t, models.AddCollaborator(repo, user)) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, user.ID, perm_model.AccessModeRead)) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.False(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// org member team owner | ||||||
|  | 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 15}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// update team information and then check permission | ||||||
|  | 	team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 5}).(*organization.Team) | ||||||
|  | 	err = organization.UpdateTeamUnits(team, nil) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// org member team tester | ||||||
|  | 	tester := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, tester) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	assert.True(t, perm.CanWrite(unit.TypeIssues)) | ||||||
|  | 	assert.False(t, perm.CanWrite(unit.TypeCode)) | ||||||
|  | 	assert.False(t, perm.CanRead(unit.TypeCode)) | ||||||
|  |  | ||||||
|  | 	// org member team reviewer | ||||||
|  | 	reviewer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 20}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, reviewer) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	assert.False(t, perm.CanRead(unit.TypeIssues)) | ||||||
|  | 	assert.False(t, perm.CanWrite(unit.TypeCode)) | ||||||
|  | 	assert.True(t, perm.CanRead(unit.TypeCode)) | ||||||
|  |  | ||||||
|  | 	// admin | ||||||
|  | 	admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User) | ||||||
|  | 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	for _, unit := range repo.Units { | ||||||
|  | 		assert.True(t, perm.CanRead(unit.Type)) | ||||||
|  | 		assert.True(t, perm.CanWrite(unit.Type)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| // Use of this source code is governed by a MIT-style | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package access | package access_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| @@ -10,23 +10,13 @@ import ( | |||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  |  | ||||||
|  | 	_ "code.gitea.io/gitea/models" | ||||||
| 	_ "code.gitea.io/gitea/models/repo" | 	_ "code.gitea.io/gitea/models/repo" | ||||||
|  | 	_ "code.gitea.io/gitea/models/user" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestMain(m *testing.M) { | func TestMain(m *testing.M) { | ||||||
| 	unittest.MainTest(m, &unittest.TestOptions{ | 	unittest.MainTest(m, &unittest.TestOptions{ | ||||||
| 		GiteaRootPath: filepath.Join("..", "..", ".."), | 		GiteaRootPath: filepath.Join("..", "..", ".."), | ||||||
| 		FixtureFiles: []string{ |  | ||||||
| 			"access.yml", |  | ||||||
| 			"user.yml", |  | ||||||
| 			"repository.yml", |  | ||||||
| 			"collaboration.yml", |  | ||||||
| 			"org_user.yml", |  | ||||||
| 			"repo_unit.yml", |  | ||||||
| 			"team_user.yml", |  | ||||||
| 			"team_repo.yml", |  | ||||||
| 			"team.yml", |  | ||||||
| 			"team_unit.yml", |  | ||||||
| 		}, |  | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,6 +8,8 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
|  | 	"code.gitea.io/gitea/models/perm" | ||||||
|  | 	access_model "code.gitea.io/gitea/models/perm/access" | ||||||
| 	repo_model "code.gitea.io/gitea/models/repo" | 	repo_model "code.gitea.io/gitea/models/repo" | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  |  | ||||||
| @@ -48,3 +50,22 @@ func TestRepository_IsCollaborator(t *testing.T) { | |||||||
| 	test(4, 2, false) | 	test(4, 2, false) | ||||||
| 	test(4, 4, true) | 	test(4, 4, true) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestRepository_ChangeCollaborationAccessMode(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4}).(*repo_model.Repository) | ||||||
|  | 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, 4, perm.AccessModeAdmin)) | ||||||
|  |  | ||||||
|  | 	collaboration := unittest.AssertExistsAndLoadBean(t, &repo_model.Collaboration{RepoID: repo.ID, UserID: 4}).(*repo_model.Collaboration) | ||||||
|  | 	assert.EqualValues(t, perm.AccessModeAdmin, collaboration.Mode) | ||||||
|  |  | ||||||
|  | 	access := unittest.AssertExistsAndLoadBean(t, &access_model.Access{UserID: 4, RepoID: repo.ID}).(*access_model.Access) | ||||||
|  | 	assert.EqualValues(t, perm.AccessModeAdmin, access.Mode) | ||||||
|  |  | ||||||
|  | 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, 4, perm.AccessModeAdmin)) | ||||||
|  |  | ||||||
|  | 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, unittest.NonexistentID, perm.AccessModeAdmin)) | ||||||
|  |  | ||||||
|  | 	unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repo.ID}) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -9,7 +9,10 @@ import ( | |||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
| 	repo_model "code.gitea.io/gitea/models/repo" | 	repo_model "code.gitea.io/gitea/models/repo" | ||||||
|  | 	"code.gitea.io/gitea/models/unit" | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  | 	user_model "code.gitea.io/gitea/models/user" | ||||||
|  | 	"code.gitea.io/gitea/modules/markup" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| @@ -57,3 +60,68 @@ func TestRepoAPIURL(t *testing.T) { | |||||||
|  |  | ||||||
| 	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user12/repo10", repo.APIURL()) | 	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user12/repo10", repo.APIURL()) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestWatchRepo(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  | 	const repoID = 3 | ||||||
|  | 	const userID = 2 | ||||||
|  |  | ||||||
|  | 	assert.NoError(t, repo_model.WatchRepo(db.DefaultContext, userID, repoID, true)) | ||||||
|  | 	unittest.AssertExistsAndLoadBean(t, &repo_model.Watch{RepoID: repoID, UserID: userID}) | ||||||
|  | 	unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repoID}) | ||||||
|  |  | ||||||
|  | 	assert.NoError(t, repo_model.WatchRepo(db.DefaultContext, userID, repoID, false)) | ||||||
|  | 	unittest.AssertNotExistsBean(t, &repo_model.Watch{RepoID: repoID, UserID: userID}) | ||||||
|  | 	unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repoID}) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestMetas(t *testing.T) { | ||||||
|  | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|  | 	repo := &repo_model.Repository{Name: "testRepo"} | ||||||
|  | 	repo.Owner = &user_model.User{Name: "testOwner"} | ||||||
|  | 	repo.OwnerName = repo.Owner.Name | ||||||
|  |  | ||||||
|  | 	repo.Units = nil | ||||||
|  |  | ||||||
|  | 	metas := repo.ComposeMetas() | ||||||
|  | 	assert.Equal(t, "testRepo", metas["repo"]) | ||||||
|  | 	assert.Equal(t, "testOwner", metas["user"]) | ||||||
|  |  | ||||||
|  | 	externalTracker := repo_model.RepoUnit{ | ||||||
|  | 		Type: unit.TypeExternalTracker, | ||||||
|  | 		Config: &repo_model.ExternalTrackerConfig{ | ||||||
|  | 			ExternalTrackerFormat: "https://someurl.com/{user}/{repo}/{issue}", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	testSuccess := func(expectedStyle string) { | ||||||
|  | 		repo.Units = []*repo_model.RepoUnit{&externalTracker} | ||||||
|  | 		repo.RenderingMetas = nil | ||||||
|  | 		metas := repo.ComposeMetas() | ||||||
|  | 		assert.Equal(t, expectedStyle, metas["style"]) | ||||||
|  | 		assert.Equal(t, "testRepo", metas["repo"]) | ||||||
|  | 		assert.Equal(t, "testOwner", metas["user"]) | ||||||
|  | 		assert.Equal(t, "https://someurl.com/{user}/{repo}/{issue}", metas["format"]) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	testSuccess(markup.IssueNameStyleNumeric) | ||||||
|  |  | ||||||
|  | 	externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleAlphanumeric | ||||||
|  | 	testSuccess(markup.IssueNameStyleAlphanumeric) | ||||||
|  |  | ||||||
|  | 	externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleNumeric | ||||||
|  | 	testSuccess(markup.IssueNameStyleNumeric) | ||||||
|  |  | ||||||
|  | 	externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleRegexp | ||||||
|  | 	testSuccess(markup.IssueNameStyleRegexp) | ||||||
|  |  | ||||||
|  | 	repo, err := repo_model.GetRepositoryByID(3) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	metas = repo.ComposeMetas() | ||||||
|  | 	assert.Contains(t, metas, "org") | ||||||
|  | 	assert.Contains(t, metas, "teams") | ||||||
|  | 	assert.Equal(t, "user3", metas["org"]) | ||||||
|  | 	assert.Equal(t, ",owners,team1,", metas["teams"]) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -8,8 +8,6 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
| 	"code.gitea.io/gitea/models/perm" |  | ||||||
| 	access_model "code.gitea.io/gitea/models/perm/access" |  | ||||||
| 	repo_model "code.gitea.io/gitea/models/repo" | 	repo_model "code.gitea.io/gitea/models/repo" | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
| 	user_model "code.gitea.io/gitea/models/user" | 	user_model "code.gitea.io/gitea/models/user" | ||||||
| @@ -32,25 +30,6 @@ func TestRepository_AddCollaborator(t *testing.T) { | |||||||
| 	testSuccess(3, 4) | 	testSuccess(3, 4) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestRepository_ChangeCollaborationAccessMode(t *testing.T) { |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4}).(*repo_model.Repository) |  | ||||||
| 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, 4, perm.AccessModeAdmin)) |  | ||||||
|  |  | ||||||
| 	collaboration := unittest.AssertExistsAndLoadBean(t, &repo_model.Collaboration{RepoID: repo.ID, UserID: 4}).(*repo_model.Collaboration) |  | ||||||
| 	assert.EqualValues(t, perm.AccessModeAdmin, collaboration.Mode) |  | ||||||
|  |  | ||||||
| 	access := unittest.AssertExistsAndLoadBean(t, &access_model.Access{UserID: 4, RepoID: repo.ID}).(*access_model.Access) |  | ||||||
| 	assert.EqualValues(t, perm.AccessModeAdmin, access.Mode) |  | ||||||
|  |  | ||||||
| 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, 4, perm.AccessModeAdmin)) |  | ||||||
|  |  | ||||||
| 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, unittest.NonexistentID, perm.AccessModeAdmin)) |  | ||||||
|  |  | ||||||
| 	unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repo.ID}) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestRepository_DeleteCollaboration(t *testing.T) { | func TestRepository_DeleteCollaboration(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,266 +0,0 @@ | |||||||
| // Copyright 2018 The Gitea Authors. All rights reserved. |  | ||||||
| // Use of this source code is governed by a MIT-style |  | ||||||
| // license that can be found in the LICENSE file. |  | ||||||
|  |  | ||||||
| package models |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"testing" |  | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" |  | ||||||
| 	"code.gitea.io/gitea/models/organization" |  | ||||||
| 	perm_model "code.gitea.io/gitea/models/perm" |  | ||||||
| 	access_model "code.gitea.io/gitea/models/perm/access" |  | ||||||
| 	repo_model "code.gitea.io/gitea/models/repo" |  | ||||||
| 	"code.gitea.io/gitea/models/unit" |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" |  | ||||||
| 	user_model "code.gitea.io/gitea/models/user" |  | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func TestRepoPermissionPublicNonOrgRepo(t *testing.T) { |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	// public non-organization repo |  | ||||||
| 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4}).(*repo_model.Repository) |  | ||||||
| 	assert.NoError(t, repo.LoadUnits(db.DefaultContext)) |  | ||||||
|  |  | ||||||
| 	// plain user |  | ||||||
| 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) |  | ||||||
| 	perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.False(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// change to collaborator |  | ||||||
| 	assert.NoError(t, AddCollaborator(repo, user)) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// collaborator |  | ||||||
| 	collaborator := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, collaborator) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// owner |  | ||||||
| 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// admin |  | ||||||
| 	admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestRepoPermissionPrivateNonOrgRepo(t *testing.T) { |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	// private non-organization repo |  | ||||||
| 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository) |  | ||||||
| 	assert.NoError(t, repo.LoadUnits(db.DefaultContext)) |  | ||||||
|  |  | ||||||
| 	// plain user |  | ||||||
| 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}).(*user_model.User) |  | ||||||
| 	perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.False(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.False(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// change to collaborator to default write access |  | ||||||
| 	assert.NoError(t, AddCollaborator(repo, user)) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, user.ID, perm_model.AccessModeRead)) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.False(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// owner |  | ||||||
| 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// admin |  | ||||||
| 	admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestRepoPermissionPublicOrgRepo(t *testing.T) { |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	// public organization repo |  | ||||||
| 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 32}).(*repo_model.Repository) |  | ||||||
| 	assert.NoError(t, repo.LoadUnits(db.DefaultContext)) |  | ||||||
|  |  | ||||||
| 	// plain user |  | ||||||
| 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User) |  | ||||||
| 	perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.False(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// change to collaborator to default write access |  | ||||||
| 	assert.NoError(t, AddCollaborator(repo, user)) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, user.ID, perm_model.AccessModeRead)) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.False(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// org member team owner |  | ||||||
| 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// org member team tester |  | ||||||
| 	member := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 15}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, member) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 	} |  | ||||||
| 	assert.True(t, perm.CanWrite(unit.TypeIssues)) |  | ||||||
| 	assert.False(t, perm.CanWrite(unit.TypeCode)) |  | ||||||
|  |  | ||||||
| 	// admin |  | ||||||
| 	admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestRepoPermissionPrivateOrgRepo(t *testing.T) { |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	// private organization repo |  | ||||||
| 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 24}).(*repo_model.Repository) |  | ||||||
| 	assert.NoError(t, repo.LoadUnits(db.DefaultContext)) |  | ||||||
|  |  | ||||||
| 	// plain user |  | ||||||
| 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User) |  | ||||||
| 	perm, err := access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.False(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.False(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// change to collaborator to default write access |  | ||||||
| 	assert.NoError(t, AddCollaborator(repo, user)) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	assert.NoError(t, repo_model.ChangeCollaborationAccessMode(repo, user.ID, perm_model.AccessModeRead)) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, user) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.False(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// org member team owner |  | ||||||
| 	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 15}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// update team information and then check permission |  | ||||||
| 	team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 5}).(*organization.Team) |  | ||||||
| 	err = organization.UpdateTeamUnits(team, nil) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, owner) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// org member team tester |  | ||||||
| 	tester := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, tester) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.True(t, perm.CanWrite(unit.TypeIssues)) |  | ||||||
| 	assert.False(t, perm.CanWrite(unit.TypeCode)) |  | ||||||
| 	assert.False(t, perm.CanRead(unit.TypeCode)) |  | ||||||
|  |  | ||||||
| 	// org member team reviewer |  | ||||||
| 	reviewer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 20}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, reviewer) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	assert.False(t, perm.CanRead(unit.TypeIssues)) |  | ||||||
| 	assert.False(t, perm.CanWrite(unit.TypeCode)) |  | ||||||
| 	assert.True(t, perm.CanRead(unit.TypeCode)) |  | ||||||
|  |  | ||||||
| 	// admin |  | ||||||
| 	admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User) |  | ||||||
| 	perm, err = access_model.GetUserRepoPermission(db.DefaultContext, repo, admin) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
| 	for _, unit := range repo.Units { |  | ||||||
| 		assert.True(t, perm.CanRead(unit.Type)) |  | ||||||
| 		assert.True(t, perm.CanWrite(unit.Type)) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -8,11 +8,7 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
| 	repo_model "code.gitea.io/gitea/models/repo" |  | ||||||
| 	"code.gitea.io/gitea/models/unit" |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
| 	user_model "code.gitea.io/gitea/models/user" |  | ||||||
| 	"code.gitea.io/gitea/modules/markup" |  | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| @@ -22,71 +18,6 @@ func TestCheckRepoStats(t *testing.T) { | |||||||
| 	assert.NoError(t, CheckRepoStats(db.DefaultContext)) | 	assert.NoError(t, CheckRepoStats(db.DefaultContext)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestWatchRepo(t *testing.T) { |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
| 	const repoID = 3 |  | ||||||
| 	const userID = 2 |  | ||||||
|  |  | ||||||
| 	assert.NoError(t, repo_model.WatchRepo(db.DefaultContext, userID, repoID, true)) |  | ||||||
| 	unittest.AssertExistsAndLoadBean(t, &repo_model.Watch{RepoID: repoID, UserID: userID}) |  | ||||||
| 	unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repoID}) |  | ||||||
|  |  | ||||||
| 	assert.NoError(t, repo_model.WatchRepo(db.DefaultContext, userID, repoID, false)) |  | ||||||
| 	unittest.AssertNotExistsBean(t, &repo_model.Watch{RepoID: repoID, UserID: userID}) |  | ||||||
| 	unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repoID}) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestMetas(t *testing.T) { |  | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) |  | ||||||
|  |  | ||||||
| 	repo := &repo_model.Repository{Name: "testRepo"} |  | ||||||
| 	repo.Owner = &user_model.User{Name: "testOwner"} |  | ||||||
| 	repo.OwnerName = repo.Owner.Name |  | ||||||
|  |  | ||||||
| 	repo.Units = nil |  | ||||||
|  |  | ||||||
| 	metas := repo.ComposeMetas() |  | ||||||
| 	assert.Equal(t, "testRepo", metas["repo"]) |  | ||||||
| 	assert.Equal(t, "testOwner", metas["user"]) |  | ||||||
|  |  | ||||||
| 	externalTracker := repo_model.RepoUnit{ |  | ||||||
| 		Type: unit.TypeExternalTracker, |  | ||||||
| 		Config: &repo_model.ExternalTrackerConfig{ |  | ||||||
| 			ExternalTrackerFormat: "https://someurl.com/{user}/{repo}/{issue}", |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	testSuccess := func(expectedStyle string) { |  | ||||||
| 		repo.Units = []*repo_model.RepoUnit{&externalTracker} |  | ||||||
| 		repo.RenderingMetas = nil |  | ||||||
| 		metas := repo.ComposeMetas() |  | ||||||
| 		assert.Equal(t, expectedStyle, metas["style"]) |  | ||||||
| 		assert.Equal(t, "testRepo", metas["repo"]) |  | ||||||
| 		assert.Equal(t, "testOwner", metas["user"]) |  | ||||||
| 		assert.Equal(t, "https://someurl.com/{user}/{repo}/{issue}", metas["format"]) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	testSuccess(markup.IssueNameStyleNumeric) |  | ||||||
|  |  | ||||||
| 	externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleAlphanumeric |  | ||||||
| 	testSuccess(markup.IssueNameStyleAlphanumeric) |  | ||||||
|  |  | ||||||
| 	externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleNumeric |  | ||||||
| 	testSuccess(markup.IssueNameStyleNumeric) |  | ||||||
|  |  | ||||||
| 	externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleRegexp |  | ||||||
| 	testSuccess(markup.IssueNameStyleRegexp) |  | ||||||
|  |  | ||||||
| 	repo, err := repo_model.GetRepositoryByID(3) |  | ||||||
| 	assert.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	metas = repo.ComposeMetas() |  | ||||||
| 	assert.Contains(t, metas, "org") |  | ||||||
| 	assert.Contains(t, metas, "teams") |  | ||||||
| 	assert.Equal(t, "user3", metas["org"]) |  | ||||||
| 	assert.Equal(t, ",owners,team1,", metas["teams"]) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestDoctorUserStarNum(t *testing.T) { | func TestDoctorUserStarNum(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,13 +2,14 @@ | |||||||
| // Use of this source code is governed by a MIT-style | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package user | package user_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  | 	user_model "code.gitea.io/gitea/models/user" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| @@ -17,14 +18,14 @@ import ( | |||||||
| func TestGetEmailAddresses(t *testing.T) { | func TestGetEmailAddresses(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	emails, _ := GetEmailAddresses(int64(1)) | 	emails, _ := user_model.GetEmailAddresses(int64(1)) | ||||||
| 	if assert.Len(t, emails, 3) { | 	if assert.Len(t, emails, 3) { | ||||||
| 		assert.True(t, emails[0].IsPrimary) | 		assert.True(t, emails[0].IsPrimary) | ||||||
| 		assert.True(t, emails[2].IsActivated) | 		assert.True(t, emails[2].IsActivated) | ||||||
| 		assert.False(t, emails[2].IsPrimary) | 		assert.False(t, emails[2].IsPrimary) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	emails, _ = GetEmailAddresses(int64(2)) | 	emails, _ = user_model.GetEmailAddresses(int64(2)) | ||||||
| 	if assert.Len(t, emails, 2) { | 	if assert.Len(t, emails, 2) { | ||||||
| 		assert.True(t, emails[0].IsPrimary) | 		assert.True(t, emails[0].IsPrimary) | ||||||
| 		assert.True(t, emails[0].IsActivated) | 		assert.True(t, emails[0].IsActivated) | ||||||
| @@ -34,18 +35,18 @@ func TestGetEmailAddresses(t *testing.T) { | |||||||
| func TestIsEmailUsed(t *testing.T) { | func TestIsEmailUsed(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	isExist, _ := IsEmailUsed(db.DefaultContext, "") | 	isExist, _ := user_model.IsEmailUsed(db.DefaultContext, "") | ||||||
| 	assert.True(t, isExist) | 	assert.True(t, isExist) | ||||||
| 	isExist, _ = IsEmailUsed(db.DefaultContext, "user11@example.com") | 	isExist, _ = user_model.IsEmailUsed(db.DefaultContext, "user11@example.com") | ||||||
| 	assert.True(t, isExist) | 	assert.True(t, isExist) | ||||||
| 	isExist, _ = IsEmailUsed(db.DefaultContext, "user1234567890@example.com") | 	isExist, _ = user_model.IsEmailUsed(db.DefaultContext, "user1234567890@example.com") | ||||||
| 	assert.False(t, isExist) | 	assert.False(t, isExist) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestAddEmailAddress(t *testing.T) { | func TestAddEmailAddress(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	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", | 		Email:       "user1234567890@example.com", | ||||||
| 		LowerEmail:  "user1234567890@example.com", | 		LowerEmail:  "user1234567890@example.com", | ||||||
| 		IsPrimary:   true, | 		IsPrimary:   true, | ||||||
| @@ -53,55 +54,55 @@ func TestAddEmailAddress(t *testing.T) { | |||||||
| 	})) | 	})) | ||||||
|  |  | ||||||
| 	// ErrEmailAlreadyUsed | 	// ErrEmailAlreadyUsed | ||||||
| 	err := AddEmailAddress(db.DefaultContext, &EmailAddress{ | 	err := user_model.AddEmailAddress(db.DefaultContext, &user_model.EmailAddress{ | ||||||
| 		Email:      "user1234567890@example.com", | 		Email:      "user1234567890@example.com", | ||||||
| 		LowerEmail: "user1234567890@example.com", | 		LowerEmail: "user1234567890@example.com", | ||||||
| 	}) | 	}) | ||||||
| 	assert.Error(t, err) | 	assert.Error(t, err) | ||||||
| 	assert.True(t, IsErrEmailAlreadyUsed(err)) | 	assert.True(t, user_model.IsErrEmailAlreadyUsed(err)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestAddEmailAddresses(t *testing.T) { | func TestAddEmailAddresses(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	// insert multiple email address | 	// insert multiple email address | ||||||
| 	emails := make([]*EmailAddress, 2) | 	emails := make([]*user_model.EmailAddress, 2) | ||||||
| 	emails[0] = &EmailAddress{ | 	emails[0] = &user_model.EmailAddress{ | ||||||
| 		Email:       "user1234@example.com", | 		Email:       "user1234@example.com", | ||||||
| 		LowerEmail:  "user1234@example.com", | 		LowerEmail:  "user1234@example.com", | ||||||
| 		IsActivated: true, | 		IsActivated: true, | ||||||
| 	} | 	} | ||||||
| 	emails[1] = &EmailAddress{ | 	emails[1] = &user_model.EmailAddress{ | ||||||
| 		Email:       "user5678@example.com", | 		Email:       "user5678@example.com", | ||||||
| 		LowerEmail:  "user5678@example.com", | 		LowerEmail:  "user5678@example.com", | ||||||
| 		IsActivated: true, | 		IsActivated: true, | ||||||
| 	} | 	} | ||||||
| 	assert.NoError(t, AddEmailAddresses(emails)) | 	assert.NoError(t, user_model.AddEmailAddresses(emails)) | ||||||
|  |  | ||||||
| 	// ErrEmailAlreadyUsed | 	// ErrEmailAlreadyUsed | ||||||
| 	err := AddEmailAddresses(emails) | 	err := user_model.AddEmailAddresses(emails) | ||||||
| 	assert.Error(t, err) | 	assert.Error(t, err) | ||||||
| 	assert.True(t, IsErrEmailAlreadyUsed(err)) | 	assert.True(t, user_model.IsErrEmailAlreadyUsed(err)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestDeleteEmailAddress(t *testing.T) { | func TestDeleteEmailAddress(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	assert.NoError(t, DeleteEmailAddress(&EmailAddress{ | 	assert.NoError(t, user_model.DeleteEmailAddress(&user_model.EmailAddress{ | ||||||
| 		UID:        int64(1), | 		UID:        int64(1), | ||||||
| 		ID:         int64(33), | 		ID:         int64(33), | ||||||
| 		Email:      "user1-2@example.com", | 		Email:      "user1-2@example.com", | ||||||
| 		LowerEmail: "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), | 		UID:        int64(1), | ||||||
| 		Email:      "user1-3@example.com", | 		Email:      "user1-3@example.com", | ||||||
| 		LowerEmail: "user1-3@example.com", | 		LowerEmail: "user1-3@example.com", | ||||||
| 	})) | 	})) | ||||||
|  |  | ||||||
| 	// Email address does not exist | 	// Email address does not exist | ||||||
| 	err := DeleteEmailAddress(&EmailAddress{ | 	err := user_model.DeleteEmailAddress(&user_model.EmailAddress{ | ||||||
| 		UID:        int64(1), | 		UID:        int64(1), | ||||||
| 		Email:      "user1234567890@example.com", | 		Email:      "user1234567890@example.com", | ||||||
| 		LowerEmail: "user1234567890@example.com", | 		LowerEmail: "user1234567890@example.com", | ||||||
| @@ -113,70 +114,70 @@ func TestDeleteEmailAddresses(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	// delete multiple email address | 	// delete multiple email address | ||||||
| 	emails := make([]*EmailAddress, 2) | 	emails := make([]*user_model.EmailAddress, 2) | ||||||
| 	emails[0] = &EmailAddress{ | 	emails[0] = &user_model.EmailAddress{ | ||||||
| 		UID:        int64(2), | 		UID:        int64(2), | ||||||
| 		ID:         int64(3), | 		ID:         int64(3), | ||||||
| 		Email:      "user2@example.com", | 		Email:      "user2@example.com", | ||||||
| 		LowerEmail: "user2@example.com", | 		LowerEmail: "user2@example.com", | ||||||
| 	} | 	} | ||||||
| 	emails[1] = &EmailAddress{ | 	emails[1] = &user_model.EmailAddress{ | ||||||
| 		UID:        int64(2), | 		UID:        int64(2), | ||||||
| 		Email:      "user2-2@example.com", | 		Email:      "user2-2@example.com", | ||||||
| 		LowerEmail: "user2-2@example.com", | 		LowerEmail: "user2-2@example.com", | ||||||
| 	} | 	} | ||||||
| 	assert.NoError(t, DeleteEmailAddresses(emails)) | 	assert.NoError(t, user_model.DeleteEmailAddresses(emails)) | ||||||
|  |  | ||||||
| 	// ErrEmailAlreadyUsed | 	// ErrEmailAlreadyUsed | ||||||
| 	err := DeleteEmailAddresses(emails) | 	err := user_model.DeleteEmailAddresses(emails) | ||||||
| 	assert.Error(t, err) | 	assert.Error(t, err) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestMakeEmailPrimary(t *testing.T) { | func TestMakeEmailPrimary(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	email := &EmailAddress{ | 	email := &user_model.EmailAddress{ | ||||||
| 		Email: "user567890@example.com", | 		Email: "user567890@example.com", | ||||||
| 	} | 	} | ||||||
| 	err := MakeEmailPrimary(email) | 	err := user_model.MakeEmailPrimary(email) | ||||||
| 	assert.Error(t, err) | 	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", | 		Email: "user11@example.com", | ||||||
| 	} | 	} | ||||||
| 	err = MakeEmailPrimary(email) | 	err = user_model.MakeEmailPrimary(email) | ||||||
| 	assert.Error(t, err) | 	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", | 		Email: "user9999999@example.com", | ||||||
| 	} | 	} | ||||||
| 	err = MakeEmailPrimary(email) | 	err = user_model.MakeEmailPrimary(email) | ||||||
| 	assert.Error(t, err) | 	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", | 		Email: "user101@example.com", | ||||||
| 	} | 	} | ||||||
| 	err = MakeEmailPrimary(email) | 	err = user_model.MakeEmailPrimary(email) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
| 	user, _ := GetUserByID(int64(10)) | 	user, _ := user_model.GetUserByID(int64(10)) | ||||||
| 	assert.Equal(t, "user101@example.com", user.Email) | 	assert.Equal(t, "user101@example.com", user.Email) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestActivate(t *testing.T) { | func TestActivate(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	email := &EmailAddress{ | 	email := &user_model.EmailAddress{ | ||||||
| 		ID:    int64(1), | 		ID:    int64(1), | ||||||
| 		UID:   int64(1), | 		UID:   int64(1), | ||||||
| 		Email: "user11@example.com", | 		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.Len(t, emails, 3) | ||||||
| 	assert.True(t, emails[0].IsActivated) | 	assert.True(t, emails[0].IsActivated) | ||||||
| 	assert.True(t, emails[0].IsPrimary) | 	assert.True(t, emails[0].IsPrimary) | ||||||
| @@ -189,17 +190,17 @@ func TestListEmails(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	// Must find all users and their emails | 	// Must find all users and their emails | ||||||
| 	opts := &SearchEmailOptions{ | 	opts := &user_model.SearchEmailOptions{ | ||||||
| 		ListOptions: db.ListOptions{ | 		ListOptions: db.ListOptions{ | ||||||
| 			PageSize: 10000, | 			PageSize: 10000, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	emails, count, err := SearchEmails(opts) | 	emails, count, err := user_model.SearchEmails(opts) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.NotEqual(t, int64(0), count) | 	assert.NotEqual(t, int64(0), count) | ||||||
| 	assert.True(t, count > 5) | 	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 { | 		for _, v := range emails { | ||||||
| 			if match(v) { | 			if match(v) { | ||||||
| 				return true | 				return true | ||||||
| @@ -208,46 +209,46 @@ func TestListEmails(t *testing.T) { | |||||||
| 		return false | 		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 | 	// '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 | 	// Must find no records | ||||||
| 	opts = &SearchEmailOptions{Keyword: "NOTFOUND"} | 	opts = &user_model.SearchEmailOptions{Keyword: "NOTFOUND"} | ||||||
| 	emails, count, err = SearchEmails(opts) | 	emails, count, err = user_model.SearchEmails(opts) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, int64(0), count) | 	assert.Equal(t, int64(0), count) | ||||||
|  |  | ||||||
| 	// Must find users 'user2', 'user28', etc. | 	// Must find users 'user2', 'user28', etc. | ||||||
| 	opts = &SearchEmailOptions{Keyword: "user2"} | 	opts = &user_model.SearchEmailOptions{Keyword: "user2"} | ||||||
| 	emails, count, err = SearchEmails(opts) | 	emails, count, err = user_model.SearchEmails(opts) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.NotEqual(t, int64(0), count) | 	assert.NotEqual(t, int64(0), count) | ||||||
| 	assert.True(t, contains(func(s *SearchEmailResult) bool { return s.UID == 2 })) | 	assert.True(t, contains(func(s *user_model.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 == 27 })) | ||||||
|  |  | ||||||
| 	// Must find only primary addresses (i.e. from the `user` table) | 	// Must find only primary addresses (i.e. from the `user` table) | ||||||
| 	opts = &SearchEmailOptions{IsPrimary: util.OptionalBoolTrue} | 	opts = &user_model.SearchEmailOptions{IsPrimary: util.OptionalBoolTrue} | ||||||
| 	emails, _, err = SearchEmails(opts) | 	emails, _, err = user_model.SearchEmails(opts) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.True(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 *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) | 	// Must find only inactive addresses (i.e. not validated) | ||||||
| 	opts = &SearchEmailOptions{IsActivated: util.OptionalBoolFalse} | 	opts = &user_model.SearchEmailOptions{IsActivated: util.OptionalBoolFalse} | ||||||
| 	emails, _, err = SearchEmails(opts) | 	emails, _, err = user_model.SearchEmails(opts) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.True(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 *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 | 	// Must find more than one page, but retrieve only one | ||||||
| 	opts = &SearchEmailOptions{ | 	opts = &user_model.SearchEmailOptions{ | ||||||
| 		ListOptions: db.ListOptions{ | 		ListOptions: db.ListOptions{ | ||||||
| 			PageSize: 5, | 			PageSize: 5, | ||||||
| 			Page:     1, | 			Page:     1, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	emails, count, err = SearchEmails(opts) | 	emails, count, err = user_model.SearchEmails(opts) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Len(t, emails, 5) | 	assert.Len(t, emails, 5) | ||||||
| 	assert.Greater(t, count, int64(len(emails))) | 	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`:            nil, | ||||||
| 		`first~last@iana.org`:            nil, | 		`first~last@iana.org`:            nil, | ||||||
| 		`first;last@iana.org`:            ErrEmailCharIsNotSupported{`first;last@iana.org`}, | 		`first;last@iana.org`:            user_model.ErrEmailCharIsNotSupported{`first;last@iana.org`}, | ||||||
| 		".233@qq.com":                    ErrEmailInvalid{".233@qq.com"}, | 		".233@qq.com":                    user_model.ErrEmailInvalid{".233@qq.com"}, | ||||||
| 		"!233@qq.com":                    ErrEmailInvalid{"!233@qq.com"}, | 		"!233@qq.com":                    user_model.ErrEmailInvalid{"!233@qq.com"}, | ||||||
| 		"#233@qq.com":                    ErrEmailInvalid{"#233@qq.com"}, | 		"#233@qq.com":                    user_model.ErrEmailInvalid{"#233@qq.com"}, | ||||||
| 		"$233@qq.com":                    ErrEmailInvalid{"$233@qq.com"}, | 		"$233@qq.com":                    user_model.ErrEmailInvalid{"$233@qq.com"}, | ||||||
| 		"%233@qq.com":                    ErrEmailInvalid{"%233@qq.com"}, | 		"%233@qq.com":                    user_model.ErrEmailInvalid{"%233@qq.com"}, | ||||||
| 		"&233@qq.com":                    ErrEmailInvalid{"&233@qq.com"}, | 		"&233@qq.com":                    user_model.ErrEmailInvalid{"&233@qq.com"}, | ||||||
| 		"'233@qq.com":                    ErrEmailInvalid{"'233@qq.com"}, | 		"'233@qq.com":                    user_model.ErrEmailInvalid{"'233@qq.com"}, | ||||||
| 		"*233@qq.com":                    ErrEmailInvalid{"*233@qq.com"}, | 		"*233@qq.com":                    user_model.ErrEmailInvalid{"*233@qq.com"}, | ||||||
| 		"+233@qq.com":                    ErrEmailInvalid{"+233@qq.com"}, | 		"+233@qq.com":                    user_model.ErrEmailInvalid{"+233@qq.com"}, | ||||||
| 		"/233@qq.com":                    ErrEmailInvalid{"/233@qq.com"}, | 		"/233@qq.com":                    user_model.ErrEmailInvalid{"/233@qq.com"}, | ||||||
| 		"=233@qq.com":                    ErrEmailInvalid{"=233@qq.com"}, | 		"=233@qq.com":                    user_model.ErrEmailInvalid{"=233@qq.com"}, | ||||||
| 		"?233@qq.com":                    ErrEmailInvalid{"?233@qq.com"}, | 		"?233@qq.com":                    user_model.ErrEmailInvalid{"?233@qq.com"}, | ||||||
| 		"^233@qq.com":                    ErrEmailInvalid{"^233@qq.com"}, | 		"^233@qq.com":                    user_model.ErrEmailInvalid{"^233@qq.com"}, | ||||||
| 		"`233@qq.com":                    ErrEmailInvalid{"`233@qq.com"}, | 		"`233@qq.com":                    user_model.ErrEmailInvalid{"`233@qq.com"}, | ||||||
| 		"{233@qq.com":                    ErrEmailInvalid{"{233@qq.com"}, | 		"{233@qq.com":                    user_model.ErrEmailInvalid{"{233@qq.com"}, | ||||||
| 		"|233@qq.com":                    ErrEmailInvalid{"|233@qq.com"}, | 		"|233@qq.com":                    user_model.ErrEmailInvalid{"|233@qq.com"}, | ||||||
| 		"}233@qq.com":                    ErrEmailInvalid{"}233@qq.com"}, | 		"}233@qq.com":                    user_model.ErrEmailInvalid{"}233@qq.com"}, | ||||||
| 		"~233@qq.com":                    ErrEmailInvalid{"~233@qq.com"}, | 		"~233@qq.com":                    user_model.ErrEmailInvalid{"~233@qq.com"}, | ||||||
| 		";233@qq.com":                    ErrEmailCharIsNotSupported{";233@qq.com"}, | 		";233@qq.com":                    user_model.ErrEmailCharIsNotSupported{";233@qq.com"}, | ||||||
| 		"Foo <foo@bar.com>":              ErrEmailCharIsNotSupported{"Foo <foo@bar.com>"}, | 		"Foo <foo@bar.com>":              user_model.ErrEmailCharIsNotSupported{"Foo <foo@bar.com>"}, | ||||||
| 		string([]byte{0xE2, 0x84, 0xAA}): ErrEmailCharIsNotSupported{string([]byte{0xE2, 0x84, 0xAA})}, | 		string([]byte{0xE2, 0x84, 0xAA}): user_model.ErrEmailCharIsNotSupported{string([]byte{0xE2, 0x84, 0xAA})}, | ||||||
| 	} | 	} | ||||||
| 	for kase, err := range kases { | 	for kase, err := range kases { | ||||||
| 		t.Run(kase, func(t *testing.T) { | 		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 | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package user | package user_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  | 	user_model "code.gitea.io/gitea/models/user" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestIsFollowing(t *testing.T) { | func TestIsFollowing(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	assert.True(t, IsFollowing(4, 2)) | 	assert.True(t, user_model.IsFollowing(4, 2)) | ||||||
| 	assert.False(t, IsFollowing(2, 4)) | 	assert.False(t, user_model.IsFollowing(2, 4)) | ||||||
| 	assert.False(t, IsFollowing(5, unittest.NonexistentID)) | 	assert.False(t, user_model.IsFollowing(5, unittest.NonexistentID)) | ||||||
| 	assert.False(t, IsFollowing(unittest.NonexistentID, 5)) | 	assert.False(t, user_model.IsFollowing(unittest.NonexistentID, 5)) | ||||||
| 	assert.False(t, IsFollowing(unittest.NonexistentID, unittest.NonexistentID)) | 	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 | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package user | package user_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  |  | ||||||
|  | 	_ "code.gitea.io/gitea/models" | ||||||
|  | 	_ "code.gitea.io/gitea/models/user" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestMain(m *testing.M) { | func TestMain(m *testing.M) { | ||||||
| 	unittest.MainTest(m, &unittest.TestOptions{ | 	unittest.MainTest(m, &unittest.TestOptions{ | ||||||
| 		GiteaRootPath: filepath.Join("..", ".."), | 		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 | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package user | package user_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  | 	user_model "code.gitea.io/gitea/models/user" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| @@ -15,7 +16,7 @@ import ( | |||||||
| func TestGetUserOpenIDs(t *testing.T) { | func TestGetUserOpenIDs(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	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) { | 	if assert.NoError(t, err) && assert.Len(t, oids, 2) { | ||||||
| 		assert.Equal(t, "https://user1.domain1.tld/", oids[0].URI) | 		assert.Equal(t, "https://user1.domain1.tld/", oids[0].URI) | ||||||
| 		assert.False(t, oids[0].Show) | 		assert.False(t, oids[0].Show) | ||||||
| @@ -23,7 +24,7 @@ func TestGetUserOpenIDs(t *testing.T) { | |||||||
| 		assert.True(t, oids[1].Show) | 		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) { | 	if assert.NoError(t, err) && assert.Len(t, oids, 1) { | ||||||
| 		assert.Equal(t, "https://domain1.tld/user2/", oids[0].URI) | 		assert.Equal(t, "https://domain1.tld/user2/", oids[0].URI) | ||||||
| 		assert.True(t, oids[0].Show) | 		assert.True(t, oids[0].Show) | ||||||
| @@ -32,28 +33,28 @@ func TestGetUserOpenIDs(t *testing.T) { | |||||||
|  |  | ||||||
| func TestToggleUserOpenIDVisibility(t *testing.T) { | func TestToggleUserOpenIDVisibility(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	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) { | 	if !assert.NoError(t, err) || !assert.Len(t, oids, 1) { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	assert.True(t, oids[0].Show) | 	assert.True(t, oids[0].Show) | ||||||
|  |  | ||||||
| 	err = ToggleUserOpenIDVisibility(oids[0].ID) | 	err = user_model.ToggleUserOpenIDVisibility(oids[0].ID) | ||||||
| 	if !assert.NoError(t, err) { | 	if !assert.NoError(t, err) { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	oids, err = GetUserOpenIDs(int64(2)) | 	oids, err = user_model.GetUserOpenIDs(int64(2)) | ||||||
| 	if !assert.NoError(t, err) || !assert.Len(t, oids, 1) { | 	if !assert.NoError(t, err) || !assert.Len(t, oids, 1) { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	assert.False(t, oids[0].Show) | 	assert.False(t, oids[0].Show) | ||||||
| 	err = ToggleUserOpenIDVisibility(oids[0].ID) | 	err = user_model.ToggleUserOpenIDVisibility(oids[0].ID) | ||||||
| 	if !assert.NoError(t, err) { | 	if !assert.NoError(t, err) { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	oids, err = GetUserOpenIDs(int64(2)) | 	oids, err = user_model.GetUserOpenIDs(int64(2)) | ||||||
| 	if !assert.NoError(t, err) { | 	if !assert.NoError(t, err) { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -2,12 +2,13 @@ | |||||||
| // Use of this source code is governed by a MIT-style | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package user | package user_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  | 	user_model "code.gitea.io/gitea/models/user" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| @@ -15,10 +16,10 @@ import ( | |||||||
| func TestLookupUserRedirect(t *testing.T) { | func TestLookupUserRedirect(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	userID, err := LookupUserRedirect("olduser1") | 	userID, err := user_model.LookupUserRedirect("olduser1") | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.EqualValues(t, 1, userID) | 	assert.EqualValues(t, 1, userID) | ||||||
|  |  | ||||||
| 	_, err = LookupUserRedirect("doesnotexist") | 	_, err = user_model.LookupUserRedirect("doesnotexist") | ||||||
| 	assert.True(t, IsErrUserRedirectNotExist(err)) | 	assert.True(t, user_model.IsErrUserRedirectNotExist(err)) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,12 +2,13 @@ | |||||||
| // Use of this source code is governed by a MIT-style | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package user | package user_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  | 	user_model "code.gitea.io/gitea/models/user" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| @@ -16,44 +17,44 @@ func TestSettings(t *testing.T) { | |||||||
| 	keyName := "test_user_setting" | 	keyName := "test_user_setting" | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	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 | 	// create setting | ||||||
| 	err := SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue) | 	err := user_model.SetUserSetting(newSetting.UserID, newSetting.SettingKey, newSetting.SettingValue) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	// test about saving unchanged values | 	// 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) | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
| 	// get specific setting | 	// get specific setting | ||||||
| 	settings, err := GetUserSettings(99, []string{keyName}) | 	settings, err := user_model.GetUserSettings(99, []string{keyName}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Len(t, settings, 1) | 	assert.Len(t, settings, 1) | ||||||
| 	assert.EqualValues(t, newSetting.SettingValue, settings[keyName].SettingValue) | 	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.NoError(t, err) | ||||||
| 	assert.EqualValues(t, newSetting.SettingValue, settingValue) | 	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.NoError(t, err) | ||||||
| 	assert.EqualValues(t, "", settingValue) | 	assert.EqualValues(t, "", settingValue) | ||||||
|  |  | ||||||
| 	// updated setting | 	// updated setting | ||||||
| 	updatedSetting := &Setting{UserID: 99, SettingKey: keyName, SettingValue: "Updated"} | 	updatedSetting := &user_model.Setting{UserID: 99, SettingKey: keyName, SettingValue: "Updated"} | ||||||
| 	err = SetUserSetting(updatedSetting.UserID, updatedSetting.SettingKey, updatedSetting.SettingValue) | 	err = user_model.SetUserSetting(updatedSetting.UserID, updatedSetting.SettingKey, updatedSetting.SettingValue) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
| 	// get all settings | 	// get all settings | ||||||
| 	settings, err = GetUserAllSettings(99) | 	settings, err = user_model.GetUserAllSettings(99) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Len(t, settings, 1) | 	assert.Len(t, settings, 1) | ||||||
| 	assert.EqualValues(t, updatedSetting.SettingValue, settings[updatedSetting.SettingKey].SettingValue) | 	assert.EqualValues(t, updatedSetting.SettingValue, settings[updatedSetting.SettingKey].SettingValue) | ||||||
|  |  | ||||||
| 	// delete setting | 	// delete setting | ||||||
| 	err = DeleteUserSetting(99, keyName) | 	err = user_model.DeleteUserSetting(99, keyName) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	settings, err = GetUserAllSettings(99) | 	settings, err = user_model.GetUserAllSettings(99) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Len(t, settings, 0) | 	assert.Len(t, settings, 0) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| // Use of this source code is governed by a MIT-style | // Use of this source code is governed by a MIT-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
| package user | package user_test | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"math/rand" | 	"math/rand" | ||||||
| @@ -12,6 +12,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/models/auth" | 	"code.gitea.io/gitea/models/auth" | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"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/setting" | ||||||
| 	"code.gitea.io/gitea/modules/structs" | 	"code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
| @@ -22,7 +23,7 @@ import ( | |||||||
| func TestOAuth2Application_LoadUser(t *testing.T) { | func TestOAuth2Application_LoadUser(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	app := unittest.AssertExistsAndLoadBean(t, &auth.OAuth2Application{ID: 1}).(*auth.OAuth2Application) | 	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.NoError(t, err) | ||||||
| 	assert.NotNil(t, user) | 	assert.NotNil(t, user) | ||||||
| } | } | ||||||
| @@ -31,19 +32,19 @@ func TestGetUserEmailsByNames(t *testing.T) { | |||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	// ignore none active user email | 	// 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"}, user_model.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", "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) { | func TestCanCreateOrganization(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	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()) | 	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()) | 	assert.True(t, user.CanCreateOrganization()) | ||||||
| 	// Disable user create organization permission. | 	// Disable user create organization permission. | ||||||
| 	user.AllowCreateOrganization = false | 	user.AllowCreateOrganization = false | ||||||
| @@ -57,8 +58,8 @@ func TestCanCreateOrganization(t *testing.T) { | |||||||
|  |  | ||||||
| func TestSearchUsers(t *testing.T) { | func TestSearchUsers(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	testSuccess := func(opts *SearchUserOptions, expectedUserOrOrgIDs []int64) { | 	testSuccess := func(opts *user_model.SearchUserOptions, expectedUserOrOrgIDs []int64) { | ||||||
| 		users, _, err := SearchUsers(opts) | 		users, _, err := user_model.SearchUsers(opts) | ||||||
| 		assert.NoError(t, err) | 		assert.NoError(t, err) | ||||||
| 		if assert.Len(t, users, len(expectedUserOrOrgIDs), opts) { | 		if assert.Len(t, users, len(expectedUserOrOrgIDs), opts) { | ||||||
| 			for i, expectedID := range expectedUserOrOrgIDs { | 			for i, expectedID := range expectedUserOrOrgIDs { | ||||||
| @@ -68,58 +69,58 @@ func TestSearchUsers(t *testing.T) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// test orgs | 	// test orgs | ||||||
| 	testOrgSuccess := func(opts *SearchUserOptions, expectedOrgIDs []int64) { | 	testOrgSuccess := func(opts *user_model.SearchUserOptions, expectedOrgIDs []int64) { | ||||||
| 		opts.Type = UserTypeOrganization | 		opts.Type = user_model.UserTypeOrganization | ||||||
| 		testSuccess(opts, expectedOrgIDs) | 		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}) | 		[]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}) | 		[]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}) | 		[]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}) | 		[]int64{26}) | ||||||
|  |  | ||||||
| 	testOrgSuccess(&SearchUserOptions{ListOptions: db.ListOptions{Page: 5, PageSize: 2}}, | 	testOrgSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 5, PageSize: 2}}, | ||||||
| 		[]int64{}) | 		[]int64{}) | ||||||
|  |  | ||||||
| 	// test users | 	// test users | ||||||
| 	testUserSuccess := func(opts *SearchUserOptions, expectedUserIDs []int64) { | 	testUserSuccess := func(opts *user_model.SearchUserOptions, expectedUserIDs []int64) { | ||||||
| 		opts.Type = UserTypeIndividual | 		opts.Type = user_model.UserTypeIndividual | ||||||
| 		testSuccess(opts, expectedUserIDs) | 		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}) | 		[]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}) | 		[]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}) | 		[]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}) | 		[]int64{1, 10, 11, 12, 13, 14, 15, 16, 18}) | ||||||
|  |  | ||||||
| 	// order by name asc default | 	// 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}) | 		[]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}) | 		[]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}) | 		[]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}) | 		[]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}) | 		[]int64{24}) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -130,34 +131,34 @@ func TestEmailNotificationPreferences(t *testing.T) { | |||||||
| 		expected string | 		expected string | ||||||
| 		userID   int64 | 		userID   int64 | ||||||
| 	}{ | 	}{ | ||||||
| 		{EmailNotificationsEnabled, 1}, | 		{user_model.EmailNotificationsEnabled, 1}, | ||||||
| 		{EmailNotificationsEnabled, 2}, | 		{user_model.EmailNotificationsEnabled, 2}, | ||||||
| 		{EmailNotificationsOnMention, 3}, | 		{user_model.EmailNotificationsOnMention, 3}, | ||||||
| 		{EmailNotificationsOnMention, 4}, | 		{user_model.EmailNotificationsOnMention, 4}, | ||||||
| 		{EmailNotificationsEnabled, 5}, | 		{user_model.EmailNotificationsEnabled, 5}, | ||||||
| 		{EmailNotificationsEnabled, 6}, | 		{user_model.EmailNotificationsEnabled, 6}, | ||||||
| 		{EmailNotificationsDisabled, 7}, | 		{user_model.EmailNotificationsDisabled, 7}, | ||||||
| 		{EmailNotificationsEnabled, 8}, | 		{user_model.EmailNotificationsEnabled, 8}, | ||||||
| 		{EmailNotificationsOnMention, 9}, | 		{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()) | 		assert.Equal(t, test.expected, user.EmailNotifications()) | ||||||
|  |  | ||||||
| 		// Try all possible settings | 		// Try all possible settings | ||||||
| 		assert.NoError(t, SetEmailNotifications(user, EmailNotificationsEnabled)) | 		assert.NoError(t, user_model.SetEmailNotifications(user, user_model.EmailNotificationsEnabled)) | ||||||
| 		assert.Equal(t, EmailNotificationsEnabled, user.EmailNotifications()) | 		assert.Equal(t, user_model.EmailNotificationsEnabled, user.EmailNotifications()) | ||||||
|  |  | ||||||
| 		assert.NoError(t, SetEmailNotifications(user, EmailNotificationsOnMention)) | 		assert.NoError(t, user_model.SetEmailNotifications(user, user_model.EmailNotificationsOnMention)) | ||||||
| 		assert.Equal(t, EmailNotificationsOnMention, user.EmailNotifications()) | 		assert.Equal(t, user_model.EmailNotificationsOnMention, user.EmailNotifications()) | ||||||
|  |  | ||||||
| 		assert.NoError(t, SetEmailNotifications(user, EmailNotificationsDisabled)) | 		assert.NoError(t, user_model.SetEmailNotifications(user, user_model.EmailNotificationsDisabled)) | ||||||
| 		assert.Equal(t, EmailNotificationsDisabled, user.EmailNotifications()) | 		assert.Equal(t, user_model.EmailNotificationsDisabled, user.EmailNotifications()) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestHashPasswordDeterministic(t *testing.T) { | func TestHashPasswordDeterministic(t *testing.T) { | ||||||
| 	b := make([]byte, 16) | 	b := make([]byte, 16) | ||||||
| 	u := &User{} | 	u := &user_model.User{} | ||||||
| 	algos := []string{"argon2", "pbkdf2", "scrypt", "bcrypt"} | 	algos := []string{"argon2", "pbkdf2", "scrypt", "bcrypt"} | ||||||
| 	for j := 0; j < len(algos); j++ { | 	for j := 0; j < len(algos); j++ { | ||||||
| 		u.PasswdHashAlgo = 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 | 	// BenchmarkHashPassword ensures that it takes a reasonable amount of time | ||||||
| 	// to hash a password - in order to protect from brute-force attacks. | 	// to hash a password - in order to protect from brute-force attacks. | ||||||
| 	pass := "password1337" | 	pass := "password1337" | ||||||
| 	u := &User{Passwd: pass} | 	u := &user_model.User{Passwd: pass} | ||||||
| 	b.ResetTimer() | 	b.ResetTimer() | ||||||
| 	for i := 0; i < b.N; i++ { | 	for i := 0; i < b.N; i++ { | ||||||
| 		u.SetPassword(pass) | 		u.SetPassword(pass) | ||||||
| @@ -192,7 +193,7 @@ func BenchmarkHashPassword(b *testing.B) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func TestNewGitSig(t *testing.T) { | func TestNewGitSig(t *testing.T) { | ||||||
| 	users := make([]*User, 0, 20) | 	users := make([]*user_model.User, 0, 20) | ||||||
| 	err := db.GetEngine(db.DefaultContext).Find(&users) | 	err := db.GetEngine(db.DefaultContext).Find(&users) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
| @@ -206,7 +207,7 @@ func TestNewGitSig(t *testing.T) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func TestDisplayName(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) | 	err := db.GetEngine(db.DefaultContext).Find(&users) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|  |  | ||||||
| @@ -221,7 +222,7 @@ func TestDisplayName(t *testing.T) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func TestCreateUserInvalidEmail(t *testing.T) { | func TestCreateUserInvalidEmail(t *testing.T) { | ||||||
| 	user := &User{ | 	user := &user_model.User{ | ||||||
| 		Name:               "GiteaBot", | 		Name:               "GiteaBot", | ||||||
| 		Email:              "GiteaBot@gitea.io\r\n", | 		Email:              "GiteaBot@gitea.io\r\n", | ||||||
| 		Passwd:             ";p['////..-++']", | 		Passwd:             ";p['////..-++']", | ||||||
| @@ -230,35 +231,35 @@ func TestCreateUserInvalidEmail(t *testing.T) { | |||||||
| 		MustChangePassword: false, | 		MustChangePassword: false, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err := CreateUser(user) | 	err := user_model.CreateUser(user) | ||||||
| 	assert.Error(t, err) | 	assert.Error(t, err) | ||||||
| 	assert.True(t, IsErrEmailCharIsNotSupported(err)) | 	assert.True(t, user_model.IsErrEmailCharIsNotSupported(err)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestCreateUserEmailAlreadyUsed(t *testing.T) { | func TestCreateUserEmailAlreadyUsed(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	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 | 	// add new user with user2's email | ||||||
| 	user.Name = "testuser" | 	user.Name = "testuser" | ||||||
| 	user.LowerName = strings.ToLower(user.Name) | 	user.LowerName = strings.ToLower(user.Name) | ||||||
| 	user.ID = 0 | 	user.ID = 0 | ||||||
| 	err := CreateUser(user) | 	err := user_model.CreateUser(user) | ||||||
| 	assert.Error(t, err) | 	assert.Error(t, err) | ||||||
| 	assert.True(t, IsErrEmailAlreadyUsed(err)) | 	assert.True(t, user_model.IsErrEmailAlreadyUsed(err)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestGetUserIDsByNames(t *testing.T) { | func TestGetUserIDsByNames(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	// ignore non existing | 	// 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.NoError(t, err) | ||||||
| 	assert.Equal(t, []int64{1, 2}, IDs) | 	assert.Equal(t, []int64{1, 2}, IDs) | ||||||
|  |  | ||||||
| 	// ignore non existing | 	// 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.Error(t, err) | ||||||
| 	assert.Equal(t, []int64(nil), IDs) | 	assert.Equal(t, []int64(nil), IDs) | ||||||
| } | } | ||||||
| @@ -266,14 +267,14 @@ func TestGetUserIDsByNames(t *testing.T) { | |||||||
| func TestGetMaileableUsersByIDs(t *testing.T) { | func TestGetMaileableUsersByIDs(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	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.NoError(t, err) | ||||||
| 	assert.Len(t, results, 1) | 	assert.Len(t, results, 1) | ||||||
| 	if len(results) > 1 { | 	if len(results) > 1 { | ||||||
| 		assert.Equal(t, results[0].ID, 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.NoError(t, err) | ||||||
| 	assert.Len(t, results, 2) | 	assert.Len(t, results, 2) | ||||||
| 	if len(results) > 2 { | 	if len(results) > 2 { | ||||||
| @@ -284,36 +285,36 @@ func TestGetMaileableUsersByIDs(t *testing.T) { | |||||||
|  |  | ||||||
| func TestUpdateUser(t *testing.T) { | func TestUpdateUser(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	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 | 	user.KeepActivityPrivate = true | ||||||
| 	assert.NoError(t, UpdateUser(db.DefaultContext, user, false)) | 	assert.NoError(t, user_model.UpdateUser(db.DefaultContext, user, false)) | ||||||
| 	user = unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) | 	user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) | ||||||
| 	assert.True(t, user.KeepActivityPrivate) | 	assert.True(t, user.KeepActivityPrivate) | ||||||
|  |  | ||||||
| 	setting.Service.AllowedUserVisibilityModesSlice = []bool{true, false, false} | 	setting.Service.AllowedUserVisibilityModesSlice = []bool{true, false, false} | ||||||
| 	user.KeepActivityPrivate = false | 	user.KeepActivityPrivate = false | ||||||
| 	user.Visibility = structs.VisibleTypePrivate | 	user.Visibility = structs.VisibleTypePrivate | ||||||
| 	assert.Error(t, UpdateUser(db.DefaultContext, user, false)) | 	assert.Error(t, user_model.UpdateUser(db.DefaultContext, user, false)) | ||||||
| 	user = unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) | 	user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User) | ||||||
| 	assert.True(t, user.KeepActivityPrivate) | 	assert.True(t, user.KeepActivityPrivate) | ||||||
|  |  | ||||||
| 	user.Email = "no mail@mail.org" | 	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) { | func TestNewUserRedirect(t *testing.T) { | ||||||
| 	// redirect to a completely new name | 	// redirect to a completely new name | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	user := unittest.AssertExistsAndLoadBean(t, &User{ID: 1}).(*User) | 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User) | ||||||
| 	assert.NoError(t, NewUserRedirect(db.DefaultContext, user.ID, user.Name, "newusername")) | 	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, | 		LowerName:      user.LowerName, | ||||||
| 		RedirectUserID: user.ID, | 		RedirectUserID: user.ID, | ||||||
| 	}) | 	}) | ||||||
| 	unittest.AssertExistsAndLoadBean(t, &Redirect{ | 	unittest.AssertExistsAndLoadBean(t, &user_model.Redirect{ | ||||||
| 		LowerName:      "olduser1", | 		LowerName:      "olduser1", | ||||||
| 		RedirectUserID: user.ID, | 		RedirectUserID: user.ID, | ||||||
| 	}) | 	}) | ||||||
| @@ -323,14 +324,14 @@ func TestNewUserRedirect2(t *testing.T) { | |||||||
| 	// redirect to previously used name | 	// redirect to previously used name | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	user := unittest.AssertExistsAndLoadBean(t, &User{ID: 1}).(*User) | 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User) | ||||||
| 	assert.NoError(t, NewUserRedirect(db.DefaultContext, user.ID, user.Name, "olduser1")) | 	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, | 		LowerName:      user.LowerName, | ||||||
| 		RedirectUserID: user.ID, | 		RedirectUserID: user.ID, | ||||||
| 	}) | 	}) | ||||||
| 	unittest.AssertNotExistsBean(t, &Redirect{ | 	unittest.AssertNotExistsBean(t, &user_model.Redirect{ | ||||||
| 		LowerName:      "olduser1", | 		LowerName:      "olduser1", | ||||||
| 		RedirectUserID: user.ID, | 		RedirectUserID: user.ID, | ||||||
| 	}) | 	}) | ||||||
| @@ -340,10 +341,10 @@ func TestNewUserRedirect3(t *testing.T) { | |||||||
| 	// redirect for a previously-unredirected user | 	// redirect for a previously-unredirected user | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	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) | ||||||
| 	assert.NoError(t, NewUserRedirect(db.DefaultContext, user.ID, user.Name, "newusername")) | 	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, | 		LowerName:      user.LowerName, | ||||||
| 		RedirectUserID: user.ID, | 		RedirectUserID: user.ID, | ||||||
| 	}) | 	}) | ||||||
| @@ -352,18 +353,47 @@ func TestNewUserRedirect3(t *testing.T) { | |||||||
| func TestGetUserByOpenID(t *testing.T) { | func TestGetUserByOpenID(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
|  |  | ||||||
| 	_, err := GetUserByOpenID("https://unknown") | 	_, err := user_model.GetUserByOpenID("https://unknown") | ||||||
| 	if assert.Error(t, err) { | 	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) { | 	if assert.NoError(t, err) { | ||||||
| 		assert.Equal(t, int64(1), user.ID) | 		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) { | 	if assert.NoError(t, err) { | ||||||
| 		assert.Equal(t, int64(2), user.ID) | 		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{}) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,43 +0,0 @@ | |||||||
| // Copyright 2017 The Gitea Authors. All rights reserved. |  | ||||||
| // Use of this source code is governed by a MIT-style |  | ||||||
| // license that can be found in the LICENSE file. |  | ||||||
|  |  | ||||||
| package models |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"testing" |  | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" |  | ||||||
| 	user_model "code.gitea.io/gitea/models/user" |  | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| 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{}) |  | ||||||
| } |  | ||||||
| @@ -8,8 +8,9 @@ import ( | |||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	_ "code.gitea.io/gitea/models" |  | ||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
|  |  | ||||||
|  | 	_ "code.gitea.io/gitea/models" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestMain(m *testing.M) { | func TestMain(m *testing.M) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user