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 7.1KB

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