loading up the forgejo repo on tangled to test page performance
at forgejo 200 lines 7.4 kB view raw
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}