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

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