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.

create_test.go 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package repository
  4. import (
  5. "fmt"
  6. "testing"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/models/db"
  9. "code.gitea.io/gitea/models/organization"
  10. "code.gitea.io/gitea/models/perm"
  11. "code.gitea.io/gitea/models/unittest"
  12. user_model "code.gitea.io/gitea/models/user"
  13. "code.gitea.io/gitea/modules/structs"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. func TestIncludesAllRepositoriesTeams(t *testing.T) {
  17. assert.NoError(t, unittest.PrepareTestDatabase())
  18. testTeamRepositories := func(teamID int64, repoIDs []int64) {
  19. team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: teamID})
  20. assert.NoError(t, team.LoadRepositories(db.DefaultContext), "%s: GetRepositories", team.Name)
  21. assert.Len(t, team.Repos, team.NumRepos, "%s: len repo", team.Name)
  22. assert.Len(t, team.Repos, len(repoIDs), "%s: repo count", team.Name)
  23. for i, rid := range repoIDs {
  24. if rid > 0 {
  25. assert.True(t, HasRepository(db.DefaultContext, team, rid), "%s: HasRepository(%d) %d", rid, i)
  26. }
  27. }
  28. }
  29. // Get an admin user.
  30. user, err := user_model.GetUserByID(db.DefaultContext, 1)
  31. assert.NoError(t, err, "GetUserByID")
  32. // Create org.
  33. org := &organization.Organization{
  34. Name: "All_repo",
  35. IsActive: true,
  36. Type: user_model.UserTypeOrganization,
  37. Visibility: structs.VisibleTypePublic,
  38. }
  39. assert.NoError(t, organization.CreateOrganization(db.DefaultContext, org, user), "CreateOrganization")
  40. // Check Owner team.
  41. ownerTeam, err := org.GetOwnerTeam(db.DefaultContext)
  42. assert.NoError(t, err, "GetOwnerTeam")
  43. assert.True(t, ownerTeam.IncludesAllRepositories, "Owner team includes all repositories")
  44. // Create repos.
  45. repoIDs := make([]int64, 0)
  46. for i := 0; i < 3; i++ {
  47. r, err := CreateRepositoryDirectly(db.DefaultContext, user, org.AsUser(), CreateRepoOptions{Name: fmt.Sprintf("repo-%d", i)})
  48. assert.NoError(t, err, "CreateRepository %d", i)
  49. if r != nil {
  50. repoIDs = append(repoIDs, r.ID)
  51. }
  52. }
  53. // Get fresh copy of Owner team after creating repos.
  54. ownerTeam, err = org.GetOwnerTeam(db.DefaultContext)
  55. assert.NoError(t, err, "GetOwnerTeam")
  56. // Create teams and check repositories.
  57. teams := []*organization.Team{
  58. ownerTeam,
  59. {
  60. OrgID: org.ID,
  61. Name: "team one",
  62. AccessMode: perm.AccessModeRead,
  63. IncludesAllRepositories: true,
  64. },
  65. {
  66. OrgID: org.ID,
  67. Name: "team 2",
  68. AccessMode: perm.AccessModeRead,
  69. IncludesAllRepositories: false,
  70. },
  71. {
  72. OrgID: org.ID,
  73. Name: "team three",
  74. AccessMode: perm.AccessModeWrite,
  75. IncludesAllRepositories: true,
  76. },
  77. {
  78. OrgID: org.ID,
  79. Name: "team 4",
  80. AccessMode: perm.AccessModeWrite,
  81. IncludesAllRepositories: false,
  82. },
  83. }
  84. teamRepos := [][]int64{
  85. repoIDs,
  86. repoIDs,
  87. {},
  88. repoIDs,
  89. {},
  90. }
  91. for i, team := range teams {
  92. if i > 0 { // first team is Owner.
  93. assert.NoError(t, models.NewTeam(db.DefaultContext, team), "%s: NewTeam", team.Name)
  94. }
  95. testTeamRepositories(team.ID, teamRepos[i])
  96. }
  97. // Update teams and check repositories.
  98. teams[3].IncludesAllRepositories = false
  99. teams[4].IncludesAllRepositories = true
  100. teamRepos[4] = repoIDs
  101. for i, team := range teams {
  102. assert.NoError(t, models.UpdateTeam(db.DefaultContext, team, false, true), "%s: UpdateTeam", team.Name)
  103. testTeamRepositories(team.ID, teamRepos[i])
  104. }
  105. // Create repo and check teams repositories.
  106. r, err := CreateRepositoryDirectly(db.DefaultContext, user, org.AsUser(), CreateRepoOptions{Name: "repo-last"})
  107. assert.NoError(t, err, "CreateRepository last")
  108. if r != nil {
  109. repoIDs = append(repoIDs, r.ID)
  110. }
  111. teamRepos[0] = repoIDs
  112. teamRepos[1] = repoIDs
  113. teamRepos[4] = repoIDs
  114. for i, team := range teams {
  115. testTeamRepositories(team.ID, teamRepos[i])
  116. }
  117. // Remove repo and check teams repositories.
  118. assert.NoError(t, DeleteRepositoryDirectly(db.DefaultContext, user, repoIDs[0]), "DeleteRepository")
  119. teamRepos[0] = repoIDs[1:]
  120. teamRepos[1] = repoIDs[1:]
  121. teamRepos[3] = repoIDs[1:3]
  122. teamRepos[4] = repoIDs[1:]
  123. for i, team := range teams {
  124. testTeamRepositories(team.ID, teamRepos[i])
  125. }
  126. // Wipe created items.
  127. for i, rid := range repoIDs {
  128. if i > 0 { // first repo already deleted.
  129. assert.NoError(t, DeleteRepositoryDirectly(db.DefaultContext, user, rid), "DeleteRepository %d", i)
  130. }
  131. }
  132. assert.NoError(t, organization.DeleteOrganization(db.DefaultContext, org), "DeleteOrganization")
  133. }