From 0e1e120610a2d0d76c3956f1e7e480fee6874831 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Mon, 5 Feb 2024 16:57:39 +0800 Subject: [PATCH 01/26] add CanDoerChangeReviewRequests --- routers/web/repo/issue.go | 11 +++++++++++ services/issue/assignee.go | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index c8c9924a9eb77..9966fe942ff24 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -765,6 +765,11 @@ func RetrieveRepoReviewers(ctx *context.Context, repo *repo_model.Repository, is ctx.Data["PullReviewers"] = currentPullReviewers } + canDoerChangeReviewRequests := false + if ctx.Doer != nil { + canDoerChangeReviewRequests = issue_service.CanDoerChangeReviewRequests(ctx, ctx.Doer, repo, issue) + } + if canChooseReviewer && reviewersResult != nil { preadded := len(reviewersResult) for _, reviewer := range reviewers { @@ -790,6 +795,12 @@ func RetrieveRepoReviewers(ctx *context.Context, repo *repo_model.Repository, is }) } + if canDoerChangeReviewRequests { + for _, item := range reviewersResult { + item.CanChange = true + } + } + ctx.Data["Reviewers"] = reviewersResult } diff --git a/services/issue/assignee.go b/services/issue/assignee.go index 27fc695533e3a..ef224abd2c95e 100644 --- a/services/issue/assignee.go +++ b/services/issue/assignee.go @@ -10,6 +10,7 @@ import ( "code.gitea.io/gitea/models/organization" "code.gitea.io/gitea/models/perm" access_model "code.gitea.io/gitea/models/perm/access" + repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/log" @@ -154,6 +155,9 @@ func IsValidReviewRequest(ctx context.Context, reviewer, doer *user_model.User, } } } else { + if CanDoerChangeReviewRequests(ctx, doer, issue.Repo, issue) { + return nil + } if lastreview != nil && lastreview.Type == issues_model.ReviewTypeRequest && lastreview.ReviewerID == doer.ID { return nil } @@ -264,3 +268,22 @@ func TeamReviewRequest(ctx context.Context, issue *issues_model.Issue, doer *use return comment, err } + +// CanDoerChangeReviewRequests returns if the doer can change all review requests of a PR +func CanDoerChangeReviewRequests(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue) bool { + if doer != nil && doer.ID == issue.PosterID { + // The poster of the PR can change the reviewers + return true + } + + // Collaborators of the repo can change the reviewers + isCollaborator, err := repo_model.IsCollaborator(ctx, repo.ID, doer.ID) + if err != nil { + log.Error("IsCollaborator: %v", err) + } + if isCollaborator { + return true + } + + return false +} From 576f61f3f6d9df11fade161ca09da3013dd2b027 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Mon, 5 Feb 2024 18:10:20 +0800 Subject: [PATCH 02/26] check team members --- routers/web/repo/issue.go | 2 +- services/issue/assignee.go | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 9966fe942ff24..3ce3e36d9b0e1 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1539,7 +1539,7 @@ func ViewIssue(ctx *context.Context) { canChooseReviewer := ctx.Repo.CanWrite(unit.TypePullRequests) if ctx.Doer != nil && ctx.IsSigned { if !canChooseReviewer { - canChooseReviewer = ctx.Doer.ID == issue.PosterID + canChooseReviewer = issue_service.CanDoerChangeReviewRequests(ctx, ctx.Doer, repo, issue) } if !canChooseReviewer { canChooseReviewer, err = issues_model.IsOfficialReviewer(ctx, issue, ctx.Doer) diff --git a/services/issue/assignee.go b/services/issue/assignee.go index ef224abd2c95e..4c2d10a654622 100644 --- a/services/issue/assignee.go +++ b/services/issue/assignee.go @@ -280,10 +280,30 @@ func CanDoerChangeReviewRequests(ctx context.Context, doer *user_model.User, rep isCollaborator, err := repo_model.IsCollaborator(ctx, repo.ID, doer.ID) if err != nil { log.Error("IsCollaborator: %v", err) + return false } if isCollaborator { return true } + if repo.Owner.IsOrganization() { + // If the repo's owner is an organization, members of teams with read permission can change reviewers + teams, err := organization.GetTeamsWithAccessToRepo(ctx, repo.OwnerID, repo.ID, perm.AccessModeRead) + if err != nil { + log.Error("GetTeamsWithAccessToRepo: %v", err) + return false + } + for _, team := range teams { + isMember, err := organization.IsTeamMember(ctx, repo.OwnerID, team.ID, doer.ID) + if err != nil { + log.Error("IsTeamMember: %v", err) + continue + } + if isMember { + return true + } + } + } + return false } From b254cbf9f28fa4d70b14063ef5401e7eba42842c Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Tue, 6 Feb 2024 15:26:11 +0800 Subject: [PATCH 03/26] update CanDoerChangeReviewRequests --- routers/web/repo/issue.go | 27 +++------------- services/issue/assignee.go | 63 ++++++++++++++++---------------------- 2 files changed, 31 insertions(+), 59 deletions(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 3ce3e36d9b0e1..7d4f87ffae450 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -711,16 +711,15 @@ func RetrieveRepoReviewers(ctx *context.Context, repo *repo_model.Repository, is tmp.ItemID = -review.ReviewerTeamID } - if ctx.Repo.IsAdmin() { + if canChooseReviewer { + // Users who can choose reviewers can also change reviewers + tmp.CanChange = true + } else if ctx.Repo.IsAdmin() { // Admin can dismiss or re-request any review requests tmp.CanChange = true } else if ctx.Doer != nil && ctx.Doer.ID == review.ReviewerID && review.Type == issues_model.ReviewTypeRequest { // A user can refuse review requests tmp.CanChange = true - } else if (canChooseReviewer || (ctx.Doer != nil && ctx.Doer.ID == issue.PosterID)) && review.Type != issues_model.ReviewTypeRequest && - ctx.Doer.ID != review.ReviewerID { - // The poster of the PR, a manager, or official reviewers can re-request review from other reviewers - tmp.CanChange = true } pullReviews = append(pullReviews, tmp) @@ -765,11 +764,6 @@ func RetrieveRepoReviewers(ctx *context.Context, repo *repo_model.Repository, is ctx.Data["PullReviewers"] = currentPullReviewers } - canDoerChangeReviewRequests := false - if ctx.Doer != nil { - canDoerChangeReviewRequests = issue_service.CanDoerChangeReviewRequests(ctx, ctx.Doer, repo, issue) - } - if canChooseReviewer && reviewersResult != nil { preadded := len(reviewersResult) for _, reviewer := range reviewers { @@ -795,12 +789,6 @@ func RetrieveRepoReviewers(ctx *context.Context, repo *repo_model.Repository, is }) } - if canDoerChangeReviewRequests { - for _, item := range reviewersResult { - item.CanChange = true - } - } - ctx.Data["Reviewers"] = reviewersResult } @@ -1541,13 +1529,6 @@ func ViewIssue(ctx *context.Context) { if !canChooseReviewer { canChooseReviewer = issue_service.CanDoerChangeReviewRequests(ctx, ctx.Doer, repo, issue) } - if !canChooseReviewer { - canChooseReviewer, err = issues_model.IsOfficialReviewer(ctx, issue, ctx.Doer) - if err != nil { - ctx.ServerError("IsOfficialReviewer", err) - return - } - } } RetrieveRepoReviewers(ctx, repo, issue, canChooseReviewer) diff --git a/services/issue/assignee.go b/services/issue/assignee.go index 4c2d10a654622..d1190f106e195 100644 --- a/services/issue/assignee.go +++ b/services/issue/assignee.go @@ -114,10 +114,10 @@ func IsValidReviewRequest(ctx context.Context, reviewer, doer *user_model.User, return err } - var pemResult bool + canDoerChangeReviewRequests := CanDoerChangeReviewRequests(ctx, doer, issue.Repo, issue) + if isAdd { - pemResult = permReviewer.CanAccessAny(perm.AccessModeRead, unit.TypePullRequests) - if !pemResult { + if !permReviewer.CanAccessAny(perm.AccessModeRead, unit.TypePullRequests) { return issues_model.ErrNotValidReviewRequest{ Reason: "Reviewer can't read", UserID: doer.ID, @@ -125,28 +125,6 @@ func IsValidReviewRequest(ctx context.Context, reviewer, doer *user_model.User, } } - if doer.ID == issue.PosterID && issue.OriginalAuthorID == 0 && lastreview != nil && lastreview.Type != issues_model.ReviewTypeRequest { - return nil - } - - pemResult = doer.ID == issue.PosterID - if !pemResult { - pemResult = permDoer.CanAccessAny(perm.AccessModeWrite, unit.TypePullRequests) - } - if !pemResult { - pemResult, err = issues_model.IsOfficialReviewer(ctx, issue, doer) - if err != nil { - return err - } - if !pemResult { - return issues_model.ErrNotValidReviewRequest{ - Reason: "Doer can't choose reviewer", - UserID: doer.ID, - RepoID: issue.Repo.ID, - } - } - } - if reviewer.ID == issue.PosterID && issue.OriginalAuthorID == 0 { return issues_model.ErrNotValidReviewRequest{ Reason: "poster of pr can't be reviewer", @@ -154,25 +132,35 @@ func IsValidReviewRequest(ctx context.Context, reviewer, doer *user_model.User, RepoID: issue.Repo.ID, } } + + if canDoerChangeReviewRequests { + return nil + } + + if doer.ID == issue.PosterID && issue.OriginalAuthorID == 0 && lastreview != nil && lastreview.Type != issues_model.ReviewTypeRequest { + return nil + } + + return issues_model.ErrNotValidReviewRequest{ + Reason: "Doer can't choose reviewer", + UserID: doer.ID, + RepoID: issue.Repo.ID, + } } else { - if CanDoerChangeReviewRequests(ctx, doer, issue.Repo, issue) { + if canDoerChangeReviewRequests { return nil } + if lastreview != nil && lastreview.Type == issues_model.ReviewTypeRequest && lastreview.ReviewerID == doer.ID { return nil } - pemResult = permDoer.IsAdmin() - if !pemResult { - return issues_model.ErrNotValidReviewRequest{ - Reason: "Doer is not admin", - UserID: doer.ID, - RepoID: issue.Repo.ID, - } + return issues_model.ErrNotValidReviewRequest{ + Reason: "Doer can't remove reviewer", + UserID: doer.ID, + RepoID: issue.Repo.ID, } } - - return nil } // IsValidTeamReviewRequest Check permission for ReviewRequest Team @@ -287,13 +275,16 @@ func CanDoerChangeReviewRequests(ctx context.Context, doer *user_model.User, rep } if repo.Owner.IsOrganization() { - // If the repo's owner is an organization, members of teams with read permission can change reviewers + // If the repo's owner is an organization, members of teams with read permission on pull requests can change reviewers teams, err := organization.GetTeamsWithAccessToRepo(ctx, repo.OwnerID, repo.ID, perm.AccessModeRead) if err != nil { log.Error("GetTeamsWithAccessToRepo: %v", err) return false } for _, team := range teams { + if !team.UnitEnabled(ctx, unit.TypePullRequests) { + continue + } isMember, err := organization.IsTeamMember(ctx, repo.OwnerID, team.ID, doer.ID) if err != nil { log.Error("IsTeamMember: %v", err) From 90d5ae6bc5364bd130f5730356bfde94d7dba71c Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Tue, 6 Feb 2024 15:33:15 +0800 Subject: [PATCH 04/26] assign canChooseReviewer with CanDoerChangeReviewRequests --- routers/web/repo/issue.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 7d4f87ffae450..c81e258d66d97 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1524,11 +1524,9 @@ func ViewIssue(ctx *context.Context) { } if issue.IsPull { - canChooseReviewer := ctx.Repo.CanWrite(unit.TypePullRequests) + canChooseReviewer := false if ctx.Doer != nil && ctx.IsSigned { - if !canChooseReviewer { - canChooseReviewer = issue_service.CanDoerChangeReviewRequests(ctx, ctx.Doer, repo, issue) - } + canChooseReviewer = issue_service.CanDoerChangeReviewRequests(ctx, ctx.Doer, repo, issue) } RetrieveRepoReviewers(ctx, repo, issue, canChooseReviewer) From b731818198d2c1d674f7ff2dbc6ad26ef8d92fe8 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Tue, 6 Feb 2024 17:01:19 +0800 Subject: [PATCH 05/26] remove some unused checks --- routers/web/repo/issue.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index c81e258d66d97..4564d854491ad 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -712,10 +712,7 @@ func RetrieveRepoReviewers(ctx *context.Context, repo *repo_model.Repository, is } if canChooseReviewer { - // Users who can choose reviewers can also change reviewers - tmp.CanChange = true - } else if ctx.Repo.IsAdmin() { - // Admin can dismiss or re-request any review requests + // Users who can choose reviewers can also remove review requests tmp.CanChange = true } else if ctx.Doer != nil && ctx.Doer.ID == review.ReviewerID && review.Type == issues_model.ReviewTypeRequest { // A user can refuse review requests From 63a7c935a61fd818e7c5b42202143958853023b5 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Tue, 6 Feb 2024 17:15:57 +0800 Subject: [PATCH 06/26] some fixes --- services/issue/assignee.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/issue/assignee.go b/services/issue/assignee.go index d1190f106e195..b58526b4b555d 100644 --- a/services/issue/assignee.go +++ b/services/issue/assignee.go @@ -257,10 +257,10 @@ func TeamReviewRequest(ctx context.Context, issue *issues_model.Issue, doer *use return comment, err } -// CanDoerChangeReviewRequests returns if the doer can change all review requests of a PR +// CanDoerChangeReviewRequests returns if the doer can add/remove review requests of a PR func CanDoerChangeReviewRequests(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue) bool { - if doer != nil && doer.ID == issue.PosterID { - // The poster of the PR can change the reviewers + // The poster of the PR can change the reviewers + if doer.ID == issue.PosterID { return true } @@ -274,8 +274,8 @@ func CanDoerChangeReviewRequests(ctx context.Context, doer *user_model.User, rep return true } + // If the repo's owner is an organization, members of teams with read permission on pull requests can change reviewers if repo.Owner.IsOrganization() { - // If the repo's owner is an organization, members of teams with read permission on pull requests can change reviewers teams, err := organization.GetTeamsWithAccessToRepo(ctx, repo.OwnerID, repo.ID, perm.AccessModeRead) if err != nil { log.Error("GetTeamsWithAccessToRepo: %v", err) From ddefef7c43fb410d89f414933aff2a0ed10bb2dc Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Tue, 6 Feb 2024 18:03:23 +0800 Subject: [PATCH 07/26] fix lint --- services/issue/assignee.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/services/issue/assignee.go b/services/issue/assignee.go index b58526b4b555d..4b432a660b476 100644 --- a/services/issue/assignee.go +++ b/services/issue/assignee.go @@ -146,20 +146,20 @@ func IsValidReviewRequest(ctx context.Context, reviewer, doer *user_model.User, UserID: doer.ID, RepoID: issue.Repo.ID, } - } else { - if canDoerChangeReviewRequests { - return nil - } + } - if lastreview != nil && lastreview.Type == issues_model.ReviewTypeRequest && lastreview.ReviewerID == doer.ID { - return nil - } + if canDoerChangeReviewRequests { + return nil + } - return issues_model.ErrNotValidReviewRequest{ - Reason: "Doer can't remove reviewer", - UserID: doer.ID, - RepoID: issue.Repo.ID, - } + if lastreview != nil && lastreview.Type == issues_model.ReviewTypeRequest && lastreview.ReviewerID == doer.ID { + return nil + } + + return issues_model.ErrNotValidReviewRequest{ + Reason: "Doer can't remove reviewer", + UserID: doer.ID, + RepoID: issue.Repo.ID, } } From a1269e8f975b6d56adb490e5214efae98d19230e Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Tue, 6 Feb 2024 18:36:30 +0800 Subject: [PATCH 08/26] fix owner check --- services/issue/assignee.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/issue/assignee.go b/services/issue/assignee.go index 4b432a660b476..43e41e25fa006 100644 --- a/services/issue/assignee.go +++ b/services/issue/assignee.go @@ -264,6 +264,11 @@ func CanDoerChangeReviewRequests(ctx context.Context, doer *user_model.User, rep return true } + // The owner of the repo can change the reviewers + if doer.ID == repo.OwnerID { + return true + } + // Collaborators of the repo can change the reviewers isCollaborator, err := repo_model.IsCollaborator(ctx, repo.ID, doer.ID) if err != nil { From 2bcec5377fa5701c2ca2910fabc29e54b9a9e179 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 10:43:42 +0800 Subject: [PATCH 09/26] add tests --- models/fixtures/collaboration.yml | 6 +++++ models/fixtures/issue.yml | 17 +++++++++++++ models/fixtures/pull_request.yml | 13 ++++++++++ tests/integration/api_pull_review_test.go | 29 +++++++++++++++++++++++ 4 files changed, 65 insertions(+) diff --git a/models/fixtures/collaboration.yml b/models/fixtures/collaboration.yml index ef77d22b24950..5d3a69230f6c2 100644 --- a/models/fixtures/collaboration.yml +++ b/models/fixtures/collaboration.yml @@ -45,3 +45,9 @@ repo_id: 22 user_id: 18 mode: 2 # write + +- + id: 9 + repo_id: 1 + user_id: 5 + mode: 1 # read diff --git a/models/fixtures/issue.yml b/models/fixtures/issue.yml index 0c9b6ff4060fe..1f246f363498b 100644 --- a/models/fixtures/issue.yml +++ b/models/fixtures/issue.yml @@ -338,3 +338,20 @@ created_unix: 978307210 updated_unix: 978307210 is_locked: false + +- + id: 21 + repo_id: 1 + index: 6 + poster_id: 4 + original_author_id: 0 + name: pull6 + content: content for the 6th issue + milestone_id: 0 + priority: 0 + is_closed: false + is_pull: true + num_comments: 0 + created_unix: 1707270422 + updated_unix: 1707270422 + is_locked: false diff --git a/models/fixtures/pull_request.yml b/models/fixtures/pull_request.yml index 560674c370b81..28790cc2c2093 100644 --- a/models/fixtures/pull_request.yml +++ b/models/fixtures/pull_request.yml @@ -98,3 +98,16 @@ index: 1 head_repo_id: 23 base_repo_id: 23 + +- + id: 9 + type: 0 # gitea pull request + status: 2 # mergable + issue_id: 21 + index: 6 + head_repo_id: 1 + base_repo_id: 1 + head_branch: branch2 + base_branch: master + merge_base: 4a357436d925b5c974181ff12a994538ddc5a269 + has_merged: false diff --git a/tests/integration/api_pull_review_test.go b/tests/integration/api_pull_review_test.go index daa136b21e45c..7f6b1cd257167 100644 --- a/tests/integration/api_pull_review_test.go +++ b/tests/integration/api_pull_review_test.go @@ -276,6 +276,35 @@ func TestAPIPullReviewRequest(t *testing.T) { }).AddTokenAuth(token) MakeRequest(t, req, http.StatusNoContent) + // a collaborator can add/remove a review request + user5Session := loginUser(t, "user5") + user5Token := getTokenForLoggedInUser(t, user5Session, auth_model.AccessTokenScopeWriteRepository) + req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", repo.OwnerName, repo.Name, pullIssue.Index), &api.PullReviewRequestOptions{ + Reviewers: []string{"user4@example.com"}, + }).AddTokenAuth(user5Token) + MakeRequest(t, req, http.StatusCreated) + + req = NewRequestWithJSON(t, http.MethodDelete, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", repo.OwnerName, repo.Name, pullIssue.Index), &api.PullReviewRequestOptions{ + Reviewers: []string{"user4@example.com"}, + }).AddTokenAuth(user5Token) + MakeRequest(t, req, http.StatusNoContent) + + // the poster of the PR can add/remove a review request + user4Session := loginUser(t, "user4") + user4Token := getTokenForLoggedInUser(t, user4Session, auth_model.AccessTokenScopeWriteRepository) + pullIssue21 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 21}) + assert.NoError(t, pullIssue21.LoadAttributes(db.DefaultContext)) + pull21Repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: pullIssue21.RepoID}) // repo1 + req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", pull21Repo.OwnerName, pull21Repo.Name, pullIssue21.Index), &api.PullReviewRequestOptions{ + Reviewers: []string{"user8"}, + }).AddTokenAuth(user4Token) + MakeRequest(t, req, http.StatusCreated) + + req = NewRequestWithJSON(t, http.MethodDelete, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", pull21Repo.OwnerName, pull21Repo.Name, pullIssue21.Index), &api.PullReviewRequestOptions{ + Reviewers: []string{"user8"}, + }).AddTokenAuth(user4Token) + MakeRequest(t, req, http.StatusNoContent) + // Test team review request pullIssue12 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 12}) assert.NoError(t, pullIssue12.LoadAttributes(db.DefaultContext)) From 1f573013d6ab69ca6bc9b40a1f47b58bb2bbba7b Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 11:42:54 +0800 Subject: [PATCH 10/26] fix fixtures --- models/fixtures/collaboration.yml | 6 +- models/fixtures/email_address.yml | 24 ++++ models/fixtures/issue.yml | 10 +- models/fixtures/pull_request.yml | 10 +- models/fixtures/repo_unit.yml | 21 ++++ models/fixtures/repository.yml | 31 +++++ models/fixtures/user.yml | 111 ++++++++++++++++++ .../user37/repo60.git/HEAD | 1 + .../user37/repo60.git/config | 6 + .../user37/repo60.git/description | 1 + .../user37/repo60.git/info/exclude | 6 + tests/integration/api_pull_review_test.go | 26 ++-- 12 files changed, 225 insertions(+), 28 deletions(-) create mode 100644 tests/gitea-repositories-meta/user37/repo60.git/HEAD create mode 100644 tests/gitea-repositories-meta/user37/repo60.git/config create mode 100644 tests/gitea-repositories-meta/user37/repo60.git/description create mode 100644 tests/gitea-repositories-meta/user37/repo60.git/info/exclude diff --git a/models/fixtures/collaboration.yml b/models/fixtures/collaboration.yml index 5d3a69230f6c2..7603bdad32c7d 100644 --- a/models/fixtures/collaboration.yml +++ b/models/fixtures/collaboration.yml @@ -48,6 +48,6 @@ - id: 9 - repo_id: 1 - user_id: 5 - mode: 1 # read + repo_id: 60 + user_id: 38 + mode: 2 # write diff --git a/models/fixtures/email_address.yml b/models/fixtures/email_address.yml index ce4d5208df393..5dba18b10fce8 100644 --- a/models/fixtures/email_address.yml +++ b/models/fixtures/email_address.yml @@ -285,3 +285,27 @@ lower_email: abcde@gitea.com is_activated: true is_primary: false + +- + id: 37 + uid: 37 + email: user37@example.com + lower_email: user37@example.com + is_activated: true + is_primary: true + +- + id: 38 + uid: 38 + email: user38@example.com + lower_email: user38@example.com + is_activated: true + is_primary: true + +- + id: 39 + uid: 39 + email: user39@example.com + lower_email: user39@example.com + is_activated: true + is_primary: true diff --git a/models/fixtures/issue.yml b/models/fixtures/issue.yml index 1f246f363498b..7b317305a62d6 100644 --- a/models/fixtures/issue.yml +++ b/models/fixtures/issue.yml @@ -341,12 +341,12 @@ - id: 21 - repo_id: 1 - index: 6 - poster_id: 4 + repo_id: 60 + index: 1 + poster_id: 39 original_author_id: 0 - name: pull6 - content: content for the 6th issue + name: pull1 + content: content for the 1st issue milestone_id: 0 priority: 0 is_closed: false diff --git a/models/fixtures/pull_request.yml b/models/fixtures/pull_request.yml index 28790cc2c2093..5802ac7e032b5 100644 --- a/models/fixtures/pull_request.yml +++ b/models/fixtures/pull_request.yml @@ -104,10 +104,6 @@ type: 0 # gitea pull request status: 2 # mergable issue_id: 21 - index: 6 - head_repo_id: 1 - base_repo_id: 1 - head_branch: branch2 - base_branch: master - merge_base: 4a357436d925b5c974181ff12a994538ddc5a269 - has_merged: false + index: 1 + head_repo_id: 60 + base_repo_id: 60 diff --git a/models/fixtures/repo_unit.yml b/models/fixtures/repo_unit.yml index e6c59f527a4df..34dd0a2da52a8 100644 --- a/models/fixtures/repo_unit.yml +++ b/models/fixtures/repo_unit.yml @@ -676,3 +676,24 @@ type: 1 config: "{}" created_unix: 946684810 + +- + id: 102 + repo_id: 60 + type: 1 + config: "{}" + created_unix: 946684810 + +- + id: 103 + repo_id: 60 + type: 2 + config: "{\"EnableTimetracker\":true,\"AllowOnlyContributorsToTrackTime\":true}" + created_unix: 946684810 + +- + id: 104 + repo_id: 60 + type: 3 + config: "{\"IgnoreWhitespaceConflicts\":false,\"AllowMerge\":true,\"AllowRebase\":true,\"AllowRebaseMerge\":true,\"AllowSquash\":true}" + created_unix: 946684810 diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index f4e837673541d..4dc96bfbaa17c 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -1706,3 +1706,34 @@ is_private: true status: 0 num_issues: 0 + +- + id: 60 + owner_id: 37 + owner_name: user37 + lower_name: repo60 + name: repo60 + default_branch: main + num_watches: 0 + num_stars: 0 + num_forks: 0 + num_issues: 0 + num_closed_issues: 0 + num_pulls: 1 + num_closed_pulls: 0 + num_milestones: 0 + num_closed_milestones: 0 + num_projects: 0 + num_closed_projects: 0 + is_private: false + is_empty: false + is_archived: false + is_mirror: false + status: 0 + is_fork: false + fork_id: 0 + is_template: false + template_id: 0 + size: 0 + is_fsck_enabled: true + close_issues_via_commit_in_any_branch: false diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index 79fbb981f647a..84f22cab32cb6 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -1332,3 +1332,114 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + +- + id: 37 + lower_name: user37 + name: user37 + full_name: User37 + email: user37@example.com + keep_email_private: false + email_notifications_preference: enabled + passwd: ZogKvWdyEx:password + passwd_hash_algo: dummy + must_change_password: false + login_source: 0 + login_name: user37 + type: 0 + salt: ZogKvWdyEx + max_repo_creation: -1 + is_active: true + is_admin: false + is_restricted: false + allow_git_hook: false + allow_import_local: false + allow_create_organization: true + prohibit_login: false + avatar: avatar37 + avatar_email: user37@example.com + use_custom_avatar: false + num_followers: 0 + num_following: 0 + num_stars: 0 + num_repos: 0 + num_teams: 0 + num_members: 0 + visibility: 0 + repo_admin_change_team_access: false + theme: "" + keep_activity_private: false + +- + id: 38 + lower_name: user38 + name: user38 + full_name: User38 + email: user38@example.com + keep_email_private: false + email_notifications_preference: enabled + passwd: ZogKvWdyEx:password + passwd_hash_algo: dummy + must_change_password: false + login_source: 0 + login_name: user38 + type: 0 + salt: ZogKvWdyEx + max_repo_creation: -1 + is_active: true + is_admin: false + is_restricted: false + allow_git_hook: false + allow_import_local: false + allow_create_organization: true + prohibit_login: false + avatar: avatar38 + avatar_email: user38@example.com + use_custom_avatar: false + num_followers: 0 + num_following: 0 + num_stars: 0 + num_repos: 0 + num_teams: 0 + num_members: 0 + visibility: 0 + repo_admin_change_team_access: false + theme: "" + keep_activity_private: false + +- + id: 39 + lower_name: user39 + name: user39 + full_name: User39 + email: user39@example.com + keep_email_private: false + email_notifications_preference: enabled + passwd: ZogKvWdyEx:password + passwd_hash_algo: dummy + must_change_password: false + login_source: 0 + login_name: user39 + type: 0 + salt: ZogKvWdyEx + max_repo_creation: -1 + is_active: true + is_admin: false + is_restricted: false + allow_git_hook: false + allow_import_local: false + allow_create_organization: true + prohibit_login: false + avatar: avatar39 + avatar_email: user39@example.com + use_custom_avatar: false + num_followers: 0 + num_following: 0 + num_stars: 0 + num_repos: 0 + num_teams: 0 + num_members: 0 + visibility: 0 + repo_admin_change_team_access: false + theme: "" + keep_activity_private: false diff --git a/tests/gitea-repositories-meta/user37/repo60.git/HEAD b/tests/gitea-repositories-meta/user37/repo60.git/HEAD new file mode 100644 index 0000000000000..cb089cd89a7d7 --- /dev/null +++ b/tests/gitea-repositories-meta/user37/repo60.git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/tests/gitea-repositories-meta/user37/repo60.git/config b/tests/gitea-repositories-meta/user37/repo60.git/config new file mode 100644 index 0000000000000..64280b806c976 --- /dev/null +++ b/tests/gitea-repositories-meta/user37/repo60.git/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = false + bare = true + symlinks = false + ignorecase = true diff --git a/tests/gitea-repositories-meta/user37/repo60.git/description b/tests/gitea-repositories-meta/user37/repo60.git/description new file mode 100644 index 0000000000000..498b267a8c781 --- /dev/null +++ b/tests/gitea-repositories-meta/user37/repo60.git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/tests/gitea-repositories-meta/user37/repo60.git/info/exclude b/tests/gitea-repositories-meta/user37/repo60.git/info/exclude new file mode 100644 index 0000000000000..a5196d1be8fb5 --- /dev/null +++ b/tests/gitea-repositories-meta/user37/repo60.git/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/tests/integration/api_pull_review_test.go b/tests/integration/api_pull_review_test.go index 7f6b1cd257167..3c170f30b0ddb 100644 --- a/tests/integration/api_pull_review_test.go +++ b/tests/integration/api_pull_review_test.go @@ -277,32 +277,32 @@ func TestAPIPullReviewRequest(t *testing.T) { MakeRequest(t, req, http.StatusNoContent) // a collaborator can add/remove a review request - user5Session := loginUser(t, "user5") - user5Token := getTokenForLoggedInUser(t, user5Session, auth_model.AccessTokenScopeWriteRepository) - req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", repo.OwnerName, repo.Name, pullIssue.Index), &api.PullReviewRequestOptions{ + pullIssue21 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 21}) + assert.NoError(t, pullIssue21.LoadAttributes(db.DefaultContext)) + pull21Repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: pullIssue21.RepoID}) // repo60 + user38Session := loginUser(t, "user38") + user38Token := getTokenForLoggedInUser(t, user38Session, auth_model.AccessTokenScopeWriteRepository) + req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", pull21Repo.OwnerName, pull21Repo.Name, pullIssue21.Index), &api.PullReviewRequestOptions{ Reviewers: []string{"user4@example.com"}, - }).AddTokenAuth(user5Token) + }).AddTokenAuth(user38Token) MakeRequest(t, req, http.StatusCreated) - req = NewRequestWithJSON(t, http.MethodDelete, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", repo.OwnerName, repo.Name, pullIssue.Index), &api.PullReviewRequestOptions{ + req = NewRequestWithJSON(t, http.MethodDelete, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", pull21Repo.OwnerName, pull21Repo.Name, pullIssue21.Index), &api.PullReviewRequestOptions{ Reviewers: []string{"user4@example.com"}, - }).AddTokenAuth(user5Token) + }).AddTokenAuth(user38Token) MakeRequest(t, req, http.StatusNoContent) // the poster of the PR can add/remove a review request - user4Session := loginUser(t, "user4") - user4Token := getTokenForLoggedInUser(t, user4Session, auth_model.AccessTokenScopeWriteRepository) - pullIssue21 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 21}) - assert.NoError(t, pullIssue21.LoadAttributes(db.DefaultContext)) - pull21Repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: pullIssue21.RepoID}) // repo1 + user39Session := loginUser(t, "user39") + user39Token := getTokenForLoggedInUser(t, user39Session, auth_model.AccessTokenScopeWriteRepository) req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", pull21Repo.OwnerName, pull21Repo.Name, pullIssue21.Index), &api.PullReviewRequestOptions{ Reviewers: []string{"user8"}, - }).AddTokenAuth(user4Token) + }).AddTokenAuth(user39Token) MakeRequest(t, req, http.StatusCreated) req = NewRequestWithJSON(t, http.MethodDelete, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", pull21Repo.OwnerName, pull21Repo.Name, pullIssue21.Index), &api.PullReviewRequestOptions{ Reviewers: []string{"user8"}, - }).AddTokenAuth(user4Token) + }).AddTokenAuth(user39Token) MakeRequest(t, req, http.StatusNoContent) // Test team review request From 04103633f38e3ca93f843a84c1c744b6632aa368 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 12:28:47 +0800 Subject: [PATCH 11/26] fix fixtures --- models/fixtures/repository.yml | 4 ++-- models/fixtures/user.yml | 14 +++++++------- .../{user37 => user40}/repo60.git/HEAD | 0 .../{user37 => user40}/repo60.git/config | 0 .../{user37 => user40}/repo60.git/description | 0 .../{user37 => user40}/repo60.git/info/exclude | 0 6 files changed, 9 insertions(+), 9 deletions(-) rename tests/gitea-repositories-meta/{user37 => user40}/repo60.git/HEAD (100%) rename tests/gitea-repositories-meta/{user37 => user40}/repo60.git/config (100%) rename tests/gitea-repositories-meta/{user37 => user40}/repo60.git/description (100%) rename tests/gitea-repositories-meta/{user37 => user40}/repo60.git/info/exclude (100%) diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index 4dc96bfbaa17c..0f42ab17a92fd 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -1709,8 +1709,8 @@ - id: 60 - owner_id: 37 - owner_name: user37 + owner_id: 40 + owner_name: user40 lower_name: repo60 name: repo60 default_branch: main diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index 18b87249afc9d..48f794d74d000 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -1334,18 +1334,18 @@ keep_activity_private: false - - id: 40 - lower_name: user40 - name: user40 - full_name: User 40 - email: user40@example.com + id: 37 + lower_name: user37 + name: user37 + full_name: User 37 + email: user37@example.com keep_email_private: false email_notifications_preference: enabled passwd: ZogKvWdyEx:password passwd_hash_algo: dummy must_change_password: false login_source: 0 - login_name: user40 + login_name: user37 type: 0 salt: ZogKvWdyEx max_repo_creation: -1 @@ -1357,7 +1357,7 @@ allow_create_organization: true prohibit_login: true avatar: avatar29 - avatar_email: user40@example.com + avatar_email: user37@example.com use_custom_avatar: false num_followers: 0 num_following: 0 diff --git a/tests/gitea-repositories-meta/user37/repo60.git/HEAD b/tests/gitea-repositories-meta/user40/repo60.git/HEAD similarity index 100% rename from tests/gitea-repositories-meta/user37/repo60.git/HEAD rename to tests/gitea-repositories-meta/user40/repo60.git/HEAD diff --git a/tests/gitea-repositories-meta/user37/repo60.git/config b/tests/gitea-repositories-meta/user40/repo60.git/config similarity index 100% rename from tests/gitea-repositories-meta/user37/repo60.git/config rename to tests/gitea-repositories-meta/user40/repo60.git/config diff --git a/tests/gitea-repositories-meta/user37/repo60.git/description b/tests/gitea-repositories-meta/user40/repo60.git/description similarity index 100% rename from tests/gitea-repositories-meta/user37/repo60.git/description rename to tests/gitea-repositories-meta/user40/repo60.git/description diff --git a/tests/gitea-repositories-meta/user37/repo60.git/info/exclude b/tests/gitea-repositories-meta/user40/repo60.git/info/exclude similarity index 100% rename from tests/gitea-repositories-meta/user37/repo60.git/info/exclude rename to tests/gitea-repositories-meta/user40/repo60.git/info/exclude From 8daed8775a419a246b7c8a38801e8f111bc73038 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 13:35:12 +0800 Subject: [PATCH 12/26] fix test inconsistency --- models/fixtures/user.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index 48f794d74d000..2119bf0197e2b 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -1473,7 +1473,7 @@ num_followers: 0 num_following: 0 num_stars: 0 - num_repos: 0 + num_repos: 1 num_teams: 0 num_members: 0 visibility: 0 From bef6cb09168ce83db3511dd5a3e6de1e2d6d0a48 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 13:56:26 +0800 Subject: [PATCH 13/26] fix some tests --- models/fixtures/access.yml | 6 ++++++ models/issues/issue_test.go | 2 +- models/repo/repo_list_test.go | 4 ++-- models/user/user_test.go | 4 ++-- modules/indexer/issues/indexer_test.go | 14 +++++++------- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/models/fixtures/access.yml b/models/fixtures/access.yml index 1bb6a9a8acc7c..29d574198b82a 100644 --- a/models/fixtures/access.yml +++ b/models/fixtures/access.yml @@ -135,3 +135,9 @@ user_id: 31 repo_id: 28 mode: 4 + +- + id: 24 + user_id: 38 + repo_id: 60 + mode: 2 diff --git a/models/issues/issue_test.go b/models/issues/issue_test.go index cc363d2fae7c6..f2f4aeb6b15ec 100644 --- a/models/issues/issue_test.go +++ b/models/issues/issue_test.go @@ -379,7 +379,7 @@ func TestCountIssues(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) count, err := issues_model.CountIssues(db.DefaultContext, &issues_model.IssuesOptions{}) assert.NoError(t, err) - assert.EqualValues(t, 20, count) + assert.EqualValues(t, 21, count) } func TestIssueLoadAttributes(t *testing.T) { diff --git a/models/repo/repo_list_test.go b/models/repo/repo_list_test.go index 8a1799aac0229..6646e6cbe5f3b 100644 --- a/models/repo/repo_list_test.go +++ b/models/repo/repo_list_test.go @@ -143,7 +143,7 @@ func getTestCases() []struct { { name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative", opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, Private: true, AllPublic: true, AllLimited: true, Template: util.OptionalBoolFalse}, - count: 36, + count: 37, }, { name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName", @@ -158,7 +158,7 @@ func getTestCases() []struct { { name: "AllPublic/PublicRepositoriesOfOrganization", opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 17, AllPublic: true, Collaborate: util.OptionalBoolFalse, Template: util.OptionalBoolFalse}, - count: 31, + count: 32, }, { name: "AllTemplates", diff --git a/models/user/user_test.go b/models/user/user_test.go index f3e5a95b1ead0..32473ea448090 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -101,13 +101,13 @@ func TestSearchUsers(t *testing.T) { } testUserSuccess(&user_model.SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1}}, - []int64{1, 2, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21, 24, 27, 28, 29, 30, 32, 34, 37}) + []int64{1, 2, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21, 24, 27, 28, 29, 30, 32, 34, 37, 38, 39, 40}) testUserSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolFalse}, []int64{9}) testUserSuccess(&user_model.SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolTrue}, - []int64{1, 2, 4, 5, 8, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21, 24, 27, 28, 29, 30, 32, 34, 37}) + []int64{1, 2, 4, 5, 8, 10, 11, 12, 13, 14, 15, 16, 18, 20, 21, 24, 27, 28, 29, 30, 32, 34, 37, 38, 39, 40}) testUserSuccess(&user_model.SearchUserOptions{Keyword: "user1", OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 1}, IsActive: util.OptionalBoolTrue}, []int64{1, 10, 11, 12, 13, 14, 15, 16, 18}) diff --git a/modules/indexer/issues/indexer_test.go b/modules/indexer/issues/indexer_test.go index da4fc9b878999..be4fefda1c034 100644 --- a/modules/indexer/issues/indexer_test.go +++ b/modules/indexer/issues/indexer_test.go @@ -218,7 +218,7 @@ func searchIssueIsPull(t *testing.T) { SearchOptions{ IsPull: util.OptionalBoolTrue, }, - []int64{12, 11, 20, 19, 9, 8, 3, 2}, + []int64{21, 12, 11, 20, 19, 9, 8, 3, 2}, }, } for _, test := range tests { @@ -239,7 +239,7 @@ func searchIssueIsClosed(t *testing.T) { SearchOptions{ IsClosed: util.OptionalBoolFalse, }, - []int64{17, 16, 15, 14, 13, 12, 11, 20, 6, 19, 18, 10, 7, 9, 8, 3, 2, 1}, + []int64{21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 19, 18, 10, 7, 9, 8, 3, 2, 1}, }, { SearchOptions{ @@ -305,7 +305,7 @@ func searchIssueByLabelID(t *testing.T) { SearchOptions{ ExcludedLabelIDs: []int64{1}, }, - []int64{17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 19, 18, 10, 7, 4, 9, 8, 3}, + []int64{21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 19, 18, 10, 7, 4, 9, 8, 3}, }, } for _, test := range tests { @@ -329,7 +329,7 @@ func searchIssueByTime(t *testing.T) { SearchOptions{ UpdatedAfterUnix: int64Pointer(0), }, - []int64{17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 19, 18, 10, 7, 4, 9, 8, 3, 2, 1}, + []int64{21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 19, 18, 10, 7, 4, 9, 8, 3, 2, 1}, }, } for _, test := range tests { @@ -350,7 +350,7 @@ func searchIssueWithOrder(t *testing.T) { SearchOptions{ SortBy: internal.SortByCreatedAsc, }, - []int64{1, 2, 3, 8, 9, 4, 7, 10, 18, 19, 5, 6, 20, 11, 12, 13, 14, 15, 16, 17}, + []int64{1, 2, 3, 8, 9, 4, 7, 10, 18, 19, 5, 6, 20, 11, 12, 13, 14, 15, 16, 17, 21}, }, } for _, test := range tests { @@ -410,8 +410,8 @@ func searchIssueWithPaginator(t *testing.T) { PageSize: 5, }, }, - []int64{17, 16, 15, 14, 13}, - 20, + []int64{21, 17, 16, 15, 14}, + 21, }, } for _, test := range tests { From 05b826df437a0b160e52c862152b90478b332806 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 14:08:05 +0800 Subject: [PATCH 14/26] fix repo count --- models/repo/repo_list_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/repo/repo_list_test.go b/models/repo/repo_list_test.go index 6646e6cbe5f3b..a8b958109c845 100644 --- a/models/repo/repo_list_test.go +++ b/models/repo/repo_list_test.go @@ -138,7 +138,7 @@ func getTestCases() []struct { { name: "AllPublic/PublicRepositoriesOfUserIncludingCollaborative", opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, AllPublic: true, Template: util.OptionalBoolFalse}, - count: 31, + count: 32, }, { name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative", From 175df6bd38b14b869587da75f132b4b85b6bc317 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 14:38:54 +0800 Subject: [PATCH 15/26] fix some tests --- tests/integration/api_issue_test.go | 8 ++++---- tests/integration/api_nodeinfo_test.go | 4 ++-- tests/integration/api_repo_test.go | 6 +++--- tests/integration/issue_test.go | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/integration/api_issue_test.go b/tests/integration/api_issue_test.go index f02580686867b..f80412e81cb25 100644 --- a/tests/integration/api_issue_test.go +++ b/tests/integration/api_issue_test.go @@ -217,7 +217,7 @@ func TestAPISearchIssues(t *testing.T) { defer tests.PrepareTestEnv(t)() // as this API was used in the frontend, it uses UI page size - expectedIssueCount := 18 // from the fixtures + expectedIssueCount := 19 // from the fixtures if expectedIssueCount > setting.UI.IssuePagingNum { expectedIssueCount = setting.UI.IssuePagingNum } @@ -257,7 +257,7 @@ func TestAPISearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()).AddTokenAuth(token) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.EqualValues(t, "20", resp.Header().Get("X-Total-Count")) + assert.EqualValues(t, "21", resp.Header().Get("X-Total-Count")) assert.Len(t, apiIssues, 20) query.Add("limit", "10") @@ -265,7 +265,7 @@ func TestAPISearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()).AddTokenAuth(token) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.EqualValues(t, "20", resp.Header().Get("X-Total-Count")) + assert.EqualValues(t, "21", resp.Header().Get("X-Total-Count")) assert.Len(t, apiIssues, 10) query = url.Values{"assigned": {"true"}, "state": {"all"}} @@ -315,7 +315,7 @@ func TestAPISearchIssuesWithLabels(t *testing.T) { defer tests.PrepareTestEnv(t)() // as this API was used in the frontend, it uses UI page size - expectedIssueCount := 18 // from the fixtures + expectedIssueCount := 19 // from the fixtures if expectedIssueCount > setting.UI.IssuePagingNum { expectedIssueCount = setting.UI.IssuePagingNum } diff --git a/tests/integration/api_nodeinfo_test.go b/tests/integration/api_nodeinfo_test.go index 876fb5ac13e67..625feb431c9f5 100644 --- a/tests/integration/api_nodeinfo_test.go +++ b/tests/integration/api_nodeinfo_test.go @@ -32,8 +32,8 @@ func TestNodeinfo(t *testing.T) { DecodeJSON(t, resp, &nodeinfo) assert.True(t, nodeinfo.OpenRegistrations) assert.Equal(t, "gitea", nodeinfo.Software.Name) - assert.Equal(t, 26, nodeinfo.Usage.Users.Total) - assert.Equal(t, 20, nodeinfo.Usage.LocalPosts) + assert.Equal(t, 29, nodeinfo.Usage.Users.Total) + assert.Equal(t, 21, nodeinfo.Usage.LocalPosts) assert.Equal(t, 3, nodeinfo.Usage.LocalComments) }) } diff --git a/tests/integration/api_repo_test.go b/tests/integration/api_repo_test.go index 90f84c794e123..04c1f29649ea7 100644 --- a/tests/integration/api_repo_test.go +++ b/tests/integration/api_repo_test.go @@ -93,9 +93,9 @@ func TestAPISearchRepo(t *testing.T) { }{ { name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50&private=false", expectedResults: expectedResults{ - nil: {count: 33}, - user: {count: 33}, - user2: {count: 33}, + nil: {count: 34}, + user: {count: 34}, + user2: {count: 34}, }, }, { diff --git a/tests/integration/issue_test.go b/tests/integration/issue_test.go index 4b3f581c2b22f..a0a948819299e 100644 --- a/tests/integration/issue_test.go +++ b/tests/integration/issue_test.go @@ -407,7 +407,7 @@ func TestSearchIssues(t *testing.T) { session := loginUser(t, "user2") - expectedIssueCount := 18 // from the fixtures + expectedIssueCount := 19 // from the fixtures if expectedIssueCount > setting.UI.IssuePagingNum { expectedIssueCount = setting.UI.IssuePagingNum } @@ -444,7 +444,7 @@ func TestSearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()) resp = session.MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.EqualValues(t, "20", resp.Header().Get("X-Total-Count")) + assert.EqualValues(t, "21", resp.Header().Get("X-Total-Count")) assert.Len(t, apiIssues, 20) query.Add("limit", "5") @@ -452,7 +452,7 @@ func TestSearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()) resp = session.MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.EqualValues(t, "20", resp.Header().Get("X-Total-Count")) + assert.EqualValues(t, "21", resp.Header().Get("X-Total-Count")) assert.Len(t, apiIssues, 5) query = url.Values{"assigned": {"true"}, "state": {"all"}} @@ -501,7 +501,7 @@ func TestSearchIssues(t *testing.T) { func TestSearchIssuesWithLabels(t *testing.T) { defer tests.PrepareTestEnv(t)() - expectedIssueCount := 18 // from the fixtures + expectedIssueCount := 19 // from the fixtures if expectedIssueCount > setting.UI.IssuePagingNum { expectedIssueCount = setting.UI.IssuePagingNum } From c74425c65ba7726d55b3dcfc4a3a6469e1b30d4d Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 16:04:00 +0800 Subject: [PATCH 16/26] fix IsValidTeamReviewRequest --- services/issue/assignee.go | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/services/issue/assignee.go b/services/issue/assignee.go index 43e41e25fa006..b5f472ba530c1 100644 --- a/services/issue/assignee.go +++ b/services/issue/assignee.go @@ -173,11 +173,7 @@ func IsValidTeamReviewRequest(ctx context.Context, reviewer *organization.Team, } } - permission, err := access_model.GetUserRepoPermission(ctx, issue.Repo, doer) - if err != nil { - log.Error("Unable to GetUserRepoPermission for %-v in %-v#%d", doer, issue.Repo, issue.Index) - return err - } + canDoerChangeReviewRequests := CanDoerChangeReviewRequests(ctx, doer, issue.Repo, issue) if isAdd { if issue.Repo.IsPrivate { @@ -192,30 +188,26 @@ func IsValidTeamReviewRequest(ctx context.Context, reviewer *organization.Team, } } - doerCanWrite := permission.CanAccessAny(perm.AccessModeWrite, unit.TypePullRequests) - if !doerCanWrite && doer.ID != issue.PosterID { - official, err := issues_model.IsOfficialReviewer(ctx, issue, doer) - if err != nil { - log.Error("Unable to Check if IsOfficialReviewer for %-v in %-v#%d", doer, issue.Repo, issue.Index) - return err - } - if !official { - return issues_model.ErrNotValidReviewRequest{ - Reason: "Doer can't choose reviewer", - UserID: doer.ID, - RepoID: issue.Repo.ID, - } - } + if canDoerChangeReviewRequests { + return nil } - } else if !permission.IsAdmin() { + return issues_model.ErrNotValidReviewRequest{ - Reason: "Only admin users can remove team requests. Doer is not admin", + Reason: "Doer can't choose reviewer", UserID: doer.ID, RepoID: issue.Repo.ID, } } - return nil + if canDoerChangeReviewRequests { + return nil + } + + return issues_model.ErrNotValidReviewRequest{ + Reason: "Doer can't remove reviewer", + UserID: doer.ID, + RepoID: issue.Repo.ID, + } } // TeamReviewRequest add or remove a review request from a team for this PR, and make comment for it. From 0fccba1ed54e624f909782de95b191fd2eda1498 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 17:31:31 +0800 Subject: [PATCH 17/26] add team member tests --- models/fixtures/email_address.yml | 8 ++++ models/fixtures/issue.yml | 19 ++++++++- models/fixtures/pull_request.yml | 9 +++++ models/fixtures/repo_unit.yml | 21 ++++++++++ models/fixtures/repository.yml | 31 +++++++++++++++ models/fixtures/team.yml | 22 +++++++++++ models/fixtures/team_repo.yml | 12 ++++++ models/fixtures/team_unit.yml | 36 +++++++++++++++++ models/fixtures/team_user.yml | 18 +++++++++ models/fixtures/user.yml | 39 ++++++++++++++++++- .../org41/repo61.git/HEAD | 1 + .../org41/repo61.git/config | 6 +++ .../org41/repo61.git/description | 1 + .../org41/repo61.git/info/exclude | 6 +++ tests/integration/api_pull_review_test.go | 16 ++++++++ 15 files changed, 243 insertions(+), 2 deletions(-) create mode 100644 tests/gitea-repositories-meta/org41/repo61.git/HEAD create mode 100644 tests/gitea-repositories-meta/org41/repo61.git/config create mode 100644 tests/gitea-repositories-meta/org41/repo61.git/description create mode 100644 tests/gitea-repositories-meta/org41/repo61.git/info/exclude diff --git a/models/fixtures/email_address.yml b/models/fixtures/email_address.yml index b2a043263580f..60277d4eca754 100644 --- a/models/fixtures/email_address.yml +++ b/models/fixtures/email_address.yml @@ -317,3 +317,11 @@ lower_email: user40@example.com is_activated: true is_primary: true + +- + id: 41 + uid: 41 + email: org41@example.com + lower_email: org41@example.com + is_activated: true + is_primary: true diff --git a/models/fixtures/issue.yml b/models/fixtures/issue.yml index 7b317305a62d6..ca5b1c6cd1df5 100644 --- a/models/fixtures/issue.yml +++ b/models/fixtures/issue.yml @@ -345,7 +345,24 @@ index: 1 poster_id: 39 original_author_id: 0 - name: pull1 + name: repo60 pull1 + content: content for the 1st issue + milestone_id: 0 + priority: 0 + is_closed: false + is_pull: true + num_comments: 0 + created_unix: 1707270422 + updated_unix: 1707270422 + is_locked: false + +- + id: 22 + repo_id: 61 + index: 1 + poster_id: 40 + original_author_id: 0 + name: repo61 pull1 content: content for the 1st issue milestone_id: 0 priority: 0 diff --git a/models/fixtures/pull_request.yml b/models/fixtures/pull_request.yml index 5802ac7e032b5..24250e1df4803 100644 --- a/models/fixtures/pull_request.yml +++ b/models/fixtures/pull_request.yml @@ -107,3 +107,12 @@ index: 1 head_repo_id: 60 base_repo_id: 60 + +- + id: 10 + type: 0 # gitea pull request + status: 2 # mergable + issue_id: 22 + index: 1 + head_repo_id: 61 + base_repo_id: 61 diff --git a/models/fixtures/repo_unit.yml b/models/fixtures/repo_unit.yml index 34dd0a2da52a8..4b266749905d0 100644 --- a/models/fixtures/repo_unit.yml +++ b/models/fixtures/repo_unit.yml @@ -697,3 +697,24 @@ type: 3 config: "{\"IgnoreWhitespaceConflicts\":false,\"AllowMerge\":true,\"AllowRebase\":true,\"AllowRebaseMerge\":true,\"AllowSquash\":true}" created_unix: 946684810 + +- + id: 105 + repo_id: 61 + type: 1 + config: "{}" + created_unix: 946684810 + +- + id: 106 + repo_id: 61 + type: 2 + config: "{\"EnableTimetracker\":true,\"AllowOnlyContributorsToTrackTime\":true}" + created_unix: 946684810 + +- + id: 107 + repo_id: 61 + type: 3 + config: "{\"IgnoreWhitespaceConflicts\":false,\"AllowMerge\":true,\"AllowRebase\":true,\"AllowRebaseMerge\":true,\"AllowSquash\":true}" + created_unix: 946684810 diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index 0f42ab17a92fd..d094fe82d8d73 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -1737,3 +1737,34 @@ size: 0 is_fsck_enabled: true close_issues_via_commit_in_any_branch: false + +- + id: 61 + owner_id: 41 + owner_name: org41 + lower_name: repo61 + name: repo61 + default_branch: main + num_watches: 0 + num_stars: 0 + num_forks: 0 + num_issues: 0 + num_closed_issues: 0 + num_pulls: 1 + num_closed_pulls: 0 + num_milestones: 0 + num_closed_milestones: 0 + num_projects: 0 + num_closed_projects: 0 + is_private: false + is_empty: false + is_archived: false + is_mirror: false + status: 0 + is_fork: false + fork_id: 0 + is_template: false + template_id: 0 + size: 0 + is_fsck_enabled: true + close_issues_via_commit_in_any_branch: false diff --git a/models/fixtures/team.yml b/models/fixtures/team.yml index 295e51e39ce94..d69dc61439952 100644 --- a/models/fixtures/team.yml +++ b/models/fixtures/team.yml @@ -217,3 +217,25 @@ num_members: 1 includes_all_repositories: false can_create_org_repo: true + +- + id: 21 + org_id: 41 + lower_name: owners + name: Owners + authorize: 4 # owner + num_repos: 1 + num_members: 1 + includes_all_repositories: true + can_create_org_repo: true + +- + id: 22 + org_id: 41 + lower_name: team1 + name: Team1 + authorize: 1 # read + num_repos: 0 + num_members: 1 + includes_all_repositories: false + can_create_org_repo: false diff --git a/models/fixtures/team_repo.yml b/models/fixtures/team_repo.yml index 8497720892f49..a29078107eeb4 100644 --- a/models/fixtures/team_repo.yml +++ b/models/fixtures/team_repo.yml @@ -63,3 +63,15 @@ org_id: 17 team_id: 9 repo_id: 24 + +- + id: 12 + org_id: 41 + team_id: 21 + repo_id: 61 + +- + id: 13 + org_id: 41 + team_id: 22 + repo_id: 61 diff --git a/models/fixtures/team_unit.yml b/models/fixtures/team_unit.yml index c5531aa57af52..0f9634a1aed05 100644 --- a/models/fixtures/team_unit.yml +++ b/models/fixtures/team_unit.yml @@ -286,3 +286,39 @@ team_id: 2 type: 8 access_mode: 2 + +- + id: 49 + team_id: 21 + type: 1 + access_mode: 4 + +- + id: 50 + team_id: 21 + type: 2 + access_mode: 4 + +- + id: 51 + team_id: 21 + type: 3 + access_mode: 4 + +- + id: 52 + team_id: 22 + type: 1 + access_mode: 2 + +- + id: 53 + team_id: 22 + type: 2 + access_mode: 2 + +- + id: 54 + team_id: 22 + type: 3 + access_mode: 2 diff --git a/models/fixtures/team_user.yml b/models/fixtures/team_user.yml index 9142fe609ad76..02d57ae644fd0 100644 --- a/models/fixtures/team_user.yml +++ b/models/fixtures/team_user.yml @@ -129,3 +129,21 @@ org_id: 17 team_id: 9 uid: 15 + +- + id: 23 + org_id: 41 + team_id: 21 + uid: 40 + +- + id: 24 + org_id: 41 + team_id: 22 + uid: 38 + +- + id: 25 + org_id: 41 + team_id: 22 + uid: 39 diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index 2119bf0197e2b..16b687ae04d1f 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -1451,7 +1451,7 @@ full_name: User40 email: user40@example.com keep_email_private: false - email_notifications_preference: enabled + email_notifications_preference: onmention passwd: ZogKvWdyEx:password passwd_hash_algo: dummy must_change_password: false @@ -1480,3 +1480,40 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false + +- + id: 41 + lower_name: org41 + name: org41 + full_name: Org41 + email: org41@example.com + keep_email_private: false + email_notifications_preference: onmention + passwd: ZogKvWdyEx:password + passwd_hash_algo: dummy + must_change_password: false + login_source: 0 + login_name: org41 + type: 1 + salt: ZogKvWdyEx + max_repo_creation: -1 + is_active: false + is_admin: false + is_restricted: false + allow_git_hook: false + allow_import_local: false + allow_create_organization: true + prohibit_login: false + avatar: avatar41 + avatar_email: org41@example.com + use_custom_avatar: false + num_followers: 0 + num_following: 0 + num_stars: 0 + num_repos: 1 + num_teams: 2 + num_members: 3 + visibility: 0 + repo_admin_change_team_access: false + theme: "" + keep_activity_private: false diff --git a/tests/gitea-repositories-meta/org41/repo61.git/HEAD b/tests/gitea-repositories-meta/org41/repo61.git/HEAD new file mode 100644 index 0000000000000..cb089cd89a7d7 --- /dev/null +++ b/tests/gitea-repositories-meta/org41/repo61.git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/tests/gitea-repositories-meta/org41/repo61.git/config b/tests/gitea-repositories-meta/org41/repo61.git/config new file mode 100644 index 0000000000000..64280b806c976 --- /dev/null +++ b/tests/gitea-repositories-meta/org41/repo61.git/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = false + bare = true + symlinks = false + ignorecase = true diff --git a/tests/gitea-repositories-meta/org41/repo61.git/description b/tests/gitea-repositories-meta/org41/repo61.git/description new file mode 100644 index 0000000000000..498b267a8c781 --- /dev/null +++ b/tests/gitea-repositories-meta/org41/repo61.git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/tests/gitea-repositories-meta/org41/repo61.git/info/exclude b/tests/gitea-repositories-meta/org41/repo61.git/info/exclude new file mode 100644 index 0000000000000..a5196d1be8fb5 --- /dev/null +++ b/tests/gitea-repositories-meta/org41/repo61.git/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/tests/integration/api_pull_review_test.go b/tests/integration/api_pull_review_test.go index 3c170f30b0ddb..34f0aad3aad6d 100644 --- a/tests/integration/api_pull_review_test.go +++ b/tests/integration/api_pull_review_test.go @@ -305,6 +305,22 @@ func TestAPIPullReviewRequest(t *testing.T) { }).AddTokenAuth(user39Token) MakeRequest(t, req, http.StatusNoContent) + // user with read permission on pull requests unit can add/remove a review request + pullIssue22 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 22}) + assert.NoError(t, pullIssue22.LoadAttributes(db.DefaultContext)) + pull22Repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: pullIssue22.RepoID}) // repo61 + t.Logf("[PULL] %#v", pullIssue22) + t.Logf("[REPO] %#v", pull22Repo) + req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", pull22Repo.OwnerName, pull22Repo.Name, pullIssue22.Index), &api.PullReviewRequestOptions{ + Reviewers: []string{"user38"}, + }).AddTokenAuth(user39Token) // user39 is from a team with read permission on pull requests unit + MakeRequest(t, req, http.StatusCreated) + + req = NewRequestWithJSON(t, http.MethodDelete, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", pull22Repo.OwnerName, pull22Repo.Name, pullIssue22.Index), &api.PullReviewRequestOptions{ + Reviewers: []string{"user38"}, + }).AddTokenAuth(user39Token) // user39 is from a team with read permission on pull requests unit + MakeRequest(t, req, http.StatusNoContent) + // Test team review request pullIssue12 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 12}) assert.NoError(t, pullIssue12.LoadAttributes(db.DefaultContext)) From d4767fab2395276333a8390e58a4b94d727cf4a3 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 17:33:23 +0800 Subject: [PATCH 18/26] remove debug logs --- tests/integration/api_pull_review_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/integration/api_pull_review_test.go b/tests/integration/api_pull_review_test.go index 34f0aad3aad6d..ed803ffe87b32 100644 --- a/tests/integration/api_pull_review_test.go +++ b/tests/integration/api_pull_review_test.go @@ -309,8 +309,6 @@ func TestAPIPullReviewRequest(t *testing.T) { pullIssue22 := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 22}) assert.NoError(t, pullIssue22.LoadAttributes(db.DefaultContext)) pull22Repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: pullIssue22.RepoID}) // repo61 - t.Logf("[PULL] %#v", pullIssue22) - t.Logf("[REPO] %#v", pull22Repo) req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/requested_reviewers", pull22Repo.OwnerName, pull22Repo.Name, pullIssue22.Index), &api.PullReviewRequestOptions{ Reviewers: []string{"user38"}, }).AddTokenAuth(user39Token) // user39 is from a team with read permission on pull requests unit From 03aac65ac35f5d735fe4b0f82c04017189b88d38 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 17:54:21 +0800 Subject: [PATCH 19/26] fix inconsistency --- models/fixtures/access.yml | 18 ++++++++++++++++++ models/fixtures/org_user.yml | 18 ++++++++++++++++++ models/fixtures/team.yml | 2 +- models/issues/issue_test.go | 2 +- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/models/fixtures/access.yml b/models/fixtures/access.yml index 29d574198b82a..641c453eb7760 100644 --- a/models/fixtures/access.yml +++ b/models/fixtures/access.yml @@ -141,3 +141,21 @@ user_id: 38 repo_id: 60 mode: 2 + +- + id: 25 + user_id: 38 + repo_id: 61 + mode: 1 + +- + id: 26 + user_id: 39 + repo_id: 61 + mode: 1 + +- + id: 27 + user_id: 40 + repo_id: 61 + mode: 4 diff --git a/models/fixtures/org_user.yml b/models/fixtures/org_user.yml index 8d58169a32f17..a7fbcb2c5a317 100644 --- a/models/fixtures/org_user.yml +++ b/models/fixtures/org_user.yml @@ -99,3 +99,21 @@ uid: 5 org_id: 36 is_public: true + +- + id: 18 + uid: 38 + org_id: 41 + is_public: true + +- + id: 19 + uid: 39 + org_id: 41 + is_public: true + +- + id: 20 + uid: 40 + org_id: 41 + is_public: true diff --git a/models/fixtures/team.yml b/models/fixtures/team.yml index d69dc61439952..c0b58975b265c 100644 --- a/models/fixtures/team.yml +++ b/models/fixtures/team.yml @@ -236,6 +236,6 @@ name: Team1 authorize: 1 # read num_repos: 0 - num_members: 1 + num_members: 2 includes_all_repositories: false can_create_org_repo: false diff --git a/models/issues/issue_test.go b/models/issues/issue_test.go index f2f4aeb6b15ec..1bbc0eee564fd 100644 --- a/models/issues/issue_test.go +++ b/models/issues/issue_test.go @@ -379,7 +379,7 @@ func TestCountIssues(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) count, err := issues_model.CountIssues(db.DefaultContext, &issues_model.IssuesOptions{}) assert.NoError(t, err) - assert.EqualValues(t, 21, count) + assert.EqualValues(t, 22, count) } func TestIssueLoadAttributes(t *testing.T) { From f4228476741d38cec64b007b8a7407f925b918b3 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 18:01:13 +0800 Subject: [PATCH 20/26] fix some tests --- models/repo/repo_list_test.go | 6 +++--- models/user/user_test.go | 2 +- modules/indexer/issues/indexer_test.go | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/models/repo/repo_list_test.go b/models/repo/repo_list_test.go index a8b958109c845..83e37a27fdb1c 100644 --- a/models/repo/repo_list_test.go +++ b/models/repo/repo_list_test.go @@ -138,12 +138,12 @@ func getTestCases() []struct { { name: "AllPublic/PublicRepositoriesOfUserIncludingCollaborative", opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, AllPublic: true, Template: util.OptionalBoolFalse}, - count: 32, + count: 33, }, { name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative", opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, Private: true, AllPublic: true, AllLimited: true, Template: util.OptionalBoolFalse}, - count: 37, + count: 38, }, { name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName", @@ -158,7 +158,7 @@ func getTestCases() []struct { { name: "AllPublic/PublicRepositoriesOfOrganization", opts: &repo_model.SearchRepoOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 10}, OwnerID: 17, AllPublic: true, Collaborate: util.OptionalBoolFalse, Template: util.OptionalBoolFalse}, - count: 32, + count: 33, }, { name: "AllTemplates", diff --git a/models/user/user_test.go b/models/user/user_test.go index 32473ea448090..68cee9cdbd16b 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -89,7 +89,7 @@ func TestSearchUsers(t *testing.T) { []int64{19, 25}) testOrgSuccess(&user_model.SearchUserOptions{OrderBy: "id ASC", ListOptions: db.ListOptions{Page: 4, PageSize: 2}}, - []int64{26}) + []int64{26, 41}) testOrgSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 5, PageSize: 2}}, []int64{}) diff --git a/modules/indexer/issues/indexer_test.go b/modules/indexer/issues/indexer_test.go index be4fefda1c034..3b96686d98ef0 100644 --- a/modules/indexer/issues/indexer_test.go +++ b/modules/indexer/issues/indexer_test.go @@ -218,7 +218,7 @@ func searchIssueIsPull(t *testing.T) { SearchOptions{ IsPull: util.OptionalBoolTrue, }, - []int64{21, 12, 11, 20, 19, 9, 8, 3, 2}, + []int64{22, 21, 12, 11, 20, 19, 9, 8, 3, 2}, }, } for _, test := range tests { @@ -239,7 +239,7 @@ func searchIssueIsClosed(t *testing.T) { SearchOptions{ IsClosed: util.OptionalBoolFalse, }, - []int64{21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 19, 18, 10, 7, 9, 8, 3, 2, 1}, + []int64{22, 21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 19, 18, 10, 7, 9, 8, 3, 2, 1}, }, { SearchOptions{ @@ -305,7 +305,7 @@ func searchIssueByLabelID(t *testing.T) { SearchOptions{ ExcludedLabelIDs: []int64{1}, }, - []int64{21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 19, 18, 10, 7, 4, 9, 8, 3}, + []int64{22, 21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 19, 18, 10, 7, 4, 9, 8, 3}, }, } for _, test := range tests { @@ -329,7 +329,7 @@ func searchIssueByTime(t *testing.T) { SearchOptions{ UpdatedAfterUnix: int64Pointer(0), }, - []int64{21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 19, 18, 10, 7, 4, 9, 8, 3, 2, 1}, + []int64{22, 21, 17, 16, 15, 14, 13, 12, 11, 20, 6, 5, 19, 18, 10, 7, 4, 9, 8, 3, 2, 1}, }, } for _, test := range tests { @@ -350,7 +350,7 @@ func searchIssueWithOrder(t *testing.T) { SearchOptions{ SortBy: internal.SortByCreatedAsc, }, - []int64{1, 2, 3, 8, 9, 4, 7, 10, 18, 19, 5, 6, 20, 11, 12, 13, 14, 15, 16, 17, 21}, + []int64{1, 2, 3, 8, 9, 4, 7, 10, 18, 19, 5, 6, 20, 11, 12, 13, 14, 15, 16, 17, 21, 22}, }, } for _, test := range tests { @@ -410,8 +410,8 @@ func searchIssueWithPaginator(t *testing.T) { PageSize: 5, }, }, - []int64{21, 17, 16, 15, 14}, - 21, + []int64{22, 21, 17, 16, 15}, + 22, }, } for _, test := range tests { From 4f69a835ada096ff90fda9ece6f6f282a3cc9200 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 18:14:48 +0800 Subject: [PATCH 21/26] fix inconsistency --- models/fixtures/team_repo.yml | 6 ------ tests/integration/api_issue_test.go | 4 ++-- tests/integration/api_nodeinfo_test.go | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/models/fixtures/team_repo.yml b/models/fixtures/team_repo.yml index a29078107eeb4..e4b97278e7da5 100644 --- a/models/fixtures/team_repo.yml +++ b/models/fixtures/team_repo.yml @@ -69,9 +69,3 @@ org_id: 41 team_id: 21 repo_id: 61 - -- - id: 13 - org_id: 41 - team_id: 22 - repo_id: 61 diff --git a/tests/integration/api_issue_test.go b/tests/integration/api_issue_test.go index f80412e81cb25..2b78244a4b7c4 100644 --- a/tests/integration/api_issue_test.go +++ b/tests/integration/api_issue_test.go @@ -257,7 +257,7 @@ func TestAPISearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()).AddTokenAuth(token) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.EqualValues(t, "21", resp.Header().Get("X-Total-Count")) + assert.EqualValues(t, "22", resp.Header().Get("X-Total-Count")) assert.Len(t, apiIssues, 20) query.Add("limit", "10") @@ -265,7 +265,7 @@ func TestAPISearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()).AddTokenAuth(token) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.EqualValues(t, "21", resp.Header().Get("X-Total-Count")) + assert.EqualValues(t, "22", resp.Header().Get("X-Total-Count")) assert.Len(t, apiIssues, 10) query = url.Values{"assigned": {"true"}, "state": {"all"}} diff --git a/tests/integration/api_nodeinfo_test.go b/tests/integration/api_nodeinfo_test.go index 625feb431c9f5..75f8dbb4ba3aa 100644 --- a/tests/integration/api_nodeinfo_test.go +++ b/tests/integration/api_nodeinfo_test.go @@ -33,7 +33,7 @@ func TestNodeinfo(t *testing.T) { assert.True(t, nodeinfo.OpenRegistrations) assert.Equal(t, "gitea", nodeinfo.Software.Name) assert.Equal(t, 29, nodeinfo.Usage.Users.Total) - assert.Equal(t, 21, nodeinfo.Usage.LocalPosts) + assert.Equal(t, 22, nodeinfo.Usage.LocalPosts) assert.Equal(t, 3, nodeinfo.Usage.LocalComments) }) } From 8d2e121c57e2a9298a22cb3b26a1eed44e7f4e4e Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Wed, 7 Feb 2024 18:22:45 +0800 Subject: [PATCH 22/26] fix fixtures --- models/fixtures/access.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/models/fixtures/access.yml b/models/fixtures/access.yml index 641c453eb7760..f120e8e6bfad8 100644 --- a/models/fixtures/access.yml +++ b/models/fixtures/access.yml @@ -144,18 +144,6 @@ - id: 25 - user_id: 38 - repo_id: 61 - mode: 1 - -- - id: 26 - user_id: 39 - repo_id: 61 - mode: 1 - -- - id: 27 user_id: 40 repo_id: 61 mode: 4 From 9a1e2c5456d1289a81543ff8f97112be292f2cc2 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Thu, 8 Feb 2024 09:32:01 +0800 Subject: [PATCH 23/26] fix some test issues --- models/fixtures/access.yml | 12 ++++++++++++ models/fixtures/team.yml | 2 +- models/fixtures/team_repo.yml | 6 ++++++ models/fixtures/team_unit.yml | 6 +++--- tests/integration/api_issue_test.go | 4 ++-- tests/integration/api_org_test.go | 4 ++-- tests/integration/api_repo_test.go | 6 +++--- tests/integration/issue_test.go | 6 +++--- 8 files changed, 32 insertions(+), 14 deletions(-) diff --git a/models/fixtures/access.yml b/models/fixtures/access.yml index f120e8e6bfad8..04112abf10efa 100644 --- a/models/fixtures/access.yml +++ b/models/fixtures/access.yml @@ -147,3 +147,15 @@ user_id: 40 repo_id: 61 mode: 4 + +- + id: 26 + user_id: 39 + repo_id: 61 + mode: 1 + +- + id: 27 + user_id: 38 + repo_id: 61 + mode: 1 diff --git a/models/fixtures/team.yml b/models/fixtures/team.yml index c0b58975b265c..149fe90888b29 100644 --- a/models/fixtures/team.yml +++ b/models/fixtures/team.yml @@ -235,7 +235,7 @@ lower_name: team1 name: Team1 authorize: 1 # read - num_repos: 0 + num_repos: 1 num_members: 2 includes_all_repositories: false can_create_org_repo: false diff --git a/models/fixtures/team_repo.yml b/models/fixtures/team_repo.yml index e4b97278e7da5..a29078107eeb4 100644 --- a/models/fixtures/team_repo.yml +++ b/models/fixtures/team_repo.yml @@ -69,3 +69,9 @@ org_id: 41 team_id: 21 repo_id: 61 + +- + id: 13 + org_id: 41 + team_id: 22 + repo_id: 61 diff --git a/models/fixtures/team_unit.yml b/models/fixtures/team_unit.yml index 0f9634a1aed05..de0e8d738bbf8 100644 --- a/models/fixtures/team_unit.yml +++ b/models/fixtures/team_unit.yml @@ -309,16 +309,16 @@ id: 52 team_id: 22 type: 1 - access_mode: 2 + access_mode: 1 - id: 53 team_id: 22 type: 2 - access_mode: 2 + access_mode: 1 - id: 54 team_id: 22 type: 3 - access_mode: 2 + access_mode: 1 diff --git a/tests/integration/api_issue_test.go b/tests/integration/api_issue_test.go index 2b78244a4b7c4..650bac2e323a7 100644 --- a/tests/integration/api_issue_test.go +++ b/tests/integration/api_issue_test.go @@ -217,7 +217,7 @@ func TestAPISearchIssues(t *testing.T) { defer tests.PrepareTestEnv(t)() // as this API was used in the frontend, it uses UI page size - expectedIssueCount := 19 // from the fixtures + expectedIssueCount := 20 // from the fixtures if expectedIssueCount > setting.UI.IssuePagingNum { expectedIssueCount = setting.UI.IssuePagingNum } @@ -315,7 +315,7 @@ func TestAPISearchIssuesWithLabels(t *testing.T) { defer tests.PrepareTestEnv(t)() // as this API was used in the frontend, it uses UI page size - expectedIssueCount := 19 // from the fixtures + expectedIssueCount := 20 // from the fixtures if expectedIssueCount > setting.UI.IssuePagingNum { expectedIssueCount = setting.UI.IssuePagingNum } diff --git a/tests/integration/api_org_test.go b/tests/integration/api_org_test.go index 1cd82fe4e09ca..70d3a446f7688 100644 --- a/tests/integration/api_org_test.go +++ b/tests/integration/api_org_test.go @@ -177,7 +177,7 @@ func TestAPIGetAll(t *testing.T) { var apiOrgList []*api.Organization DecodeJSON(t, resp, &apiOrgList) - assert.Len(t, apiOrgList, 11) + assert.Len(t, apiOrgList, 12) assert.Equal(t, "Limited Org 36", apiOrgList[1].FullName) assert.Equal(t, "limited", apiOrgList[1].Visibility) @@ -186,7 +186,7 @@ func TestAPIGetAll(t *testing.T) { resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiOrgList) - assert.Len(t, apiOrgList, 7) + assert.Len(t, apiOrgList, 8) assert.Equal(t, "org 17", apiOrgList[0].FullName) assert.Equal(t, "public", apiOrgList[0].Visibility) } diff --git a/tests/integration/api_repo_test.go b/tests/integration/api_repo_test.go index 04c1f29649ea7..481732f8df446 100644 --- a/tests/integration/api_repo_test.go +++ b/tests/integration/api_repo_test.go @@ -93,9 +93,9 @@ func TestAPISearchRepo(t *testing.T) { }{ { name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50&private=false", expectedResults: expectedResults{ - nil: {count: 34}, - user: {count: 34}, - user2: {count: 34}, + nil: {count: 35}, + user: {count: 35}, + user2: {count: 35}, }, }, { diff --git a/tests/integration/issue_test.go b/tests/integration/issue_test.go index a0a948819299e..1985e5b836f03 100644 --- a/tests/integration/issue_test.go +++ b/tests/integration/issue_test.go @@ -407,7 +407,7 @@ func TestSearchIssues(t *testing.T) { session := loginUser(t, "user2") - expectedIssueCount := 19 // from the fixtures + expectedIssueCount := 20 // from the fixtures if expectedIssueCount > setting.UI.IssuePagingNum { expectedIssueCount = setting.UI.IssuePagingNum } @@ -444,7 +444,7 @@ func TestSearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()) resp = session.MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.EqualValues(t, "21", resp.Header().Get("X-Total-Count")) + assert.EqualValues(t, "22", resp.Header().Get("X-Total-Count")) assert.Len(t, apiIssues, 20) query.Add("limit", "5") @@ -452,7 +452,7 @@ func TestSearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()) resp = session.MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.EqualValues(t, "21", resp.Header().Get("X-Total-Count")) + assert.EqualValues(t, "22", resp.Header().Get("X-Total-Count")) assert.Len(t, apiIssues, 5) query = url.Values{"assigned": {"true"}, "state": {"all"}} From e08539f17ae8e52a12e1a1a47ee45e5d65417baf Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Thu, 8 Feb 2024 09:43:28 +0800 Subject: [PATCH 24/26] fix access --- models/fixtures/access.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/models/fixtures/access.yml b/models/fixtures/access.yml index 04112abf10efa..641c453eb7760 100644 --- a/models/fixtures/access.yml +++ b/models/fixtures/access.yml @@ -144,9 +144,9 @@ - id: 25 - user_id: 40 + user_id: 38 repo_id: 61 - mode: 4 + mode: 1 - id: 26 @@ -156,6 +156,6 @@ - id: 27 - user_id: 38 + user_id: 40 repo_id: 61 - mode: 1 + mode: 4 From a8ef1b3e9c7ade7d903bcf49860365d6239140a9 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Thu, 8 Feb 2024 10:03:37 +0800 Subject: [PATCH 25/26] fix issue_test --- tests/integration/issue_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/issue_test.go b/tests/integration/issue_test.go index 1985e5b836f03..44d362d9c76af 100644 --- a/tests/integration/issue_test.go +++ b/tests/integration/issue_test.go @@ -501,7 +501,7 @@ func TestSearchIssues(t *testing.T) { func TestSearchIssuesWithLabels(t *testing.T) { defer tests.PrepareTestEnv(t)() - expectedIssueCount := 19 // from the fixtures + expectedIssueCount := 20 // from the fixtures if expectedIssueCount > setting.UI.IssuePagingNum { expectedIssueCount = setting.UI.IssuePagingNum } From 40d61de8604add422ccefbb1e3fbb7137946850f Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Thu, 8 Feb 2024 10:45:25 +0800 Subject: [PATCH 26/26] remove the org email from fixtures --- models/fixtures/email_address.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/models/fixtures/email_address.yml b/models/fixtures/email_address.yml index 60277d4eca754..b2a043263580f 100644 --- a/models/fixtures/email_address.yml +++ b/models/fixtures/email_address.yml @@ -317,11 +317,3 @@ lower_email: user40@example.com is_activated: true is_primary: true - -- - id: 41 - uid: 41 - email: org41@example.com - lower_email: org41@example.com - is_activated: true - is_primary: true