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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  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/unittest"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestTeam_IsOwnerTeam(t *testing.T) {
  12. assert.NoError(t, unittest.PrepareTestDatabase())
  13. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: 1}).(*Team)
  14. assert.True(t, team.IsOwnerTeam())
  15. team = unittest.AssertExistsAndLoadBean(t, &Team{ID: 2}).(*Team)
  16. assert.False(t, team.IsOwnerTeam())
  17. }
  18. func TestTeam_IsMember(t *testing.T) {
  19. assert.NoError(t, unittest.PrepareTestDatabase())
  20. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: 1}).(*Team)
  21. assert.True(t, team.IsMember(2))
  22. assert.False(t, team.IsMember(4))
  23. assert.False(t, team.IsMember(unittest.NonexistentID))
  24. team = unittest.AssertExistsAndLoadBean(t, &Team{ID: 2}).(*Team)
  25. assert.True(t, team.IsMember(2))
  26. assert.True(t, team.IsMember(4))
  27. assert.False(t, team.IsMember(unittest.NonexistentID))
  28. }
  29. func TestTeam_GetRepositories(t *testing.T) {
  30. assert.NoError(t, unittest.PrepareTestDatabase())
  31. test := func(teamID int64) {
  32. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  33. assert.NoError(t, team.GetRepositories(&SearchTeamOptions{}))
  34. assert.Len(t, team.Repos, team.NumRepos)
  35. for _, repo := range team.Repos {
  36. unittest.AssertExistsAndLoadBean(t, &TeamRepo{TeamID: teamID, RepoID: repo.ID})
  37. }
  38. }
  39. test(1)
  40. test(3)
  41. }
  42. func TestTeam_GetMembers(t *testing.T) {
  43. assert.NoError(t, unittest.PrepareTestDatabase())
  44. test := func(teamID int64) {
  45. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  46. assert.NoError(t, team.GetMembers(&SearchMembersOptions{}))
  47. assert.Len(t, team.Members, team.NumMembers)
  48. for _, member := range team.Members {
  49. unittest.AssertExistsAndLoadBean(t, &TeamUser{UID: member.ID, TeamID: teamID})
  50. }
  51. }
  52. test(1)
  53. test(3)
  54. }
  55. func TestTeam_AddMember(t *testing.T) {
  56. assert.NoError(t, unittest.PrepareTestDatabase())
  57. test := func(teamID, userID int64) {
  58. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  59. assert.NoError(t, team.AddMember(userID))
  60. unittest.AssertExistsAndLoadBean(t, &TeamUser{UID: userID, TeamID: teamID})
  61. unittest.CheckConsistencyFor(t, &Team{ID: teamID}, &User{ID: team.OrgID})
  62. }
  63. test(1, 2)
  64. test(1, 4)
  65. test(3, 2)
  66. }
  67. func TestTeam_RemoveMember(t *testing.T) {
  68. assert.NoError(t, unittest.PrepareTestDatabase())
  69. testSuccess := func(teamID, userID int64) {
  70. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  71. assert.NoError(t, team.RemoveMember(userID))
  72. unittest.AssertNotExistsBean(t, &TeamUser{UID: userID, TeamID: teamID})
  73. unittest.CheckConsistencyFor(t, &Team{ID: teamID})
  74. }
  75. testSuccess(1, 4)
  76. testSuccess(2, 2)
  77. testSuccess(3, 2)
  78. testSuccess(3, unittest.NonexistentID)
  79. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: 1}).(*Team)
  80. err := team.RemoveMember(2)
  81. assert.True(t, IsErrLastOrgOwner(err))
  82. }
  83. func TestTeam_HasRepository(t *testing.T) {
  84. assert.NoError(t, unittest.PrepareTestDatabase())
  85. test := func(teamID, repoID int64, expected bool) {
  86. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  87. assert.Equal(t, expected, team.HasRepository(repoID))
  88. }
  89. test(1, 1, false)
  90. test(1, 3, true)
  91. test(1, 5, true)
  92. test(1, unittest.NonexistentID, false)
  93. test(2, 3, true)
  94. test(2, 5, false)
  95. }
  96. func TestTeam_AddRepository(t *testing.T) {
  97. assert.NoError(t, unittest.PrepareTestDatabase())
  98. testSuccess := func(teamID, repoID int64) {
  99. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  100. repo := unittest.AssertExistsAndLoadBean(t, &Repository{ID: repoID}).(*Repository)
  101. assert.NoError(t, team.AddRepository(repo))
  102. unittest.AssertExistsAndLoadBean(t, &TeamRepo{TeamID: teamID, RepoID: repoID})
  103. unittest.CheckConsistencyFor(t, &Team{ID: teamID}, &Repository{ID: repoID})
  104. }
  105. testSuccess(2, 3)
  106. testSuccess(2, 5)
  107. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: 1}).(*Team)
  108. repo := unittest.AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository)
  109. assert.Error(t, team.AddRepository(repo))
  110. unittest.CheckConsistencyFor(t, &Team{ID: 1}, &Repository{ID: 1})
  111. }
  112. func TestTeam_RemoveRepository(t *testing.T) {
  113. assert.NoError(t, unittest.PrepareTestDatabase())
  114. testSuccess := func(teamID, repoID int64) {
  115. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  116. assert.NoError(t, team.RemoveRepository(repoID))
  117. unittest.AssertNotExistsBean(t, &TeamRepo{TeamID: teamID, RepoID: repoID})
  118. unittest.CheckConsistencyFor(t, &Team{ID: teamID}, &Repository{ID: repoID})
  119. }
  120. testSuccess(2, 3)
  121. testSuccess(2, 5)
  122. testSuccess(1, unittest.NonexistentID)
  123. }
  124. func TestIsUsableTeamName(t *testing.T) {
  125. assert.NoError(t, IsUsableTeamName("usable"))
  126. assert.True(t, IsErrNameReserved(IsUsableTeamName("new")))
  127. }
  128. func TestNewTeam(t *testing.T) {
  129. assert.NoError(t, unittest.PrepareTestDatabase())
  130. const teamName = "newTeamName"
  131. team := &Team{Name: teamName, OrgID: 3}
  132. assert.NoError(t, NewTeam(team))
  133. unittest.AssertExistsAndLoadBean(t, &Team{Name: teamName})
  134. unittest.CheckConsistencyFor(t, &Team{}, &User{ID: team.OrgID})
  135. }
  136. func TestGetTeam(t *testing.T) {
  137. assert.NoError(t, unittest.PrepareTestDatabase())
  138. testSuccess := func(orgID int64, name string) {
  139. team, err := GetTeam(orgID, name)
  140. assert.NoError(t, err)
  141. assert.EqualValues(t, orgID, team.OrgID)
  142. assert.Equal(t, name, team.Name)
  143. }
  144. testSuccess(3, "Owners")
  145. testSuccess(3, "team1")
  146. _, err := GetTeam(3, "nonexistent")
  147. assert.Error(t, err)
  148. _, err = GetTeam(unittest.NonexistentID, "Owners")
  149. assert.Error(t, err)
  150. }
  151. func TestGetTeamByID(t *testing.T) {
  152. assert.NoError(t, unittest.PrepareTestDatabase())
  153. testSuccess := func(teamID int64) {
  154. team, err := GetTeamByID(teamID)
  155. assert.NoError(t, err)
  156. assert.EqualValues(t, teamID, team.ID)
  157. }
  158. testSuccess(1)
  159. testSuccess(2)
  160. testSuccess(3)
  161. testSuccess(4)
  162. _, err := GetTeamByID(unittest.NonexistentID)
  163. assert.Error(t, err)
  164. }
  165. func TestUpdateTeam(t *testing.T) {
  166. // successful update
  167. assert.NoError(t, unittest.PrepareTestDatabase())
  168. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: 2}).(*Team)
  169. team.LowerName = "newname"
  170. team.Name = "newName"
  171. team.Description = strings.Repeat("A long description!", 100)
  172. team.Authorize = AccessModeAdmin
  173. assert.NoError(t, UpdateTeam(team, true, false))
  174. team = unittest.AssertExistsAndLoadBean(t, &Team{Name: "newName"}).(*Team)
  175. assert.True(t, strings.HasPrefix(team.Description, "A long description!"))
  176. access := unittest.AssertExistsAndLoadBean(t, &Access{UserID: 4, RepoID: 3}).(*Access)
  177. assert.EqualValues(t, AccessModeAdmin, access.Mode)
  178. unittest.CheckConsistencyFor(t, &Team{ID: team.ID})
  179. }
  180. func TestUpdateTeam2(t *testing.T) {
  181. // update to already-existing team
  182. assert.NoError(t, unittest.PrepareTestDatabase())
  183. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: 2}).(*Team)
  184. team.LowerName = "owners"
  185. team.Name = "Owners"
  186. team.Description = strings.Repeat("A long description!", 100)
  187. err := UpdateTeam(team, true, false)
  188. assert.True(t, IsErrTeamAlreadyExist(err))
  189. unittest.CheckConsistencyFor(t, &Team{ID: team.ID})
  190. }
  191. func TestDeleteTeam(t *testing.T) {
  192. assert.NoError(t, unittest.PrepareTestDatabase())
  193. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: 2}).(*Team)
  194. assert.NoError(t, DeleteTeam(team))
  195. unittest.AssertNotExistsBean(t, &Team{ID: team.ID})
  196. unittest.AssertNotExistsBean(t, &TeamRepo{TeamID: team.ID})
  197. unittest.AssertNotExistsBean(t, &TeamUser{TeamID: team.ID})
  198. // check that team members don't have "leftover" access to repos
  199. user := unittest.AssertExistsAndLoadBean(t, &User{ID: 4}).(*User)
  200. repo := unittest.AssertExistsAndLoadBean(t, &Repository{ID: 3}).(*Repository)
  201. accessMode, err := AccessLevel(user, repo)
  202. assert.NoError(t, err)
  203. assert.True(t, accessMode < AccessModeWrite)
  204. }
  205. func TestIsTeamMember(t *testing.T) {
  206. assert.NoError(t, unittest.PrepareTestDatabase())
  207. test := func(orgID, teamID, userID int64, expected bool) {
  208. isMember, err := IsTeamMember(orgID, teamID, userID)
  209. assert.NoError(t, err)
  210. assert.Equal(t, expected, isMember)
  211. }
  212. test(3, 1, 2, true)
  213. test(3, 1, 4, false)
  214. test(3, 1, unittest.NonexistentID, false)
  215. test(3, 2, 2, true)
  216. test(3, 2, 4, true)
  217. test(3, unittest.NonexistentID, unittest.NonexistentID, false)
  218. test(unittest.NonexistentID, unittest.NonexistentID, unittest.NonexistentID, false)
  219. }
  220. func TestGetTeamMembers(t *testing.T) {
  221. assert.NoError(t, unittest.PrepareTestDatabase())
  222. test := func(teamID int64) {
  223. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  224. members, err := GetTeamMembers(teamID)
  225. assert.NoError(t, err)
  226. assert.Len(t, members, team.NumMembers)
  227. for _, member := range members {
  228. unittest.AssertExistsAndLoadBean(t, &TeamUser{UID: member.ID, TeamID: teamID})
  229. }
  230. }
  231. test(1)
  232. test(3)
  233. }
  234. func TestGetUserTeams(t *testing.T) {
  235. assert.NoError(t, unittest.PrepareTestDatabase())
  236. test := func(userID int64) {
  237. teams, _, err := SearchTeam(&SearchTeamOptions{UserID: userID})
  238. assert.NoError(t, err)
  239. for _, team := range teams {
  240. unittest.AssertExistsAndLoadBean(t, &TeamUser{TeamID: team.ID, UID: userID})
  241. }
  242. }
  243. test(2)
  244. test(5)
  245. test(unittest.NonexistentID)
  246. }
  247. func TestGetUserOrgTeams(t *testing.T) {
  248. assert.NoError(t, unittest.PrepareTestDatabase())
  249. test := func(orgID, userID int64) {
  250. teams, err := GetUserOrgTeams(orgID, userID)
  251. assert.NoError(t, err)
  252. for _, team := range teams {
  253. assert.EqualValues(t, orgID, team.OrgID)
  254. unittest.AssertExistsAndLoadBean(t, &TeamUser{TeamID: team.ID, UID: userID})
  255. }
  256. }
  257. test(3, 2)
  258. test(3, 4)
  259. test(3, unittest.NonexistentID)
  260. }
  261. func TestAddTeamMember(t *testing.T) {
  262. assert.NoError(t, unittest.PrepareTestDatabase())
  263. test := func(teamID, userID int64) {
  264. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  265. assert.NoError(t, AddTeamMember(team, userID))
  266. unittest.AssertExistsAndLoadBean(t, &TeamUser{UID: userID, TeamID: teamID})
  267. unittest.CheckConsistencyFor(t, &Team{ID: teamID}, &User{ID: team.OrgID})
  268. }
  269. test(1, 2)
  270. test(1, 4)
  271. test(3, 2)
  272. }
  273. func TestRemoveTeamMember(t *testing.T) {
  274. assert.NoError(t, unittest.PrepareTestDatabase())
  275. testSuccess := func(teamID, userID int64) {
  276. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  277. assert.NoError(t, RemoveTeamMember(team, userID))
  278. unittest.AssertNotExistsBean(t, &TeamUser{UID: userID, TeamID: teamID})
  279. unittest.CheckConsistencyFor(t, &Team{ID: teamID})
  280. }
  281. testSuccess(1, 4)
  282. testSuccess(2, 2)
  283. testSuccess(3, 2)
  284. testSuccess(3, unittest.NonexistentID)
  285. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: 1}).(*Team)
  286. err := RemoveTeamMember(team, 2)
  287. assert.True(t, IsErrLastOrgOwner(err))
  288. }
  289. func TestHasTeamRepo(t *testing.T) {
  290. assert.NoError(t, unittest.PrepareTestDatabase())
  291. test := func(teamID, repoID int64, expected bool) {
  292. team := unittest.AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team)
  293. assert.Equal(t, expected, HasTeamRepo(team.OrgID, teamID, repoID))
  294. }
  295. test(1, 1, false)
  296. test(1, 3, true)
  297. test(1, 5, true)
  298. test(1, unittest.NonexistentID, false)
  299. test(2, 3, true)
  300. test(2, 5, false)
  301. }
  302. func TestUsersInTeamsCount(t *testing.T) {
  303. assert.NoError(t, unittest.PrepareTestDatabase())
  304. test := func(teamIDs, userIDs []int64, expected int64) {
  305. count, err := UsersInTeamsCount(teamIDs, userIDs)
  306. assert.NoError(t, err)
  307. assert.Equal(t, expected, count)
  308. }
  309. test([]int64{2}, []int64{1, 2, 3, 4}, 1) // only userid 2
  310. test([]int64{1, 2, 3, 4, 5}, []int64{2, 5}, 2) // userid 2,4
  311. test([]int64{1, 2, 3, 4, 5}, []int64{2, 3, 5}, 3) // userid 2,4,5
  312. }