summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-03-29 02:40:49 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2023-03-29 02:40:49 +0000
commit096459e2c2c8e3c17eb6e677091990adffe9af7d (patch)
tree9f44c72618d2559c131aa31f3d293b2dbd1a8d3c
parenta082c45f16bf30bef6e82defa75901375287d467 (diff)
downloadgitlab-ce-096459e2c2c8e3c17eb6e677091990adffe9af7d.tar.gz
Add latest changes from gitlab-org/gitlab@15-10-stable-ee
-rw-r--r--app/graphql/resolvers/issues_resolver.rb18
-rw-r--r--doc/api/graphql/reference/index.md1
-rw-r--r--spec/requests/api/graphql/issues_spec.rb34
3 files changed, 50 insertions, 3 deletions
diff --git a/app/graphql/resolvers/issues_resolver.rb b/app/graphql/resolvers/issues_resolver.rb
index bbf45efa33e..17e3e159a5b 100644
--- a/app/graphql/resolvers/issues_resolver.rb
+++ b/app/graphql/resolvers/issues_resolver.rb
@@ -2,14 +2,19 @@
module Resolvers
class IssuesResolver < Issues::BaseResolver
+ extend ::Gitlab::Utils::Override
prepend ::Issues::LookAheadPreloads
include ::Issues::SortArguments
- NON_FILTER_ARGUMENTS = %i[sort lookahead].freeze
+ NON_FILTER_ARGUMENTS = %i[sort lookahead include_archived].freeze
+ argument :include_archived, GraphQL::Types::Boolean,
+ required: false,
+ default_value: false,
+ description: 'Whether to include issues from archived projects. Defaults to `false`.'
argument :state, Types::IssuableStateEnum,
- required: false,
- description: 'Current state of this issue.'
+ required: false,
+ description: 'Current state of this issue.'
# see app/graphql/types/issue_connection.rb
type 'Types::IssueConnection', null: true
@@ -44,6 +49,13 @@ module Resolvers
private
+ override :prepare_finder_params
+ def prepare_finder_params(args)
+ super.tap do |prepared|
+ prepared[:non_archived] = !prepared.delete(:include_archived)
+ end
+ end
+
def filter_provided?(args)
args.except(*NON_FILTER_ARGUMENTS).values.any?(&:present?)
end
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 27da9f2b653..bcd7c9dde44 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -270,6 +270,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="queryissuesiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="queryissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
| <a id="queryissuesin"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument.'. |
+| <a id="queryissuesincludearchived"></a>`includeArchived` | [`Boolean`](#boolean) | Whether to include issues from archived projects. Defaults to `false`. |
| <a id="queryissuesincludesubepics"></a>`includeSubepics` | [`Boolean`](#boolean) | Whether to include subepics when filtering issues by epicId. |
| <a id="queryissuesiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
| <a id="queryissuesiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
diff --git a/spec/requests/api/graphql/issues_spec.rb b/spec/requests/api/graphql/issues_spec.rb
index e437e1bbcb0..a12049a9b2e 100644
--- a/spec/requests/api/graphql/issues_spec.rb
+++ b/spec/requests/api/graphql/issues_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
let_it_be(:project_b) { create(:project, :repository, :private, group: group1) }
let_it_be(:project_c) { create(:project, :repository, :public, group: group2) }
let_it_be(:project_d) { create(:project, :repository, :private, group: group2) }
+ let_it_be(:archived_project) { create(:project, :repository, :archived, group: group2) }
let_it_be(:milestone1) { create(:milestone, project: project_c, due_date: 10.days.from_now) }
let_it_be(:milestone2) { create(:milestone, project: project_d, due_date: 20.days.from_now) }
let_it_be(:milestone3) { create(:milestone, project: project_d, due_date: 30.days.from_now) }
@@ -83,6 +84,7 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
)
end
+ let_it_be(:archived_issue) { create(:issue, project: archived_project) }
let_it_be(:issues, reload: true) { [issue_a, issue_b, issue_c, issue_d, issue_e] }
# we need to always provide at least one filter to the query so it doesn't fail
let_it_be(:base_params) { { iids: issues.map { |issue| issue.iid.to_s } } }
@@ -109,6 +111,38 @@ RSpec.describe 'getting an issue list at root level', feature_category: :team_pl
end
end
+ describe 'includeArchived filter' do
+ let(:base_params) { { iids: [archived_issue.iid.to_s] } }
+
+ it 'excludes issues from archived projects' do
+ post_query
+
+ issue_ids = graphql_dig_at(graphql_data_at('issues', 'nodes'), :id)
+
+ expect(issue_ids).not_to include(archived_issue.to_gid.to_s)
+ end
+
+ context 'when includeArchived is true' do
+ let(:issue_filter_params) { { include_archived: true } }
+
+ it 'includes issues from archived projects' do
+ post_query
+
+ issue_ids = graphql_dig_at(graphql_data_at('issues', 'nodes'), :id)
+
+ expect(issue_ids).to include(archived_issue.to_gid.to_s)
+ end
+ end
+ end
+
+ it 'excludes issues from archived projects' do
+ post_query
+
+ issue_ids = graphql_dig_at(graphql_data_at('issues', 'nodes'), :id)
+
+ expect(issue_ids).not_to include(archived_issue.to_gid.to_s)
+ end
+
context 'when no filters are provided' do
let(:all_query_params) { {} }