You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

org_team_test.go 8.2KB

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