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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  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. "testing"
  7. "code.gitea.io/gitea/models/db"
  8. "code.gitea.io/gitea/models/unittest"
  9. "code.gitea.io/gitea/modules/setting"
  10. "code.gitea.io/gitea/modules/structs"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. func TestUser_IsOwnedBy(t *testing.T) {
  14. assert.NoError(t, unittest.PrepareTestDatabase())
  15. for _, testCase := range []struct {
  16. OrgID int64
  17. UserID int64
  18. ExpectedOwner bool
  19. }{
  20. {3, 2, true},
  21. {3, 1, false},
  22. {3, 3, false},
  23. {3, 4, false},
  24. {2, 2, false}, // user2 is not an organization
  25. {2, 3, false},
  26. } {
  27. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: testCase.OrgID}).(*Organization)
  28. isOwner, err := org.IsOwnedBy(testCase.UserID)
  29. assert.NoError(t, err)
  30. assert.Equal(t, testCase.ExpectedOwner, isOwner)
  31. }
  32. }
  33. func TestUser_IsOrgMember(t *testing.T) {
  34. assert.NoError(t, unittest.PrepareTestDatabase())
  35. for _, testCase := range []struct {
  36. OrgID int64
  37. UserID int64
  38. ExpectedMember bool
  39. }{
  40. {3, 2, true},
  41. {3, 4, true},
  42. {3, 1, false},
  43. {3, 3, false},
  44. {2, 2, false}, // user2 is not an organization
  45. {2, 3, false},
  46. } {
  47. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: testCase.OrgID}).(*Organization)
  48. isMember, err := org.IsOrgMember(testCase.UserID)
  49. assert.NoError(t, err)
  50. assert.Equal(t, testCase.ExpectedMember, isMember)
  51. }
  52. }
  53. func TestUser_GetTeam(t *testing.T) {
  54. assert.NoError(t, unittest.PrepareTestDatabase())
  55. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  56. team, err := org.GetTeam("team1")
  57. assert.NoError(t, err)
  58. assert.Equal(t, org.ID, team.OrgID)
  59. assert.Equal(t, "team1", team.LowerName)
  60. _, err = org.GetTeam("does not exist")
  61. assert.True(t, IsErrTeamNotExist(err))
  62. nonOrg := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 2}).(*Organization)
  63. _, err = nonOrg.GetTeam("team")
  64. assert.True(t, IsErrTeamNotExist(err))
  65. }
  66. func TestUser_GetOwnerTeam(t *testing.T) {
  67. assert.NoError(t, unittest.PrepareTestDatabase())
  68. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  69. team, err := org.GetOwnerTeam()
  70. assert.NoError(t, err)
  71. assert.Equal(t, org.ID, team.OrgID)
  72. nonOrg := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 2}).(*Organization)
  73. _, err = nonOrg.GetOwnerTeam()
  74. assert.True(t, IsErrTeamNotExist(err))
  75. }
  76. func TestUser_GetTeams(t *testing.T) {
  77. assert.NoError(t, unittest.PrepareTestDatabase())
  78. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  79. teams, err := org.LoadTeams()
  80. assert.NoError(t, err)
  81. if assert.Len(t, teams, 4) {
  82. assert.Equal(t, int64(1), teams[0].ID)
  83. assert.Equal(t, int64(2), teams[1].ID)
  84. assert.Equal(t, int64(12), teams[2].ID)
  85. assert.Equal(t, int64(7), teams[3].ID)
  86. }
  87. }
  88. func TestUser_GetMembers(t *testing.T) {
  89. assert.NoError(t, unittest.PrepareTestDatabase())
  90. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  91. members, _, err := org.GetMembers()
  92. assert.NoError(t, err)
  93. if assert.Len(t, members, 3) {
  94. assert.Equal(t, int64(2), members[0].ID)
  95. assert.Equal(t, int64(28), members[1].ID)
  96. assert.Equal(t, int64(4), members[2].ID)
  97. }
  98. }
  99. func TestUser_AddMember(t *testing.T) {
  100. assert.NoError(t, unittest.PrepareTestDatabase())
  101. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  102. // add a user that is not a member
  103. unittest.AssertNotExistsBean(t, &OrgUser{UID: 5, OrgID: 3})
  104. prevNumMembers := org.NumMembers
  105. assert.NoError(t, org.AddMember(5))
  106. unittest.AssertExistsAndLoadBean(t, &OrgUser{UID: 5, OrgID: 3})
  107. org = unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  108. assert.Equal(t, prevNumMembers+1, org.NumMembers)
  109. // add a user that is already a member
  110. unittest.AssertExistsAndLoadBean(t, &OrgUser{UID: 4, OrgID: 3})
  111. prevNumMembers = org.NumMembers
  112. assert.NoError(t, org.AddMember(4))
  113. unittest.AssertExistsAndLoadBean(t, &OrgUser{UID: 4, OrgID: 3})
  114. org = unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  115. assert.Equal(t, prevNumMembers, org.NumMembers)
  116. unittest.CheckConsistencyFor(t, &User{})
  117. }
  118. func TestUser_RemoveMember(t *testing.T) {
  119. assert.NoError(t, unittest.PrepareTestDatabase())
  120. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  121. // remove a user that is a member
  122. unittest.AssertExistsAndLoadBean(t, &OrgUser{UID: 4, OrgID: 3})
  123. prevNumMembers := org.NumMembers
  124. assert.NoError(t, org.RemoveMember(4))
  125. unittest.AssertNotExistsBean(t, &OrgUser{UID: 4, OrgID: 3})
  126. org = unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  127. assert.Equal(t, prevNumMembers-1, org.NumMembers)
  128. // remove a user that is not a member
  129. unittest.AssertNotExistsBean(t, &OrgUser{UID: 5, OrgID: 3})
  130. prevNumMembers = org.NumMembers
  131. assert.NoError(t, org.RemoveMember(5))
  132. unittest.AssertNotExistsBean(t, &OrgUser{UID: 5, OrgID: 3})
  133. org = unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  134. assert.Equal(t, prevNumMembers, org.NumMembers)
  135. unittest.CheckConsistencyFor(t, &User{}, &Team{})
  136. }
  137. func TestUser_RemoveOrgRepo(t *testing.T) {
  138. assert.NoError(t, unittest.PrepareTestDatabase())
  139. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  140. repo := unittest.AssertExistsAndLoadBean(t, &Repository{OwnerID: org.ID}).(*Repository)
  141. // remove a repo that does belong to org
  142. unittest.AssertExistsAndLoadBean(t, &TeamRepo{RepoID: repo.ID, OrgID: org.ID})
  143. assert.NoError(t, org.RemoveOrgRepo(repo.ID))
  144. unittest.AssertNotExistsBean(t, &TeamRepo{RepoID: repo.ID, OrgID: org.ID})
  145. unittest.AssertExistsAndLoadBean(t, &Repository{ID: repo.ID}) // repo should still exist
  146. // remove a repo that does not belong to org
  147. assert.NoError(t, org.RemoveOrgRepo(repo.ID))
  148. unittest.AssertNotExistsBean(t, &TeamRepo{RepoID: repo.ID, OrgID: org.ID})
  149. assert.NoError(t, org.RemoveOrgRepo(unittest.NonexistentID))
  150. unittest.CheckConsistencyFor(t,
  151. &User{ID: org.ID},
  152. &Team{OrgID: org.ID},
  153. &Repository{ID: repo.ID})
  154. }
  155. func TestCreateOrganization(t *testing.T) {
  156. // successful creation of org
  157. assert.NoError(t, unittest.PrepareTestDatabase())
  158. owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  159. const newOrgName = "neworg"
  160. org := &Organization{
  161. Name: newOrgName,
  162. }
  163. unittest.AssertNotExistsBean(t, &User{Name: newOrgName, Type: UserTypeOrganization})
  164. assert.NoError(t, CreateOrganization(org, owner))
  165. org = unittest.AssertExistsAndLoadBean(t,
  166. &Organization{Name: newOrgName, Type: UserTypeOrganization}).(*Organization)
  167. ownerTeam := unittest.AssertExistsAndLoadBean(t,
  168. &Team{Name: ownerTeamName, OrgID: org.ID}).(*Team)
  169. unittest.AssertExistsAndLoadBean(t, &TeamUser{UID: owner.ID, TeamID: ownerTeam.ID})
  170. unittest.CheckConsistencyFor(t, &User{}, &Team{})
  171. }
  172. func TestCreateOrganization2(t *testing.T) {
  173. // unauthorized creation of org
  174. assert.NoError(t, unittest.PrepareTestDatabase())
  175. owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 5}).(*User)
  176. const newOrgName = "neworg"
  177. org := &Organization{
  178. Name: newOrgName,
  179. }
  180. unittest.AssertNotExistsBean(t, &Organization{Name: newOrgName, Type: UserTypeOrganization})
  181. err := CreateOrganization(org, owner)
  182. assert.Error(t, err)
  183. assert.True(t, IsErrUserNotAllowedCreateOrg(err))
  184. unittest.AssertNotExistsBean(t, &Organization{Name: newOrgName, Type: UserTypeOrganization})
  185. unittest.CheckConsistencyFor(t, &Organization{}, &Team{})
  186. }
  187. func TestCreateOrganization3(t *testing.T) {
  188. // create org with same name as existent org
  189. assert.NoError(t, unittest.PrepareTestDatabase())
  190. owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  191. org := &Organization{Name: "user3"} // should already exist
  192. unittest.AssertExistsAndLoadBean(t, &User{Name: org.Name}) // sanity check
  193. err := CreateOrganization(org, owner)
  194. assert.Error(t, err)
  195. assert.True(t, IsErrUserAlreadyExist(err))
  196. unittest.CheckConsistencyFor(t, &User{}, &Team{})
  197. }
  198. func TestCreateOrganization4(t *testing.T) {
  199. // create org with unusable name
  200. assert.NoError(t, unittest.PrepareTestDatabase())
  201. owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  202. err := CreateOrganization(&Organization{Name: "assets"}, owner)
  203. assert.Error(t, err)
  204. assert.True(t, IsErrNameReserved(err))
  205. unittest.CheckConsistencyFor(t, &Organization{}, &Team{})
  206. }
  207. func TestGetOrgByName(t *testing.T) {
  208. assert.NoError(t, unittest.PrepareTestDatabase())
  209. org, err := GetOrgByName("user3")
  210. assert.NoError(t, err)
  211. assert.EqualValues(t, 3, org.ID)
  212. assert.Equal(t, "user3", org.Name)
  213. _, err = GetOrgByName("user2") // user2 is an individual
  214. assert.True(t, IsErrOrgNotExist(err))
  215. _, err = GetOrgByName("") // corner case
  216. assert.True(t, IsErrOrgNotExist(err))
  217. }
  218. func TestCountOrganizations(t *testing.T) {
  219. assert.NoError(t, unittest.PrepareTestDatabase())
  220. expected, err := db.GetEngine(db.DefaultContext).Where("type=?", UserTypeOrganization).Count(&User{})
  221. assert.NoError(t, err)
  222. assert.Equal(t, expected, CountOrganizations())
  223. }
  224. func TestIsOrganizationOwner(t *testing.T) {
  225. assert.NoError(t, unittest.PrepareTestDatabase())
  226. test := func(orgID, userID int64, expected bool) {
  227. isOwner, err := IsOrganizationOwner(orgID, userID)
  228. assert.NoError(t, err)
  229. assert.EqualValues(t, expected, isOwner)
  230. }
  231. test(3, 2, true)
  232. test(3, 3, false)
  233. test(6, 5, true)
  234. test(6, 4, false)
  235. test(unittest.NonexistentID, unittest.NonexistentID, false)
  236. }
  237. func TestIsOrganizationMember(t *testing.T) {
  238. assert.NoError(t, unittest.PrepareTestDatabase())
  239. test := func(orgID, userID int64, expected bool) {
  240. isMember, err := IsOrganizationMember(orgID, userID)
  241. assert.NoError(t, err)
  242. assert.EqualValues(t, expected, isMember)
  243. }
  244. test(3, 2, true)
  245. test(3, 3, false)
  246. test(3, 4, true)
  247. test(6, 5, true)
  248. test(6, 4, false)
  249. test(unittest.NonexistentID, unittest.NonexistentID, false)
  250. }
  251. func TestIsPublicMembership(t *testing.T) {
  252. assert.NoError(t, unittest.PrepareTestDatabase())
  253. test := func(orgID, userID int64, expected bool) {
  254. isMember, err := IsPublicMembership(orgID, userID)
  255. assert.NoError(t, err)
  256. assert.EqualValues(t, expected, isMember)
  257. }
  258. test(3, 2, true)
  259. test(3, 3, false)
  260. test(3, 4, false)
  261. test(6, 5, true)
  262. test(6, 4, false)
  263. test(unittest.NonexistentID, unittest.NonexistentID, false)
  264. }
  265. func TestGetOrgsByUserID(t *testing.T) {
  266. assert.NoError(t, unittest.PrepareTestDatabase())
  267. orgs, err := GetOrgsByUserID(4, true)
  268. assert.NoError(t, err)
  269. if assert.Len(t, orgs, 1) {
  270. assert.EqualValues(t, 3, orgs[0].ID)
  271. }
  272. orgs, err = GetOrgsByUserID(4, false)
  273. assert.NoError(t, err)
  274. assert.Len(t, orgs, 0)
  275. }
  276. func TestGetOwnedOrgsByUserID(t *testing.T) {
  277. assert.NoError(t, unittest.PrepareTestDatabase())
  278. orgs, err := GetOwnedOrgsByUserID(2)
  279. assert.NoError(t, err)
  280. if assert.Len(t, orgs, 1) {
  281. assert.EqualValues(t, 3, orgs[0].ID)
  282. }
  283. orgs, err = GetOwnedOrgsByUserID(4)
  284. assert.NoError(t, err)
  285. assert.Len(t, orgs, 0)
  286. }
  287. func TestGetOwnedOrgsByUserIDDesc(t *testing.T) {
  288. assert.NoError(t, unittest.PrepareTestDatabase())
  289. orgs, err := GetOwnedOrgsByUserIDDesc(5, "id")
  290. assert.NoError(t, err)
  291. if assert.Len(t, orgs, 2) {
  292. assert.EqualValues(t, 7, orgs[0].ID)
  293. assert.EqualValues(t, 6, orgs[1].ID)
  294. }
  295. orgs, err = GetOwnedOrgsByUserIDDesc(4, "id")
  296. assert.NoError(t, err)
  297. assert.Len(t, orgs, 0)
  298. }
  299. func TestGetOrgUsersByUserID(t *testing.T) {
  300. assert.NoError(t, unittest.PrepareTestDatabase())
  301. orgUsers, err := GetOrgUsersByUserID(5, &SearchOrganizationsOptions{All: true})
  302. assert.NoError(t, err)
  303. if assert.Len(t, orgUsers, 2) {
  304. assert.Equal(t, OrgUser{
  305. ID: orgUsers[0].ID,
  306. OrgID: 6,
  307. UID: 5,
  308. IsPublic: true,
  309. }, *orgUsers[0])
  310. assert.Equal(t, OrgUser{
  311. ID: orgUsers[1].ID,
  312. OrgID: 7,
  313. UID: 5,
  314. IsPublic: false,
  315. }, *orgUsers[1])
  316. }
  317. publicOrgUsers, err := GetOrgUsersByUserID(5, &SearchOrganizationsOptions{All: false})
  318. assert.NoError(t, err)
  319. assert.Len(t, publicOrgUsers, 1)
  320. assert.Equal(t, *orgUsers[0], *publicOrgUsers[0])
  321. orgUsers, err = GetOrgUsersByUserID(1, &SearchOrganizationsOptions{All: true})
  322. assert.NoError(t, err)
  323. assert.Len(t, orgUsers, 0)
  324. }
  325. func TestGetOrgUsersByOrgID(t *testing.T) {
  326. assert.NoError(t, unittest.PrepareTestDatabase())
  327. orgUsers, err := GetOrgUsersByOrgID(&FindOrgMembersOpts{
  328. ListOptions: db.ListOptions{},
  329. OrgID: 3,
  330. PublicOnly: false,
  331. })
  332. assert.NoError(t, err)
  333. if assert.Len(t, orgUsers, 3) {
  334. assert.Equal(t, OrgUser{
  335. ID: orgUsers[0].ID,
  336. OrgID: 3,
  337. UID: 2,
  338. IsPublic: true,
  339. }, *orgUsers[0])
  340. assert.Equal(t, OrgUser{
  341. ID: orgUsers[1].ID,
  342. OrgID: 3,
  343. UID: 4,
  344. IsPublic: false,
  345. }, *orgUsers[1])
  346. }
  347. orgUsers, err = GetOrgUsersByOrgID(&FindOrgMembersOpts{
  348. ListOptions: db.ListOptions{},
  349. OrgID: unittest.NonexistentID,
  350. PublicOnly: false,
  351. })
  352. assert.NoError(t, err)
  353. assert.Len(t, orgUsers, 0)
  354. }
  355. func TestChangeOrgUserStatus(t *testing.T) {
  356. assert.NoError(t, unittest.PrepareTestDatabase())
  357. testSuccess := func(orgID, userID int64, public bool) {
  358. assert.NoError(t, ChangeOrgUserStatus(orgID, userID, public))
  359. orgUser := unittest.AssertExistsAndLoadBean(t, &OrgUser{OrgID: orgID, UID: userID}).(*OrgUser)
  360. assert.Equal(t, public, orgUser.IsPublic)
  361. }
  362. testSuccess(3, 2, false)
  363. testSuccess(3, 2, false)
  364. testSuccess(3, 4, true)
  365. assert.NoError(t, ChangeOrgUserStatus(unittest.NonexistentID, unittest.NonexistentID, true))
  366. }
  367. func TestAddOrgUser(t *testing.T) {
  368. assert.NoError(t, unittest.PrepareTestDatabase())
  369. testSuccess := func(orgID, userID int64, isPublic bool) {
  370. org := unittest.AssertExistsAndLoadBean(t, &User{ID: orgID}).(*User)
  371. expectedNumMembers := org.NumMembers
  372. if !unittest.BeanExists(t, &OrgUser{OrgID: orgID, UID: userID}) {
  373. expectedNumMembers++
  374. }
  375. assert.NoError(t, AddOrgUser(orgID, userID))
  376. ou := &OrgUser{OrgID: orgID, UID: userID}
  377. unittest.AssertExistsAndLoadBean(t, ou)
  378. assert.Equal(t, isPublic, ou.IsPublic)
  379. org = unittest.AssertExistsAndLoadBean(t, &User{ID: orgID}).(*User)
  380. assert.EqualValues(t, expectedNumMembers, org.NumMembers)
  381. }
  382. setting.Service.DefaultOrgMemberVisible = false
  383. testSuccess(3, 5, false)
  384. testSuccess(3, 5, false)
  385. testSuccess(6, 2, false)
  386. setting.Service.DefaultOrgMemberVisible = true
  387. testSuccess(6, 3, true)
  388. unittest.CheckConsistencyFor(t, &User{}, &Team{})
  389. }
  390. func TestRemoveOrgUser(t *testing.T) {
  391. assert.NoError(t, unittest.PrepareTestDatabase())
  392. testSuccess := func(orgID, userID int64) {
  393. org := unittest.AssertExistsAndLoadBean(t, &User{ID: orgID}).(*User)
  394. expectedNumMembers := org.NumMembers
  395. if unittest.BeanExists(t, &OrgUser{OrgID: orgID, UID: userID}) {
  396. expectedNumMembers--
  397. }
  398. assert.NoError(t, RemoveOrgUser(orgID, userID))
  399. unittest.AssertNotExistsBean(t, &OrgUser{OrgID: orgID, UID: userID})
  400. org = unittest.AssertExistsAndLoadBean(t, &User{ID: orgID}).(*User)
  401. assert.EqualValues(t, expectedNumMembers, org.NumMembers)
  402. }
  403. testSuccess(3, 4)
  404. testSuccess(3, 4)
  405. err := RemoveOrgUser(7, 5)
  406. assert.Error(t, err)
  407. assert.True(t, IsErrLastOrgOwner(err))
  408. unittest.AssertExistsAndLoadBean(t, &OrgUser{OrgID: 7, UID: 5})
  409. unittest.CheckConsistencyFor(t, &User{}, &Team{})
  410. }
  411. func TestUser_GetUserTeamIDs(t *testing.T) {
  412. assert.NoError(t, unittest.PrepareTestDatabase())
  413. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  414. testSuccess := func(userID int64, expected []int64) {
  415. teamIDs, err := org.GetUserTeamIDs(userID)
  416. assert.NoError(t, err)
  417. assert.Equal(t, expected, teamIDs)
  418. }
  419. testSuccess(2, []int64{1, 2})
  420. testSuccess(4, []int64{2})
  421. testSuccess(unittest.NonexistentID, []int64{})
  422. }
  423. func TestAccessibleReposEnv_CountRepos(t *testing.T) {
  424. assert.NoError(t, unittest.PrepareTestDatabase())
  425. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  426. testSuccess := func(userID, expectedCount int64) {
  427. env, err := org.AccessibleReposEnv(userID)
  428. assert.NoError(t, err)
  429. count, err := env.CountRepos()
  430. assert.NoError(t, err)
  431. assert.EqualValues(t, expectedCount, count)
  432. }
  433. testSuccess(2, 3)
  434. testSuccess(4, 2)
  435. }
  436. func TestAccessibleReposEnv_RepoIDs(t *testing.T) {
  437. assert.NoError(t, unittest.PrepareTestDatabase())
  438. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  439. testSuccess := func(userID, _, pageSize int64, expectedRepoIDs []int64) {
  440. env, err := org.AccessibleReposEnv(userID)
  441. assert.NoError(t, err)
  442. repoIDs, err := env.RepoIDs(1, 100)
  443. assert.NoError(t, err)
  444. assert.Equal(t, expectedRepoIDs, repoIDs)
  445. }
  446. testSuccess(2, 1, 100, []int64{3, 5, 32})
  447. testSuccess(4, 0, 100, []int64{3, 32})
  448. }
  449. func TestAccessibleReposEnv_Repos(t *testing.T) {
  450. assert.NoError(t, unittest.PrepareTestDatabase())
  451. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  452. testSuccess := func(userID int64, expectedRepoIDs []int64) {
  453. env, err := org.AccessibleReposEnv(userID)
  454. assert.NoError(t, err)
  455. repos, err := env.Repos(1, 100)
  456. assert.NoError(t, err)
  457. expectedRepos := make([]*Repository, len(expectedRepoIDs))
  458. for i, repoID := range expectedRepoIDs {
  459. expectedRepos[i] = unittest.AssertExistsAndLoadBean(t,
  460. &Repository{ID: repoID}).(*Repository)
  461. }
  462. assert.Equal(t, expectedRepos, repos)
  463. }
  464. testSuccess(2, []int64{3, 5, 32})
  465. testSuccess(4, []int64{3, 32})
  466. }
  467. func TestAccessibleReposEnv_MirrorRepos(t *testing.T) {
  468. assert.NoError(t, unittest.PrepareTestDatabase())
  469. org := unittest.AssertExistsAndLoadBean(t, &Organization{ID: 3}).(*Organization)
  470. testSuccess := func(userID int64, expectedRepoIDs []int64) {
  471. env, err := org.AccessibleReposEnv(userID)
  472. assert.NoError(t, err)
  473. repos, err := env.MirrorRepos()
  474. assert.NoError(t, err)
  475. expectedRepos := make([]*Repository, len(expectedRepoIDs))
  476. for i, repoID := range expectedRepoIDs {
  477. expectedRepos[i] = unittest.AssertExistsAndLoadBean(t,
  478. &Repository{ID: repoID}).(*Repository)
  479. }
  480. assert.Equal(t, expectedRepos, repos)
  481. }
  482. testSuccess(2, []int64{5})
  483. testSuccess(4, []int64{})
  484. }
  485. func TestHasOrgVisibleTypePublic(t *testing.T) {
  486. assert.NoError(t, unittest.PrepareTestDatabase())
  487. owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  488. user3 := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
  489. const newOrgName = "test-org-public"
  490. org := &Organization{
  491. Name: newOrgName,
  492. Visibility: structs.VisibleTypePublic,
  493. }
  494. unittest.AssertNotExistsBean(t, &User{Name: org.Name, Type: UserTypeOrganization})
  495. assert.NoError(t, CreateOrganization(org, owner))
  496. org = unittest.AssertExistsAndLoadBean(t,
  497. &Organization{Name: org.Name, Type: UserTypeOrganization}).(*Organization)
  498. test1 := HasOrgOrUserVisible(org.AsUser(), owner)
  499. test2 := HasOrgOrUserVisible(org.AsUser(), user3)
  500. test3 := HasOrgOrUserVisible(org.AsUser(), nil)
  501. assert.True(t, test1) // owner of org
  502. assert.True(t, test2) // user not a part of org
  503. assert.True(t, test3) // logged out user
  504. }
  505. func TestHasOrgVisibleTypeLimited(t *testing.T) {
  506. assert.NoError(t, unittest.PrepareTestDatabase())
  507. owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  508. user3 := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
  509. const newOrgName = "test-org-limited"
  510. org := &Organization{
  511. Name: newOrgName,
  512. Visibility: structs.VisibleTypeLimited,
  513. }
  514. unittest.AssertNotExistsBean(t, &User{Name: org.Name, Type: UserTypeOrganization})
  515. assert.NoError(t, CreateOrganization(org, owner))
  516. org = unittest.AssertExistsAndLoadBean(t,
  517. &Organization{Name: org.Name, Type: UserTypeOrganization}).(*Organization)
  518. test1 := HasOrgOrUserVisible(org.AsUser(), owner)
  519. test2 := HasOrgOrUserVisible(org.AsUser(), user3)
  520. test3 := HasOrgOrUserVisible(org.AsUser(), nil)
  521. assert.True(t, test1) // owner of org
  522. assert.True(t, test2) // user not a part of org
  523. assert.False(t, test3) // logged out user
  524. }
  525. func TestHasOrgVisibleTypePrivate(t *testing.T) {
  526. assert.NoError(t, unittest.PrepareTestDatabase())
  527. owner := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
  528. user3 := unittest.AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
  529. const newOrgName = "test-org-private"
  530. org := &Organization{
  531. Name: newOrgName,
  532. Visibility: structs.VisibleTypePrivate,
  533. }
  534. unittest.AssertNotExistsBean(t, &User{Name: org.Name, Type: UserTypeOrganization})
  535. assert.NoError(t, CreateOrganization(org, owner))
  536. org = unittest.AssertExistsAndLoadBean(t,
  537. &Organization{Name: org.Name, Type: UserTypeOrganization}).(*Organization)
  538. test1 := HasOrgOrUserVisible(org.AsUser(), owner)
  539. test2 := HasOrgOrUserVisible(org.AsUser(), user3)
  540. test3 := HasOrgOrUserVisible(org.AsUser(), nil)
  541. assert.True(t, test1) // owner of org
  542. assert.False(t, test2) // user not a part of org
  543. assert.False(t, test3) // logged out user
  544. }
  545. func TestGetUsersWhoCanCreateOrgRepo(t *testing.T) {
  546. assert.NoError(t, unittest.PrepareTestDatabase())
  547. users, err := GetUsersWhoCanCreateOrgRepo(3)
  548. assert.NoError(t, err)
  549. assert.Len(t, users, 2)
  550. var ids []int64
  551. for i := range users {
  552. ids = append(ids, users[i].ID)
  553. }
  554. assert.ElementsMatch(t, ids, []int64{2, 28})
  555. users, err = GetUsersWhoCanCreateOrgRepo(7)
  556. assert.NoError(t, err)
  557. assert.Len(t, users, 1)
  558. assert.EqualValues(t, 5, users[0].ID)
  559. }