code.gitea.io/gitea@v1.22.3/models/org_team_test.go (about) 1 // Copyright 2017 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package models 5 6 import ( 7 "strings" 8 "testing" 9 10 "code.gitea.io/gitea/models/db" 11 "code.gitea.io/gitea/models/organization" 12 "code.gitea.io/gitea/models/perm" 13 access_model "code.gitea.io/gitea/models/perm/access" 14 repo_model "code.gitea.io/gitea/models/repo" 15 "code.gitea.io/gitea/models/unittest" 16 user_model "code.gitea.io/gitea/models/user" 17 18 "github.com/stretchr/testify/assert" 19 ) 20 21 func TestTeam_AddMember(t *testing.T) { 22 assert.NoError(t, unittest.PrepareTestDatabase()) 23 24 test := func(team *organization.Team, user *user_model.User) { 25 assert.NoError(t, AddTeamMember(db.DefaultContext, team, user)) 26 unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{UID: user.ID, TeamID: team.ID}) 27 unittest.CheckConsistencyFor(t, &organization.Team{ID: team.ID}, &user_model.User{ID: team.OrgID}) 28 } 29 30 team1 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 1}) 31 team3 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 3}) 32 user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 33 user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) 34 35 test(team1, user2) 36 test(team1, user4) 37 test(team3, user2) 38 } 39 40 func TestTeam_RemoveMember(t *testing.T) { 41 assert.NoError(t, unittest.PrepareTestDatabase()) 42 43 testSuccess := func(team *organization.Team, user *user_model.User) { 44 assert.NoError(t, RemoveTeamMember(db.DefaultContext, team, user)) 45 unittest.AssertNotExistsBean(t, &organization.TeamUser{UID: user.ID, TeamID: team.ID}) 46 unittest.CheckConsistencyFor(t, &organization.Team{ID: team.ID}) 47 } 48 49 team1 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 1}) 50 team2 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 2}) 51 team3 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 3}) 52 user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 53 user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) 54 55 testSuccess(team1, user4) 56 testSuccess(team2, user2) 57 testSuccess(team3, user2) 58 59 err := RemoveTeamMember(db.DefaultContext, team1, user2) 60 assert.True(t, organization.IsErrLastOrgOwner(err)) 61 } 62 63 func TestIsUsableTeamName(t *testing.T) { 64 assert.NoError(t, organization.IsUsableTeamName("usable")) 65 assert.True(t, db.IsErrNameReserved(organization.IsUsableTeamName("new"))) 66 } 67 68 func TestNewTeam(t *testing.T) { 69 assert.NoError(t, unittest.PrepareTestDatabase()) 70 71 const teamName = "newTeamName" 72 team := &organization.Team{Name: teamName, OrgID: 3} 73 assert.NoError(t, NewTeam(db.DefaultContext, team)) 74 unittest.AssertExistsAndLoadBean(t, &organization.Team{Name: teamName}) 75 unittest.CheckConsistencyFor(t, &organization.Team{}, &user_model.User{ID: team.OrgID}) 76 } 77 78 func TestUpdateTeam(t *testing.T) { 79 // successful update 80 assert.NoError(t, unittest.PrepareTestDatabase()) 81 82 team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 2}) 83 team.LowerName = "newname" 84 team.Name = "newName" 85 team.Description = strings.Repeat("A long description!", 100) 86 team.AccessMode = perm.AccessModeAdmin 87 assert.NoError(t, UpdateTeam(db.DefaultContext, team, true, false)) 88 89 team = unittest.AssertExistsAndLoadBean(t, &organization.Team{Name: "newName"}) 90 assert.True(t, strings.HasPrefix(team.Description, "A long description!")) 91 92 access := unittest.AssertExistsAndLoadBean(t, &access_model.Access{UserID: 4, RepoID: 3}) 93 assert.EqualValues(t, perm.AccessModeAdmin, access.Mode) 94 95 unittest.CheckConsistencyFor(t, &organization.Team{ID: team.ID}) 96 } 97 98 func TestUpdateTeam2(t *testing.T) { 99 // update to already-existing team 100 assert.NoError(t, unittest.PrepareTestDatabase()) 101 102 team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 2}) 103 team.LowerName = "owners" 104 team.Name = "Owners" 105 team.Description = strings.Repeat("A long description!", 100) 106 err := UpdateTeam(db.DefaultContext, team, true, false) 107 assert.True(t, organization.IsErrTeamAlreadyExist(err)) 108 109 unittest.CheckConsistencyFor(t, &organization.Team{ID: team.ID}) 110 } 111 112 func TestDeleteTeam(t *testing.T) { 113 assert.NoError(t, unittest.PrepareTestDatabase()) 114 115 team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 2}) 116 assert.NoError(t, DeleteTeam(db.DefaultContext, team)) 117 unittest.AssertNotExistsBean(t, &organization.Team{ID: team.ID}) 118 unittest.AssertNotExistsBean(t, &organization.TeamRepo{TeamID: team.ID}) 119 unittest.AssertNotExistsBean(t, &organization.TeamUser{TeamID: team.ID}) 120 121 // check that team members don't have "leftover" access to repos 122 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) 123 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) 124 accessMode, err := access_model.AccessLevel(db.DefaultContext, user, repo) 125 assert.NoError(t, err) 126 assert.True(t, accessMode < perm.AccessModeWrite) 127 } 128 129 func TestAddTeamMember(t *testing.T) { 130 assert.NoError(t, unittest.PrepareTestDatabase()) 131 132 test := func(team *organization.Team, user *user_model.User) { 133 assert.NoError(t, AddTeamMember(db.DefaultContext, team, user)) 134 unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{UID: user.ID, TeamID: team.ID}) 135 unittest.CheckConsistencyFor(t, &organization.Team{ID: team.ID}, &user_model.User{ID: team.OrgID}) 136 } 137 138 team1 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 1}) 139 team3 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 3}) 140 user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 141 user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) 142 143 test(team1, user2) 144 test(team1, user4) 145 test(team3, user2) 146 } 147 148 func TestRemoveTeamMember(t *testing.T) { 149 assert.NoError(t, unittest.PrepareTestDatabase()) 150 151 testSuccess := func(team *organization.Team, user *user_model.User) { 152 assert.NoError(t, RemoveTeamMember(db.DefaultContext, team, user)) 153 unittest.AssertNotExistsBean(t, &organization.TeamUser{UID: user.ID, TeamID: team.ID}) 154 unittest.CheckConsistencyFor(t, &organization.Team{ID: team.ID}) 155 } 156 157 team1 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 1}) 158 team2 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 2}) 159 team3 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 3}) 160 user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 161 user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) 162 163 testSuccess(team1, user4) 164 testSuccess(team2, user2) 165 testSuccess(team3, user2) 166 167 err := RemoveTeamMember(db.DefaultContext, team1, user2) 168 assert.True(t, organization.IsErrLastOrgOwner(err)) 169 } 170 171 func TestRepository_RecalculateAccesses3(t *testing.T) { 172 assert.NoError(t, unittest.PrepareTestDatabase()) 173 team5 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 5}) 174 user29 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 29}) 175 176 has, err := db.GetEngine(db.DefaultContext).Get(&access_model.Access{UserID: user29.ID, RepoID: 23}) 177 assert.NoError(t, err) 178 assert.False(t, has) 179 180 // adding user29 to team5 should add an explicit access row for repo 23 181 // even though repo 23 is public 182 assert.NoError(t, AddTeamMember(db.DefaultContext, team5, user29)) 183 184 has, err = db.GetEngine(db.DefaultContext).Get(&access_model.Access{UserID: user29.ID, RepoID: 23}) 185 assert.NoError(t, err) 186 assert.True(t, has) 187 }