aboutsummaryrefslogtreecommitdiffstats
path: root/tests/integration/pull_status_test.go
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2025-04-24 21:26:57 +0200
committerGitHub <noreply@github.com>2025-04-24 19:26:57 +0000
commita9343896f48e2e7e44b6b2d3c38080e134babe04 (patch)
tree4bd1a1a1f807eccd251d573acee03502db8d4dd6 /tests/integration/pull_status_test.go
parentd1ad8e1e809aad36e311b1132f5ac996d46f3a66 (diff)
downloadgitea-a9343896f48e2e7e44b6b2d3c38080e134babe04.tar.gz
gitea-a9343896f48e2e7e44b6b2d3c38080e134babe04.zip
Option to delay conflict checking of old pull requests until page view (#27779)
`[repository.pull-request] DELAY_CHECK_FOR_INACTIVE_DAYS` is a new setting to delay the mergeable check for pull requests that have been inactive for the specified number of days. This avoids potentially long delays for big repositories with many pull requests. and reduces system load overall when there are many repositories or pull requests. When viewing the PR, checking will start immediately and the PR merge box will automatically reload when complete. Accessing the PR through the API will also start checking immediately. The default value of `7` provides a balance between system load, and keeping behavior similar to what it was before both for users and API access. With `0` all conflict checking will be delayed, while `-1` always checks immediately to restore the previous behavior. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'tests/integration/pull_status_test.go')
-rw-r--r--tests/integration/pull_status_test.go76
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/integration/pull_status_test.go b/tests/integration/pull_status_test.go
index 63ffe94320..6d42d9f62f 100644
--- a/tests/integration/pull_status_test.go
+++ b/tests/integration/pull_status_test.go
@@ -13,9 +13,13 @@ import (
auth_model "code.gitea.io/gitea/models/auth"
git_model "code.gitea.io/gitea/models/git"
+ "code.gitea.io/gitea/models/issues"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
+ "code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
+ "code.gitea.io/gitea/modules/test"
+ "code.gitea.io/gitea/services/pull"
"github.com/stretchr/testify/assert"
)
@@ -165,3 +169,75 @@ func TestPullCreate_EmptyChangesWithSameCommits(t *testing.T) {
assert.Contains(t, text, "This branch is already included in the target branch. There is nothing to merge.")
})
}
+
+func TestPullStatusDelayCheck(t *testing.T) {
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ defer test.MockVariableValue(&setting.IsProd)()
+ defer test.MockVariableValue(&setting.Repository.PullRequest.DelayCheckForInactiveDays, 1)()
+ defer test.MockVariableValue(&pull.AddPullRequestToCheckQueue)()
+
+ session := loginUser(t, "user2")
+
+ run := func(t *testing.T, fn func(*testing.T)) (issue3 *issues.Issue, checkedPrID int64) {
+ pull.AddPullRequestToCheckQueue = func(prID int64) {
+ checkedPrID = prID
+ }
+ fn(t)
+ issue3 = unittest.AssertExistsAndLoadBean(t, &issues.Issue{RepoID: 1, Index: 3})
+ _ = issue3.LoadPullRequest(t.Context())
+ return issue3, checkedPrID
+ }
+
+ assertReloadingInterval := func(t *testing.T, interval string) {
+ req := NewRequest(t, "GET", "/user2/repo1/pulls/3")
+ resp := session.MakeRequest(t, req, http.StatusOK)
+ attr := "data-pull-merge-box-reloading-interval"
+ if interval == "" {
+ assert.NotContains(t, resp.Body.String(), attr)
+ } else {
+ assert.Contains(t, resp.Body.String(), fmt.Sprintf(`%s="%v"`, attr, interval))
+ }
+ }
+
+ // PR issue3 is merageable at the beginning
+ issue3, checkedPrID := run(t, func(t *testing.T) {})
+ assert.Equal(t, issues.PullRequestStatusMergeable, issue3.PullRequest.Status)
+ assert.Zero(t, checkedPrID)
+ setting.IsProd = true
+ assertReloadingInterval(t, "") // the PR is mergeable, so no need to reload the merge box
+ setting.IsProd = false
+ assertReloadingInterval(t, "1") // make sure dev mode always do merge box reloading, to make sure the UI logic won't break
+ setting.IsProd = true
+
+ // when base branch changes, PR status should be updated, but it is inactive for long time, so no real check
+ issue3, checkedPrID = run(t, func(t *testing.T) {
+ testEditFile(t, session, "user2", "repo1", "master", "README.md", "new content 1")
+ })
+ assert.Equal(t, issues.PullRequestStatusChecking, issue3.PullRequest.Status)
+ assert.Zero(t, checkedPrID)
+ assertReloadingInterval(t, "2000") // the PR status is "checking", so try to reload the merge box
+
+ // view a PR with status=checking, it starts the real check
+ issue3, checkedPrID = run(t, func(t *testing.T) {
+ req := NewRequest(t, "GET", "/user2/repo1/pulls/3")
+ session.MakeRequest(t, req, http.StatusOK)
+ })
+ assert.Equal(t, issues.PullRequestStatusChecking, issue3.PullRequest.Status)
+ assert.Equal(t, issue3.PullRequest.ID, checkedPrID)
+
+ // when base branch changes, still so no real check
+ issue3, checkedPrID = run(t, func(t *testing.T) {
+ testEditFile(t, session, "user2", "repo1", "master", "README.md", "new content 2")
+ })
+ assert.Equal(t, issues.PullRequestStatusChecking, issue3.PullRequest.Status)
+ assert.Zero(t, checkedPrID)
+
+ // then allow to check PRs without delay, when base branch changes, the PRs will be checked
+ setting.Repository.PullRequest.DelayCheckForInactiveDays = -1
+ issue3, checkedPrID = run(t, func(t *testing.T) {
+ testEditFile(t, session, "user2", "repo1", "master", "README.md", "new content 3")
+ })
+ assert.Equal(t, issues.PullRequestStatusChecking, issue3.PullRequest.Status)
+ assert.Equal(t, issue3.PullRequest.ID, checkedPrID)
+ })
+}