loading up the forgejo repo on tangled to test page performance
1// Copyright 2024 The Forgejo Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package integration
5
6import (
7 "fmt"
8 "net/http"
9 "net/url"
10 "os"
11 "path"
12 "strings"
13 "testing"
14 "time"
15
16 "forgejo.org/models/db"
17 issues_model "forgejo.org/models/issues"
18 repo_model "forgejo.org/models/repo"
19 unit_model "forgejo.org/models/unit"
20 "forgejo.org/models/unittest"
21 user_model "forgejo.org/models/user"
22 "forgejo.org/modules/git"
23 files_service "forgejo.org/services/repository/files"
24 "forgejo.org/tests"
25
26 "github.com/stretchr/testify/require"
27)
28
29func TestCodeOwner(t *testing.T) {
30 onGiteaRun(t, func(t *testing.T, u *url.URL) {
31 user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
32
33 // Create the repo.
34 repo, _, f := tests.CreateDeclarativeRepo(t, user2, "",
35 []unit_model.Type{unit_model.TypePullRequests}, nil,
36 []*files_service.ChangeRepoFile{
37 {
38 Operation: "create",
39 TreePath: "CODEOWNERS",
40 ContentReader: strings.NewReader("README.md @user5\ntest-file @user4"),
41 },
42 },
43 )
44 defer f()
45
46 dstPath := t.TempDir()
47 r := fmt.Sprintf("%suser2/%s.git", u.String(), repo.Name)
48 cloneURL, _ := url.Parse(r)
49 cloneURL.User = url.UserPassword("user2", userPassword)
50 require.NoError(t, git.CloneWithArgs(t.Context(), nil, cloneURL.String(), dstPath, git.CloneRepoOptions{}))
51
52 t.Run("Normal", func(t *testing.T) {
53 defer tests.PrintCurrentTest(t)()
54
55 err := os.WriteFile(path.Join(dstPath, "README.md"), []byte("## test content"), 0o666)
56 require.NoError(t, err)
57
58 err = git.AddChanges(dstPath, true)
59 require.NoError(t, err)
60
61 err = git.CommitChanges(dstPath, git.CommitChangesOptions{
62 Committer: &git.Signature{
63 Email: "user2@example.com",
64 Name: "user2",
65 When: time.Now(),
66 },
67 Author: &git.Signature{
68 Email: "user2@example.com",
69 Name: "user2",
70 When: time.Now(),
71 },
72 Message: "Add README.",
73 })
74 require.NoError(t, err)
75
76 err = git.NewCommand(git.DefaultContext, "push", "origin", "HEAD:refs/for/main", "-o", "topic=codeowner-normal").Run(&git.RunOpts{Dir: dstPath})
77 require.NoError(t, err)
78
79 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-normal"})
80 unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5})
81 })
82
83 t.Run("Forked repository", func(t *testing.T) {
84 defer tests.PrintCurrentTest(t)()
85
86 session := loginUser(t, "user1")
87 testRepoFork(t, session, user2.Name, repo.Name, "user1", "repo1")
88
89 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user1", Name: "repo1"})
90
91 r := fmt.Sprintf("%suser1/repo1.git", u.String())
92 remoteURL, _ := url.Parse(r)
93 remoteURL.User = url.UserPassword("user2", userPassword)
94 doGitAddRemote(dstPath, "forked", remoteURL)(t)
95
96 err := git.NewCommand(git.DefaultContext, "push", "forked", "HEAD:refs/for/main", "-o", "topic=codeowner-forked").Run(&git.RunOpts{Dir: dstPath})
97 require.NoError(t, err)
98
99 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-forked"})
100 unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5})
101 })
102
103 t.Run("Out of date", func(t *testing.T) {
104 defer tests.PrintCurrentTest(t)()
105
106 // Push the changes made from the previous subtest.
107 require.NoError(t, git.NewCommand(git.DefaultContext, "push", "origin").Run(&git.RunOpts{Dir: dstPath}))
108
109 // Reset the tree to the previous commit.
110 require.NoError(t, git.NewCommand(git.DefaultContext, "reset", "--hard", "HEAD~1").Run(&git.RunOpts{Dir: dstPath}))
111
112 err := os.WriteFile(path.Join(dstPath, "test-file"), []byte("## test content"), 0o666)
113 require.NoError(t, err)
114
115 err = git.AddChanges(dstPath, true)
116 require.NoError(t, err)
117
118 err = git.CommitChanges(dstPath, git.CommitChangesOptions{
119 Committer: &git.Signature{
120 Email: "user2@example.com",
121 Name: "user2",
122 When: time.Now(),
123 },
124 Author: &git.Signature{
125 Email: "user2@example.com",
126 Name: "user2",
127 When: time.Now(),
128 },
129 Message: "Add test-file.",
130 })
131 require.NoError(t, err)
132
133 err = git.NewCommand(git.DefaultContext, "push", "origin", "HEAD:refs/for/main", "-o", "topic=codeowner-out-of-date").Run(&git.RunOpts{Dir: dstPath})
134 require.NoError(t, err)
135
136 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-out-of-date"})
137 unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 4})
138 unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5})
139 })
140 t.Run("From a forked repository", func(t *testing.T) {
141 defer tests.PrintCurrentTest(t)()
142
143 session := loginUser(t, "user1")
144
145 r := fmt.Sprintf("%suser1/repo1.git", u.String())
146 remoteURL, _ := url.Parse(r)
147 remoteURL.User = url.UserPassword("user1", userPassword)
148 doGitAddRemote(dstPath, "forked-2", remoteURL)(t)
149
150 err := git.NewCommand(git.DefaultContext, "push", "forked-2", "HEAD:branch").Run(&git.RunOpts{Dir: dstPath})
151 require.NoError(t, err)
152
153 req := NewRequestWithValues(t, "POST", repo.FullName()+"/compare/main...user1/repo1:branch", map[string]string{
154 "_csrf": GetCSRF(t, session, repo.FullName()+"/compare/main...user1/repo1:branch"),
155 "title": "pull request",
156 })
157 session.MakeRequest(t, req, http.StatusOK)
158
159 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "branch"})
160 unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 4})
161 })
162
163 t.Run("Codeowner user with no permission", func(t *testing.T) {
164 defer tests.PrintCurrentTest(t)()
165
166 // Make repository private, only user2 (owner of repository) has now access to this repository.
167 repo.IsPrivate = true
168 _, err := db.GetEngine(db.DefaultContext).Cols("is_private").Update(repo)
169 require.NoError(t, err)
170
171 err = os.WriteFile(path.Join(dstPath, "README.md"), []byte("## very sensitive info"), 0o666)
172 require.NoError(t, err)
173
174 err = git.AddChanges(dstPath, true)
175 require.NoError(t, err)
176
177 err = git.CommitChanges(dstPath, git.CommitChangesOptions{
178 Committer: &git.Signature{
179 Email: "user2@example.com",
180 Name: "user2",
181 When: time.Now(),
182 },
183 Author: &git.Signature{
184 Email: "user2@example.com",
185 Name: "user2",
186 When: time.Now(),
187 },
188 Message: "Add secrets to the README.",
189 })
190 require.NoError(t, err)
191
192 err = git.NewCommand(git.DefaultContext, "push", "origin", "HEAD:refs/for/main", "-o", "topic=codeowner-private").Run(&git.RunOpts{Dir: dstPath})
193 require.NoError(t, err)
194
195 // In CODEOWNERS file the codeowner for README.md is user5, but does not have access to this private repository.
196 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "user2/codeowner-private"})
197 unittest.AssertExistsIf(t, false, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5})
198 })
199 })
200}