gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. // Copyright 2025 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package project
  4. import (
  5. "testing"
  6. "code.gitea.io/gitea/models/db"
  7. issues_model "code.gitea.io/gitea/models/issues"
  8. org_model "code.gitea.io/gitea/models/organization"
  9. project_model "code.gitea.io/gitea/models/project"
  10. repo_model "code.gitea.io/gitea/models/repo"
  11. "code.gitea.io/gitea/models/unittest"
  12. user_model "code.gitea.io/gitea/models/user"
  13. "github.com/stretchr/testify/assert"
  14. )
  15. func Test_Projects(t *testing.T) {
  16. assert.NoError(t, unittest.PrepareTestDatabase())
  17. userAdmin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
  18. user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  19. org3 := unittest.AssertExistsAndLoadBean(t, &org_model.Organization{ID: 3})
  20. user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
  21. t.Run("User projects", func(t *testing.T) {
  22. pi1 := project_model.ProjectIssue{
  23. ProjectID: 4,
  24. IssueID: 1,
  25. ProjectColumnID: 4,
  26. }
  27. err := db.Insert(t.Context(), &pi1)
  28. assert.NoError(t, err)
  29. defer func() {
  30. _, err = db.DeleteByID[project_model.ProjectIssue](t.Context(), pi1.ID)
  31. assert.NoError(t, err)
  32. }()
  33. pi2 := project_model.ProjectIssue{
  34. ProjectID: 4,
  35. IssueID: 4,
  36. ProjectColumnID: 4,
  37. }
  38. err = db.Insert(t.Context(), &pi2)
  39. assert.NoError(t, err)
  40. defer func() {
  41. _, err = db.DeleteByID[project_model.ProjectIssue](t.Context(), pi2.ID)
  42. assert.NoError(t, err)
  43. }()
  44. projects, err := db.Find[project_model.Project](t.Context(), project_model.SearchOptions{
  45. OwnerID: user2.ID,
  46. })
  47. assert.NoError(t, err)
  48. assert.Len(t, projects, 3)
  49. assert.EqualValues(t, 4, projects[0].ID)
  50. t.Run("Authenticated user", func(t *testing.T) {
  51. columnIssues, err := LoadIssuesFromProject(t.Context(), projects[0], &issues_model.IssuesOptions{
  52. Owner: user2,
  53. Doer: user2,
  54. })
  55. assert.NoError(t, err)
  56. assert.Len(t, columnIssues, 1) // 4 has 2 issues, 6 will not contains here because 0 issues
  57. assert.Len(t, columnIssues[4], 2) // user2 can visit both issues, one from public repository one from private repository
  58. })
  59. t.Run("Anonymous user", func(t *testing.T) {
  60. columnIssues, err := LoadIssuesFromProject(t.Context(), projects[0], &issues_model.IssuesOptions{
  61. AllPublic: true,
  62. })
  63. assert.NoError(t, err)
  64. assert.Len(t, columnIssues, 1)
  65. assert.Len(t, columnIssues[4], 1) // anonymous user can only visit public repo issues
  66. })
  67. t.Run("Authenticated user with no permission to the private repo", func(t *testing.T) {
  68. columnIssues, err := LoadIssuesFromProject(t.Context(), projects[0], &issues_model.IssuesOptions{
  69. Owner: user2,
  70. Doer: user4,
  71. })
  72. assert.NoError(t, err)
  73. assert.Len(t, columnIssues, 1)
  74. assert.Len(t, columnIssues[4], 1) // user4 can only visit public repo issues
  75. })
  76. })
  77. t.Run("Org projects", func(t *testing.T) {
  78. project1 := project_model.Project{
  79. Title: "project in an org",
  80. OwnerID: org3.ID,
  81. Type: project_model.TypeOrganization,
  82. TemplateType: project_model.TemplateTypeBasicKanban,
  83. }
  84. err := project_model.NewProject(t.Context(), &project1)
  85. assert.NoError(t, err)
  86. defer func() {
  87. err := project_model.DeleteProjectByID(t.Context(), project1.ID)
  88. assert.NoError(t, err)
  89. }()
  90. column1 := project_model.Column{
  91. Title: "column 1",
  92. ProjectID: project1.ID,
  93. }
  94. err = project_model.NewColumn(t.Context(), &column1)
  95. assert.NoError(t, err)
  96. column2 := project_model.Column{
  97. Title: "column 2",
  98. ProjectID: project1.ID,
  99. }
  100. err = project_model.NewColumn(t.Context(), &column2)
  101. assert.NoError(t, err)
  102. // issue 6 belongs to private repo 3 under org 3
  103. issue6 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 6})
  104. err = issues_model.IssueAssignOrRemoveProject(t.Context(), issue6, user2, project1.ID, column1.ID)
  105. assert.NoError(t, err)
  106. // issue 16 belongs to public repo 16 under org 3
  107. issue16 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 16})
  108. err = issues_model.IssueAssignOrRemoveProject(t.Context(), issue16, user2, project1.ID, column1.ID)
  109. assert.NoError(t, err)
  110. projects, err := db.Find[project_model.Project](t.Context(), project_model.SearchOptions{
  111. OwnerID: org3.ID,
  112. })
  113. assert.NoError(t, err)
  114. assert.Len(t, projects, 1)
  115. assert.Equal(t, project1.ID, projects[0].ID)
  116. t.Run("Authenticated user", func(t *testing.T) {
  117. columnIssues, err := LoadIssuesFromProject(t.Context(), projects[0], &issues_model.IssuesOptions{
  118. Owner: org3.AsUser(),
  119. Doer: userAdmin,
  120. })
  121. assert.NoError(t, err)
  122. assert.Len(t, columnIssues, 1) // column1 has 2 issues, 6 will not contains here because 0 issues
  123. assert.Len(t, columnIssues[column1.ID], 2) // user2 can visit both issues, one from public repository one from private repository
  124. })
  125. t.Run("Anonymous user", func(t *testing.T) {
  126. columnIssues, err := LoadIssuesFromProject(t.Context(), projects[0], &issues_model.IssuesOptions{
  127. AllPublic: true,
  128. })
  129. assert.NoError(t, err)
  130. assert.Len(t, columnIssues, 1)
  131. assert.Len(t, columnIssues[column1.ID], 1) // anonymous user can only visit public repo issues
  132. })
  133. t.Run("Authenticated user with no permission to the private repo", func(t *testing.T) {
  134. columnIssues, err := LoadIssuesFromProject(t.Context(), projects[0], &issues_model.IssuesOptions{
  135. Owner: org3.AsUser(),
  136. Doer: user2,
  137. })
  138. assert.NoError(t, err)
  139. assert.Len(t, columnIssues, 1)
  140. assert.Len(t, columnIssues[column1.ID], 1) // user4 can only visit public repo issues
  141. })
  142. })
  143. t.Run("Repository projects", func(t *testing.T) {
  144. repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  145. projects, err := db.Find[project_model.Project](t.Context(), project_model.SearchOptions{
  146. RepoID: repo1.ID,
  147. })
  148. assert.NoError(t, err)
  149. assert.Len(t, projects, 1)
  150. assert.EqualValues(t, 1, projects[0].ID)
  151. t.Run("Authenticated user", func(t *testing.T) {
  152. columnIssues, err := LoadIssuesFromProject(t.Context(), projects[0], &issues_model.IssuesOptions{
  153. RepoIDs: []int64{repo1.ID},
  154. Doer: userAdmin,
  155. })
  156. assert.NoError(t, err)
  157. assert.Len(t, columnIssues, 3)
  158. assert.Len(t, columnIssues[1], 2)
  159. assert.Len(t, columnIssues[2], 1)
  160. assert.Len(t, columnIssues[3], 1)
  161. })
  162. t.Run("Anonymous user", func(t *testing.T) {
  163. columnIssues, err := LoadIssuesFromProject(t.Context(), projects[0], &issues_model.IssuesOptions{
  164. AllPublic: true,
  165. })
  166. assert.NoError(t, err)
  167. assert.Len(t, columnIssues, 3)
  168. assert.Len(t, columnIssues[1], 2)
  169. assert.Len(t, columnIssues[2], 1)
  170. assert.Len(t, columnIssues[3], 1)
  171. })
  172. t.Run("Authenticated user with no permission to the private repo", func(t *testing.T) {
  173. columnIssues, err := LoadIssuesFromProject(t.Context(), projects[0], &issues_model.IssuesOptions{
  174. RepoIDs: []int64{repo1.ID},
  175. Doer: user2,
  176. })
  177. assert.NoError(t, err)
  178. assert.Len(t, columnIssues, 3)
  179. assert.Len(t, columnIssues[1], 2)
  180. assert.Len(t, columnIssues[2], 1)
  181. assert.Len(t, columnIssues[3], 1)
  182. })
  183. })
  184. }