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_test.go 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  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 organization
  5. import (
  6. "testing"
  7. "code.gitea.io/gitea/models/db"
  8. repo_model "code.gitea.io/gitea/models/repo"
  9. "code.gitea.io/gitea/models/unittest"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/structs"
  12. "github.com/stretchr/testify/assert"
  13. )
  14. func TestUser_IsOwnedBy(t *testing.T) {
  15. assert.NoError(t, unittest.PrepareTestDatabase())
  16. for _, testCase := range []struct {
  17. OrgID int64
  18. UserID int64
  19. ExpectedOwner bool
  20. }{
  21. {3, 2, true},
  22. {3, 1, false},
  23. {3, 3, false},
  24. {3, 4, false},
  25. {2, 2, false}, // user2 is not an organization
  26. {2, 3, false},
  27. } {
  28. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: testCase.OrgID}).(*Organization)
  29. isOwner, err := org.IsOwnedBy(testCase.UserID)
  30. assert.NoError(t, err)
  31. assert.Equal(t, testCase.ExpectedOwner, isOwner)
  32. }
  33. }
  34. func TestUser_IsOrgMember(t *testing.T) {
  35. assert.NoError(t, unittest.PrepareTestDatabase())
  36. for _, testCase := range []struct {
  37. OrgID int64
  38. UserID int64
  39. ExpectedMember bool
  40. }{
  41. {3, 2, true},
  42. {3, 4, true},
  43. {3, 1, false},
  44. {3, 3, false},
  45. {2, 2, false}, // user2 is not an organization
  46. {2, 3, false},
  47. } {
  48. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: testCase.OrgID}).(*Organization)
  49. isMember, err := org.IsOrgMember(testCase.UserID)
  50. assert.NoError(t, err)
  51. assert.Equal(t, testCase.ExpectedMember, isMember)
  52. }
  53. }
  54. func TestUser_GetTeam(t *testing.T) {
  55. assert.NoError(t, unittest.PrepareTestDatabase())
  56. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  57. team, err := org.GetTeam("team1")
  58. assert.NoError(t, err)
  59. assert.Equal(t, org.ID, team.OrgID)
  60. assert.Equal(t, "team1", team.LowerName)
  61. _, err = org.GetTeam("does not exist")
  62. assert.True(t, IsErrTeamNotExist(err))
  63. nonOrg := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 2}).(*Organization)
  64. _, err = nonOrg.GetTeam("team")
  65. assert.True(t, IsErrTeamNotExist(err))
  66. }
  67. func TestUser_GetOwnerTeam(t *testing.T) {
  68. assert.NoError(t, unittest.PrepareTestDatabase())
  69. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  70. team, err := org.GetOwnerTeam()
  71. assert.NoError(t, err)
  72. assert.Equal(t, org.ID, team.OrgID)
  73. nonOrg := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 2}).(*Organization)
  74. _, err = nonOrg.GetOwnerTeam()
  75. assert.True(t, IsErrTeamNotExist(err))
  76. }
  77. func TestUser_GetTeams(t *testing.T) {
  78. assert.NoError(t, unittest.PrepareTestDatabase())
  79. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  80. teams, err := org.LoadTeams()
  81. assert.NoError(t, err)
  82. if assert.Len(t, teams, 4) {
  83. assert.Equal(t, int64(1), teams[0].ID)
  84. assert.Equal(t, int64(2), teams[1].ID)
  85. assert.Equal(t, int64(12), teams[2].ID)
  86. assert.Equal(t, int64(7), teams[3].ID)
  87. }
  88. }
  89. func TestUser_GetMembers(t *testing.T) {
  90. assert.NoError(t, unittest.PrepareTestDatabase())
  91. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  92. members, _, err := org.GetMembers()
  93. assert.NoError(t, err)
  94. if assert.Len(t, members, 3) {
  95. assert.Equal(t, int64(2), members[0].ID)
  96. assert.Equal(t, int64(28), members[1].ID)
  97. assert.Equal(t, int64(4), members[2].ID)
  98. }
  99. }
  100. func TestGetOrgByName(t *testing.T) {
  101. assert.NoError(t, unittest.PrepareTestDatabase())
  102. org, err := GetOrgByName("user3")
  103. assert.NoError(t, err)
  104. assert.EqualValues(t, 3, org.ID)
  105. assert.Equal(t, "user3", org.Name)
  106. _, err = GetOrgByName("user2") // user2 is an individual
  107. assert.True(t, IsErrOrgNotExist(err))
  108. _, err = GetOrgByName("") // corner case
  109. assert.True(t, IsErrOrgNotExist(err))
  110. }
  111. func TestCountOrganizations(t *testing.T) {
  112. assert.NoError(t, unittest.PrepareTestDatabase())
  113. expected, err := db.GetEngine(db.DefaultContext).Where("type=?", user_model.UserTypeOrganization).Count(&Organization{})
  114. assert.NoError(t, err)
  115. cnt, err := CountOrgs(FindOrgOptions{IncludePrivate: true})
  116. assert.NoError(t, err)
  117. assert.Equal(t, expected, cnt)
  118. }
  119. func TestIsOrganizationOwner(t *testing.T) {
  120. assert.NoError(t, unittest.PrepareTestDatabase())
  121. test := func(orgID, userID int64, expected bool) {
  122. isOwner, err := IsOrganizationOwner(db.DefaultContext, orgID, userID)
  123. assert.NoError(t, err)
  124. assert.EqualValues(t, expected, isOwner)
  125. }
  126. test(3, 2, true)
  127. test(3, 3, false)
  128. test(6, 5, true)
  129. test(6, 4, false)
  130. test(unittest.NonexistentID, unittest.NonexistentID, false)
  131. }
  132. func TestIsOrganizationMember(t *testing.T) {
  133. assert.NoError(t, unittest.PrepareTestDatabase())
  134. test := func(orgID, userID int64, expected bool) {
  135. isMember, err := IsOrganizationMember(db.DefaultContext, orgID, userID)
  136. assert.NoError(t, err)
  137. assert.EqualValues(t, expected, isMember)
  138. }
  139. test(3, 2, true)
  140. test(3, 3, false)
  141. test(3, 4, true)
  142. test(6, 5, true)
  143. test(6, 4, false)
  144. test(unittest.NonexistentID, unittest.NonexistentID, false)
  145. }
  146. func TestIsPublicMembership(t *testing.T) {
  147. assert.NoError(t, unittest.PrepareTestDatabase())
  148. test := func(orgID, userID int64, expected bool) {
  149. isMember, err := IsPublicMembership(orgID, userID)
  150. assert.NoError(t, err)
  151. assert.EqualValues(t, expected, isMember)
  152. }
  153. test(3, 2, true)
  154. test(3, 3, false)
  155. test(3, 4, false)
  156. test(6, 5, true)
  157. test(6, 4, false)
  158. test(unittest.NonexistentID, unittest.NonexistentID, false)
  159. }
  160. func TestFindOrgs(t *testing.T) {
  161. assert.NoError(t, unittest.PrepareTestDatabase())
  162. orgs, err := FindOrgs(FindOrgOptions{
  163. UserID: 4,
  164. IncludePrivate: true,
  165. })
  166. assert.NoError(t, err)
  167. if assert.Len(t, orgs, 1) {
  168. assert.EqualValues(t, 3, orgs[0].ID)
  169. }
  170. orgs, err = FindOrgs(FindOrgOptions{
  171. UserID: 4,
  172. IncludePrivate: false,
  173. })
  174. assert.NoError(t, err)
  175. assert.Len(t, orgs, 0)
  176. total, err := CountOrgs(FindOrgOptions{
  177. UserID: 4,
  178. IncludePrivate: true,
  179. })
  180. assert.NoError(t, err)
  181. assert.EqualValues(t, 1, total)
  182. }
  183. func TestGetOrgUsersByUserID(t *testing.T) {
  184. assert.NoError(t, unittest.PrepareTestDatabase())
  185. orgUsers, err := GetOrgUsersByUserID(5, &SearchOrganizationsOptions{All: true})
  186. assert.NoError(t, err)
  187. if assert.Len(t, orgUsers, 2) {
  188. assert.Equal(t, OrgUser{
  189. ID: orgUsers[0].ID,
  190. OrgID: 6,
  191. UID: 5,
  192. IsPublic: true,
  193. }, *orgUsers[0])
  194. assert.Equal(t, OrgUser{
  195. ID: orgUsers[1].ID,
  196. OrgID: 7,
  197. UID: 5,
  198. IsPublic: false,
  199. }, *orgUsers[1])
  200. }
  201. publicOrgUsers, err := GetOrgUsersByUserID(5, &SearchOrganizationsOptions{All: false})
  202. assert.NoError(t, err)
  203. assert.Len(t, publicOrgUsers, 1)
  204. assert.Equal(t, *orgUsers[0], *publicOrgUsers[0])
  205. orgUsers, err = GetOrgUsersByUserID(1, &SearchOrganizationsOptions{All: true})
  206. assert.NoError(t, err)
  207. assert.Len(t, orgUsers, 0)
  208. }
  209. func TestGetOrgUsersByOrgID(t *testing.T) {
  210. assert.NoError(t, unittest.PrepareTestDatabase())
  211. orgUsers, err := GetOrgUsersByOrgID(db.DefaultContext, &FindOrgMembersOpts{
  212. ListOptions: db.ListOptions{},
  213. OrgID: 3,
  214. PublicOnly: false,
  215. })
  216. assert.NoError(t, err)
  217. if assert.Len(t, orgUsers, 3) {
  218. assert.Equal(t, OrgUser{
  219. ID: orgUsers[0].ID,
  220. OrgID: 3,
  221. UID: 2,
  222. IsPublic: true,
  223. }, *orgUsers[0])
  224. assert.Equal(t, OrgUser{
  225. ID: orgUsers[1].ID,
  226. OrgID: 3,
  227. UID: 4,
  228. IsPublic: false,
  229. }, *orgUsers[1])
  230. }
  231. orgUsers, err = GetOrgUsersByOrgID(db.DefaultContext, &FindOrgMembersOpts{
  232. ListOptions: db.ListOptions{},
  233. OrgID: unittest.NonexistentID,
  234. PublicOnly: false,
  235. })
  236. assert.NoError(t, err)
  237. assert.Len(t, orgUsers, 0)
  238. }
  239. func TestChangeOrgUserStatus(t *testing.T) {
  240. assert.NoError(t, unittest.PrepareTestDatabase())
  241. testSuccess := func(orgID, userID int64, public bool) {
  242. assert.NoError(t, ChangeOrgUserStatus(orgID, userID, public))
  243. orgUser := unittest.AssertExistsAndLoadBean(t, &OrgUser{OrgID: orgID, UID: userID}).(*OrgUser)
  244. assert.Equal(t, public, orgUser.IsPublic)
  245. }
  246. testSuccess(3, 2, false)
  247. testSuccess(3, 2, false)
  248. testSuccess(3, 4, true)
  249. assert.NoError(t, ChangeOrgUserStatus(unittest.NonexistentID, unittest.NonexistentID, true))
  250. }
  251. func TestUser_GetUserTeamIDs(t *testing.T) {
  252. assert.NoError(t, unittest.PrepareTestDatabase())
  253. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  254. testSuccess := func(userID int64, expected []int64) {
  255. teamIDs, err := org.GetUserTeamIDs(userID)
  256. assert.NoError(t, err)
  257. assert.Equal(t, expected, teamIDs)
  258. }
  259. testSuccess(2, []int64{1, 2})
  260. testSuccess(4, []int64{2})
  261. testSuccess(unittest.NonexistentID, []int64{})
  262. }
  263. func TestAccessibleReposEnv_CountRepos(t *testing.T) {
  264. assert.NoError(t, unittest.PrepareTestDatabase())
  265. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  266. testSuccess := func(userID, expectedCount int64) {
  267. env, err := AccessibleReposEnv(db.DefaultContext, org, userID)
  268. assert.NoError(t, err)
  269. count, err := env.CountRepos()
  270. assert.NoError(t, err)
  271. assert.EqualValues(t, expectedCount, count)
  272. }
  273. testSuccess(2, 3)
  274. testSuccess(4, 2)
  275. }
  276. func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
  277. assert.NoError(t, unittest.PrepareTestDatabase())
  278. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  279. testSuccess := func(userID, _, pageSize int64, expectedRepoIDs []int64) {
  280. env, err := AccessibleReposEnv(db.DefaultContext, org, userID)
  281. assert.NoError(t, err)
  282. repoIDs, err := env.RepoIDs(1, 100)
  283. assert.NoError(t, err)
  284. assert.Equal(t, expectedRepoIDs, repoIDs)
  285. }
  286. testSuccess(2, 1, 100, []int64{3, 5, 32})
  287. testSuccess(4, 0, 100, []int64{3, 32})
  288. }
  289. func TestAccessibleReposEnv_Repos(t *testing.T) {
  290. assert.NoError(t, unittest.PrepareTestDatabase())
  291. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  292. testSuccess := func(userID int64, expectedRepoIDs []int64) {
  293. env, err := AccessibleReposEnv(db.DefaultContext, org, userID)
  294. assert.NoError(t, err)
  295. repos, err := env.Repos(1, 100)
  296. assert.NoError(t, err)
  297. expectedRepos := make([]*repo_model.Repository, len(expectedRepoIDs))
  298. for i, repoID := range expectedRepoIDs {
  299. expectedRepos[i] = unittest.AssertExistsAndLoadBean(t,
  300. &repo_model.Repository{ID: repoID}).(*repo_model.Repository)
  301. }
  302. assert.Equal(t, expectedRepos, repos)
  303. }
  304. testSuccess(2, []int64{3, 5, 32})
  305. testSuccess(4, []int64{3, 32})
  306. }
  307. func TestAccessibleReposEnv_MirrorRepos(t *testing.T) {
  308. assert.NoError(t, unittest.PrepareTestDatabase())
  309. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  310. testSuccess := func(userID int64, expectedRepoIDs []int64) {
  311. env, err := AccessibleReposEnv(db.DefaultContext, org, userID)
  312. assert.NoError(t, err)
  313. repos, err := env.MirrorRepos()
  314. assert.NoError(t, err)
  315. expectedRepos := make([]*repo_model.Repository, len(expectedRepoIDs))
  316. for i, repoID := range expectedRepoIDs {
  317. expectedRepos[i] = unittest.AssertExistsAndLoadBean(t,
  318. &repo_model.Repository{ID: repoID}).(*repo_model.Repository)
  319. }
  320. assert.Equal(t, expectedRepos, repos)
  321. }
  322. testSuccess(2, []int64{5})
  323. testSuccess(4, []int64{})
  324. }
  325. func TestHasOrgVisibleTypePublic(t *testing.T) {
  326. assert.NoError(t, unittest.PrepareTestDatabase())
  327. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  328. user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User)
  329. const newOrgName = "test-org-public"
  330. org := &Organization{
  331. Name: newOrgName,
  332. Visibility: structs.VisibleTypePublic,
  333. }
  334. unittest.AssertNotExistsBean(t, &user_model.User{Name: org.Name, Type: user_model.UserTypeOrganization})
  335. assert.NoError(t, CreateOrganization(org, owner))
  336. org = unittest.AssertExistsAndLoadBean(t,
  337. &Organization{Name: org.Name, Type: user_model.UserTypeOrganization}).(*Organization)
  338. test1 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), owner)
  339. test2 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), user3)
  340. test3 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), nil)
  341. assert.True(t, test1) // owner of org
  342. assert.True(t, test2) // user not a part of org
  343. assert.True(t, test3) // logged out user
  344. }
  345. func TestHasOrgVisibleTypeLimited(t *testing.T) {
  346. assert.NoError(t, unittest.PrepareTestDatabase())
  347. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  348. user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User)
  349. const newOrgName = "test-org-limited"
  350. org := &Organization{
  351. Name: newOrgName,
  352. Visibility: structs.VisibleTypeLimited,
  353. }
  354. unittest.AssertNotExistsBean(t, &user_model.User{Name: org.Name, Type: user_model.UserTypeOrganization})
  355. assert.NoError(t, CreateOrganization(org, owner))
  356. org = unittest.AssertExistsAndLoadBean(t,
  357. &Organization{Name: org.Name, Type: user_model.UserTypeOrganization}).(*Organization)
  358. test1 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), owner)
  359. test2 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), user3)
  360. test3 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), nil)
  361. assert.True(t, test1) // owner of org
  362. assert.True(t, test2) // user not a part of org
  363. assert.False(t, test3) // logged out user
  364. }
  365. func TestHasOrgVisibleTypePrivate(t *testing.T) {
  366. assert.NoError(t, unittest.PrepareTestDatabase())
  367. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  368. user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User)
  369. const newOrgName = "test-org-private"
  370. org := &Organization{
  371. Name: newOrgName,
  372. Visibility: structs.VisibleTypePrivate,
  373. }
  374. unittest.AssertNotExistsBean(t, &user_model.User{Name: org.Name, Type: user_model.UserTypeOrganization})
  375. assert.NoError(t, CreateOrganization(org, owner))
  376. org = unittest.AssertExistsAndLoadBean(t,
  377. &Organization{Name: org.Name, Type: user_model.UserTypeOrganization}).(*Organization)
  378. test1 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), owner)
  379. test2 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), user3)
  380. test3 := HasOrgOrUserVisible(db.DefaultContext, org.AsUser(), nil)
  381. assert.True(t, test1) // owner of org
  382. assert.False(t, test2) // user not a part of org
  383. assert.False(t, test3) // logged out user
  384. }
  385. func TestGetUsersWhoCanCreateOrgRepo(t *testing.T) {
  386. assert.NoError(t, unittest.PrepareTestDatabase())
  387. users, err := GetUsersWhoCanCreateOrgRepo(db.DefaultContext, 3)
  388. assert.NoError(t, err)
  389. assert.Len(t, users, 2)
  390. var ids []int64
  391. for i := range users {
  392. ids = append(ids, users[i].ID)
  393. }
  394. assert.ElementsMatch(t, ids, []int64{2, 28})
  395. users, err = GetUsersWhoCanCreateOrgRepo(db.DefaultContext, 7)
  396. assert.NoError(t, err)
  397. assert.Len(t, users, 1)
  398. assert.EqualValues(t, 5, users[0].ID)
  399. }