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

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