From 8a05ad79ff51f3da321d9e81c3a0050b4ea113cb Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 8 May 2022 06:50:16 +0200 Subject: [PATCH 1/5] Fix issue overview for teams - Don't use hacky solution to limit to the correct RepoID's, instead use current code to handle these limits. The existing code is more correct than the hacky solution. - Resolves #19636 --- models/issue.go | 69 ++++++++++++++++++++++++++++++++-------- routers/web/user/home.go | 20 +++--------- 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/models/issue.go b/models/issue.go index 98e64adafd226..34e2d5fcfa271 100644 --- a/models/issue.go +++ b/models/issue.go @@ -1241,7 +1241,7 @@ func sortIssuesSession(sess *xorm.Session, sortType string, priorityRepoID int64 } } -func (opts *IssuesOptions) setupSessionWithLimit(sess *xorm.Session) { +func (opts *IssuesOptions) setupSessionWithLimit(sess *xorm.Session) error { if opts.Page >= 0 && opts.PageSize > 0 { var start int if opts.Page == 0 { @@ -1251,10 +1251,10 @@ func (opts *IssuesOptions) setupSessionWithLimit(sess *xorm.Session) { } sess.Limit(opts.PageSize, start) } - opts.setupSessionNoLimit(sess) + return opts.setupSessionNoLimit(sess) } -func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) { +func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) error { if len(opts.IssueIDs) > 0 { sess.In("issue.id", opts.IssueIDs) } @@ -1348,14 +1348,17 @@ func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) { } if opts.User != nil { - sess.And( - issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.IsTrue()), - ) + repoCond, err := issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.IsTrue()) + if err != nil { + return err + } + sess.And(repoCond) } + return nil } // issuePullAccessibleRepoCond userID must not be zero, this condition require join repository table -func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organization.Organization, team *organization.Team, isPull bool) builder.Cond { +func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organization.Organization, team *organization.Team, isPull bool) (builder.Cond, error) { cond := builder.NewCond() unitType := unit.TypeIssues if isPull { @@ -1363,7 +1366,32 @@ func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organizati } if org != nil { if team != nil { - cond = cond.And(teamUnitsRepoCond(repoIDstr, userID, org.ID, team.ID, unitType)) // special team member repos + // If the current user is a admin, it doesn't necesarly mean + // it has joined the team, but we still should return all repo's + // of that team. + isAdmin, err := org.IsOwnedBy(userID) + if err != nil { + return nil, err + } + if isAdmin { + cond = cond.And(builder.In(repoIDstr, + builder.Select("repo_id").From("team_repo").Where( + builder.Eq{ + "team_id": team.ID, + }.And( + builder.In( + "team_id", builder.Select("team_id").From("team_unit").Where( + builder.Eq{ + "`team_unit`.org_id": org.ID, + "`team_unit`.type": unitType, + }, + ), + ), + ), + ))) + } else { + cond = cond.And(teamUnitsRepoCond(repoIDstr, userID, org.ID, team.ID, unitType)) // special team member repos + } } else { cond = cond.And( builder.Or( @@ -1383,7 +1411,7 @@ func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organizati ), ) } - return cond + return cond, nil } func applyAssigneeCondition(sess *xorm.Session, assigneeID int64) *xorm.Session { @@ -1416,7 +1444,9 @@ func CountIssuesByRepo(opts *IssuesOptions) (map[int64]int64, error) { sess := e.Join("INNER", "repository", "`issue`.repo_id = `repository`.id") - opts.setupSessionNoLimit(sess) + if err := opts.setupSessionNoLimit(sess); err != nil { + return nil, fmt.Errorf("setupSessionNoLimit: %v", err) + } countsSlice := make([]*struct { RepoID int64 @@ -1443,7 +1473,9 @@ func GetRepoIDsForIssuesOptions(opts *IssuesOptions, user *user_model.User) ([]i sess := e.Join("INNER", "repository", "`issue`.repo_id = `repository`.id") - opts.setupSessionNoLimit(sess) + if err := opts.setupSessionNoLimit(sess); err != nil { + return nil, fmt.Errorf("setupSessionNoLimit: %v", err) + } accessCond := accessibleRepositoryCondition(user) if err := sess.Where(accessCond). @@ -1461,7 +1493,9 @@ func Issues(opts *IssuesOptions) ([]*Issue, error) { e := db.GetEngine(db.DefaultContext) sess := e.Join("INNER", "repository", "`issue`.repo_id = `repository`.id") - opts.setupSessionWithLimit(sess) + if err := opts.setupSessionWithLimit(sess); err != nil { + return nil, fmt.Errorf("setupSessionWithLimit: %v", err) + } sortIssuesSession(sess, opts.SortType, opts.PriorityRepoID) issues := make([]*Issue, 0, opts.ListOptions.PageSize) @@ -1482,7 +1516,10 @@ func CountIssues(opts *IssuesOptions) (int64, error) { sess := e.Select("COUNT(issue.id) AS count").Table("issue") sess.Join("INNER", "repository", "`issue`.repo_id = `repository`.id") - opts.setupSessionNoLimit(sess) + if err := opts.setupSessionNoLimit(sess); err != nil { + return 0, fmt.Errorf("setupSessionNoLimit: %v", err) + } + return sess.Count() } @@ -1709,7 +1746,11 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) { } if opts.UserID > 0 { - cond = cond.And(issuePullAccessibleRepoCond("issue.repo_id", opts.UserID, opts.Org, opts.Team, opts.IsPull)) + repoCond, err := issuePullAccessibleRepoCond("issue.repo_id", opts.UserID, opts.Org, opts.Team, opts.IsPull) + if err != nil { + return nil, err + } + cond = cond.And(repoCond) } sess := func(cond builder.Cond) *xorm.Session { diff --git a/routers/web/user/home.go b/routers/web/user/home.go index 2e7b382de6918..37f6b88352f74 100644 --- a/routers/web/user/home.go +++ b/routers/web/user/home.go @@ -443,12 +443,13 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { AllLimited: false, } - if ctxUser.IsOrganization() && ctx.Org.Team != nil { - repoOpts.TeamID = ctx.Org.Team.ID + if team != nil { + repoOpts.TeamID = team.ID } switch filterMode { case models.FilterModeAll: + case models.FilterModeYourRepositories: case models.FilterModeAssign: opts.AssigneeID = ctx.Doer.ID case models.FilterModeCreate: @@ -457,13 +458,6 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { opts.MentionedID = ctx.Doer.ID case models.FilterModeReviewRequested: opts.ReviewRequestedID = ctx.Doer.ID - case models.FilterModeYourRepositories: - if ctxUser.IsOrganization() && ctx.Org.Team != nil { - // Fixes a issue whereby the user's ID would be used - // to check if it's in the team(which possible isn't the case). - opts.User = nil - } - opts.RepoCond = models.SearchRepositoryCondition(repoOpts) } // keyword holds the search term entered into the search field. @@ -595,13 +589,7 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { Org: org, Team: team, } - if filterMode == models.FilterModeYourRepositories { - statsOpts.RepoCond = models.SearchRepositoryCondition(repoOpts) - } - // Detect when we only should search by team. - if opts.User == nil { - statsOpts.UserID = 0 - } + issueStats, err = models.GetUserIssueStats(statsOpts) if err != nil { ctx.ServerError("GetUserIssueStats Shown", err) From 1bd341bd152e9722cd934f95f39e2da6275f7740 Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 8 May 2022 22:21:03 +0200 Subject: [PATCH 2/5] Use inline SQL --- models/issue.go | 67 +++++++++------------------------------------ models/repo_list.go | 23 +++++++++++++--- 2 files changed, 32 insertions(+), 58 deletions(-) diff --git a/models/issue.go b/models/issue.go index 34e2d5fcfa271..031be8f3a6914 100644 --- a/models/issue.go +++ b/models/issue.go @@ -1241,7 +1241,7 @@ func sortIssuesSession(sess *xorm.Session, sortType string, priorityRepoID int64 } } -func (opts *IssuesOptions) setupSessionWithLimit(sess *xorm.Session) error { +func (opts *IssuesOptions) setupSessionWithLimit(sess *xorm.Session) { if opts.Page >= 0 && opts.PageSize > 0 { var start int if opts.Page == 0 { @@ -1251,10 +1251,10 @@ func (opts *IssuesOptions) setupSessionWithLimit(sess *xorm.Session) error { } sess.Limit(opts.PageSize, start) } - return opts.setupSessionNoLimit(sess) + opts.setupSessionNoLimit(sess) } -func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) error { +func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) { if len(opts.IssueIDs) > 0 { sess.In("issue.id", opts.IssueIDs) } @@ -1348,17 +1348,12 @@ func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) error { } if opts.User != nil { - repoCond, err := issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.IsTrue()) - if err != nil { - return err - } - sess.And(repoCond) + sess.And(issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.IsTrue())) } - return nil } // issuePullAccessibleRepoCond userID must not be zero, this condition require join repository table -func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organization.Organization, team *organization.Team, isPull bool) (builder.Cond, error) { +func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organization.Organization, team *organization.Team, isPull bool) builder.Cond { cond := builder.NewCond() unitType := unit.TypeIssues if isPull { @@ -1366,32 +1361,7 @@ func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organizati } if org != nil { if team != nil { - // If the current user is a admin, it doesn't necesarly mean - // it has joined the team, but we still should return all repo's - // of that team. - isAdmin, err := org.IsOwnedBy(userID) - if err != nil { - return nil, err - } - if isAdmin { - cond = cond.And(builder.In(repoIDstr, - builder.Select("repo_id").From("team_repo").Where( - builder.Eq{ - "team_id": team.ID, - }.And( - builder.In( - "team_id", builder.Select("team_id").From("team_unit").Where( - builder.Eq{ - "`team_unit`.org_id": org.ID, - "`team_unit`.type": unitType, - }, - ), - ), - ), - ))) - } else { - cond = cond.And(teamUnitsRepoCond(repoIDstr, userID, org.ID, team.ID, unitType)) // special team member repos - } + cond = cond.And(teamUnitsRepoCond(repoIDstr, userID, org.ID, team.ID, unitType)) // special team member repos } else { cond = cond.And( builder.Or( @@ -1411,7 +1381,7 @@ func issuePullAccessibleRepoCond(repoIDstr string, userID int64, org *organizati ), ) } - return cond, nil + return cond } func applyAssigneeCondition(sess *xorm.Session, assigneeID int64) *xorm.Session { @@ -1444,9 +1414,7 @@ func CountIssuesByRepo(opts *IssuesOptions) (map[int64]int64, error) { sess := e.Join("INNER", "repository", "`issue`.repo_id = `repository`.id") - if err := opts.setupSessionNoLimit(sess); err != nil { - return nil, fmt.Errorf("setupSessionNoLimit: %v", err) - } + opts.setupSessionNoLimit(sess) countsSlice := make([]*struct { RepoID int64 @@ -1473,9 +1441,7 @@ func GetRepoIDsForIssuesOptions(opts *IssuesOptions, user *user_model.User) ([]i sess := e.Join("INNER", "repository", "`issue`.repo_id = `repository`.id") - if err := opts.setupSessionNoLimit(sess); err != nil { - return nil, fmt.Errorf("setupSessionNoLimit: %v", err) - } + opts.setupSessionNoLimit(sess) accessCond := accessibleRepositoryCondition(user) if err := sess.Where(accessCond). @@ -1493,9 +1459,8 @@ func Issues(opts *IssuesOptions) ([]*Issue, error) { e := db.GetEngine(db.DefaultContext) sess := e.Join("INNER", "repository", "`issue`.repo_id = `repository`.id") - if err := opts.setupSessionWithLimit(sess); err != nil { - return nil, fmt.Errorf("setupSessionWithLimit: %v", err) - } + opts.setupSessionWithLimit(sess) + sortIssuesSession(sess, opts.SortType, opts.PriorityRepoID) issues := make([]*Issue, 0, opts.ListOptions.PageSize) @@ -1516,9 +1481,7 @@ func CountIssues(opts *IssuesOptions) (int64, error) { sess := e.Select("COUNT(issue.id) AS count").Table("issue") sess.Join("INNER", "repository", "`issue`.repo_id = `repository`.id") - if err := opts.setupSessionNoLimit(sess); err != nil { - return 0, fmt.Errorf("setupSessionNoLimit: %v", err) - } + opts.setupSessionNoLimit(sess) return sess.Count() } @@ -1746,11 +1709,7 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) { } if opts.UserID > 0 { - repoCond, err := issuePullAccessibleRepoCond("issue.repo_id", opts.UserID, opts.Org, opts.Team, opts.IsPull) - if err != nil { - return nil, err - } - cond = cond.And(repoCond) + cond = cond.And(issuePullAccessibleRepoCond("issue.repo_id", opts.UserID, opts.Org, opts.Team, opts.IsPull)) } sess := func(cond builder.Cond) *xorm.Session { diff --git a/models/repo_list.go b/models/repo_list.go index 2c6be0a5768ac..3af0a18fe8a23 100644 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -9,6 +9,7 @@ import ( "strings" "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" "code.gitea.io/gitea/models/perm" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" @@ -237,11 +238,25 @@ func teamUnitsRepoCond(id string, userID, orgID, teamID int64, units ...unit.Typ builder.Eq{ "team_id": teamID, }.And( - builder.In( - "team_id", builder.Select("team_id").From("team_user").Where( - builder.Eq{ + builder.Or( + // Check if the user is member of the team. + builder.In( + "team_id", builder.Select("team_id").From("team_user").Where( + builder.Eq{ + "uid": userID, + }, + ), + ), + builder.Exists(builder.Select("team_id").From("team_user"). + Where(builder.Eq{ + "org_id": orgID, + "team_id": builder.Select("id").From("team").Where( + builder.Eq{ + "org_id": orgID, + "lower_name": strings.ToLower(organization.OwnerTeamName), + }), "uid": userID, - }, + }), ), )).And( builder.In( From 6d0ea61dd075cde4b2067a22b2fab030c52755dc Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 8 May 2022 22:21:25 +0200 Subject: [PATCH 3/5] Add comment --- models/repo_list.go | 1 + 1 file changed, 1 insertion(+) diff --git a/models/repo_list.go b/models/repo_list.go index 3af0a18fe8a23..04f51e0b1c9ad 100644 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -247,6 +247,7 @@ func teamUnitsRepoCond(id string, userID, orgID, teamID int64, units ...unit.Typ }, ), ), + // Check if the user is in the owner team of the organisation. builder.Exists(builder.Select("team_id").From("team_user"). Where(builder.Eq{ "org_id": orgID, From 50e61afdc3eb0c2ccc6ccb7955320cb1c78a4f52 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 10 May 2022 14:54:07 +0200 Subject: [PATCH 4/5] Add test-case --- models/fixtures/issue.yml | 24 ++++++++++++++++++++++++ models/fixtures/issue_assignees.yml | 4 ++++ models/fixtures/issue_index.yml | 5 ++++- models/fixtures/repository.yml | 2 +- models/fixtures/team_unit.yml | 1 + models/issue_test.go | 19 +++++++++++++++++-- 6 files changed, 51 insertions(+), 4 deletions(-) diff --git a/models/fixtures/issue.yml b/models/fixtures/issue.yml index d5738d5db43f9..39dacc92ffd98 100644 --- a/models/fixtures/issue.yml +++ b/models/fixtures/issue.yml @@ -184,3 +184,27 @@ is_pull: false created_unix: 1602935696 updated_unix: 1602935696 + +- + id: 16 + repo_id: 32 + index: 1 + poster_id: 2 + name: just a normal issue + content: content + is_closed: false + is_pull: false + created_unix: 1602935696 + updated_unix: 1602935696 + +- + id: 17 + repo_id: 32 + index: 2 + poster_id: 15 + name: a issue with a assignment + content: content + is_closed: false + is_pull: false + created_unix: 1602935696 + updated_unix: 1602935696 diff --git a/models/fixtures/issue_assignees.yml b/models/fixtures/issue_assignees.yml index 2e89b2b0b3a4a..e5d36f921a7e0 100644 --- a/models/fixtures/issue_assignees.yml +++ b/models/fixtures/issue_assignees.yml @@ -10,3 +10,7 @@ id: 3 assignee_id: 2 issue_id: 6 +- + id: 4 + assignee_id: 2 + issue_id: 17 diff --git a/models/fixtures/issue_index.yml b/models/fixtures/issue_index.yml index 49d95c57ab777..de6e955804ab6 100644 --- a/models/fixtures/issue_index.yml +++ b/models/fixtures/issue_index.yml @@ -10,6 +10,9 @@ - group_id: 10 max_index: 1 +- + group_id: 32 + max_index: 2 - group_id: 48 max_index: 1 @@ -21,4 +24,4 @@ max_index: 1 - group_id: 51 - max_index: 1 \ No newline at end of file + max_index: 1 diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index 475cda3b55e24..450c2f26af0fa 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -483,7 +483,7 @@ is_private: false num_stars: 0 num_forks: 0 - num_issues: 0 + num_issues: 2 is_mirror: false status: 0 diff --git a/models/fixtures/team_unit.yml b/models/fixtures/team_unit.yml index 66f0d22efdfe5..2e23a6312919b 100644 --- a/models/fixtures/team_unit.yml +++ b/models/fixtures/team_unit.yml @@ -252,6 +252,7 @@ - id: 43 + org_id: 3 team_id: 7 type: 2 # issues access_mode: 2 diff --git a/models/issue_test.go b/models/issue_test.go index 9b82fc80fb66d..9a8b7bd5338bb 100644 --- a/models/issue_test.go +++ b/models/issue_test.go @@ -16,6 +16,7 @@ import ( "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/foreignreference" issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/organization" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" @@ -287,6 +288,20 @@ func TestGetUserIssueStats(t *testing.T) { ClosedCount: 0, }, }, + { + UserIssueStatsOptions{ + UserID: 2, + Org: unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3}).(*organization.Organization), + Team: unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 7}).(*organization.Team), + FilterMode: FilterModeAll, + }, + IssueStats{ + YourRepositoriesCount: 2, + AssignCount: 1, + CreateCount: 1, + OpenCount: 2, + }, + }, } { t.Run(fmt.Sprintf("%#v", test.Opts), func(t *testing.T) { stats, err := GetUserIssueStats(test.Opts) @@ -341,7 +356,7 @@ func TestGetRepoIDsForIssuesOptions(t *testing.T) { IssuesOptions{ AssigneeID: 2, }, - []int64{3}, + []int64{3, 32}, }, { IssuesOptions{ @@ -595,5 +610,5 @@ func TestCountIssues(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) count, err := CountIssues(&IssuesOptions{}) assert.NoError(t, err) - assert.EqualValues(t, 15, count) + assert.EqualValues(t, 17, count) } From 0d8f89ce0be883cbf55f81ad90216c6828288a43 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 10 May 2022 22:44:10 +0200 Subject: [PATCH 5/5] Fix tests --- integrations/api_issue_test.go | 8 ++++---- integrations/api_nodeinfo_test.go | 2 +- integrations/issue_test.go | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/integrations/api_issue_test.go b/integrations/api_issue_test.go index 5ed5a0ad99db9..cc7d8d6bd5f24 100644 --- a/integrations/api_issue_test.go +++ b/integrations/api_issue_test.go @@ -209,7 +209,7 @@ func TestAPISearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.EqualValues(t, "15", resp.Header().Get("X-Total-Count")) + assert.EqualValues(t, "17", resp.Header().Get("X-Total-Count")) assert.Len(t, apiIssues, 10) // there are more but 10 is page item limit query.Add("limit", "20") @@ -217,14 +217,14 @@ func TestAPISearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.Len(t, apiIssues, 15) + assert.Len(t, apiIssues, 17) query = url.Values{"assigned": {"true"}, "state": {"all"}, "token": {token}} link.RawQuery = query.Encode() req = NewRequest(t, "GET", link.String()) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.Len(t, apiIssues, 1) + assert.Len(t, apiIssues, 2) query = url.Values{"milestones": {"milestone1"}, "state": {"all"}, "token": {token}} link.RawQuery = query.Encode() @@ -252,7 +252,7 @@ func TestAPISearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.Len(t, apiIssues, 3) + assert.Len(t, apiIssues, 5) query = url.Values{"owner": {"user3"}, "team": {"team1"}, "token": {token}} // organization + team link.RawQuery = query.Encode() diff --git a/integrations/api_nodeinfo_test.go b/integrations/api_nodeinfo_test.go index 822dbf3f0e95d..c2fcd2fea5619 100644 --- a/integrations/api_nodeinfo_test.go +++ b/integrations/api_nodeinfo_test.go @@ -29,7 +29,7 @@ func TestNodeinfo(t *testing.T) { assert.True(t, nodeinfo.OpenRegistrations) assert.Equal(t, "gitea", nodeinfo.Software.Name) assert.Equal(t, 23, nodeinfo.Usage.Users.Total) - assert.Equal(t, 15, nodeinfo.Usage.LocalPosts) + assert.Equal(t, 17, nodeinfo.Usage.LocalPosts) assert.Equal(t, 2, nodeinfo.Usage.LocalComments) }) } diff --git a/integrations/issue_test.go b/integrations/issue_test.go index c6b801c9a6a9b..8e04b99d5ec89 100644 --- a/integrations/issue_test.go +++ b/integrations/issue_test.go @@ -392,7 +392,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, "15", resp.Header().Get("X-Total-Count")) + assert.EqualValues(t, "17", resp.Header().Get("X-Total-Count")) assert.Len(t, apiIssues, 10) // there are more but 10 is page item limit query.Add("limit", "20") @@ -400,14 +400,14 @@ func TestSearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()) resp = session.MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.Len(t, apiIssues, 15) + assert.Len(t, apiIssues, 17) query = url.Values{"assigned": {"true"}, "state": {"all"}} link.RawQuery = query.Encode() req = NewRequest(t, "GET", link.String()) resp = session.MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.Len(t, apiIssues, 1) + assert.Len(t, apiIssues, 2) query = url.Values{"milestones": {"milestone1"}, "state": {"all"}} link.RawQuery = query.Encode() @@ -435,7 +435,7 @@ func TestSearchIssues(t *testing.T) { req = NewRequest(t, "GET", link.String()) resp = session.MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &apiIssues) - assert.Len(t, apiIssues, 3) + assert.Len(t, apiIssues, 5) query = url.Values{"owner": {"user3"}, "team": {"team1"}} // organization + team link.RawQuery = query.Encode()