diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-29 02:40:49 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-29 02:40:49 +0000 |
commit | 096459e2c2c8e3c17eb6e677091990adffe9af7d (patch) | |
tree | 9f44c72618d2559c131aa31f3d293b2dbd1a8d3c | |
parent | a082c45f16bf30bef6e82defa75901375287d467 (diff) | |
download | gitlab-ce-096459e2c2c8e3c17eb6e677091990adffe9af7d.tar.gz |
Add latest changes from gitlab-org/gitlab@15-10-stable-ee
-rw-r--r-- | app/graphql/resolvers/issues_resolver.rb | 18 | ||||
-rw-r--r-- | doc/api/graphql/reference/index.md | 1 | ||||
-rw-r--r-- | spec/requests/api/graphql/issues_spec.rb | 34 |
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) { {} } |