From 096459e2c2c8e3c17eb6e677091990adffe9af7d Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 29 Mar 2023 02:40:49 +0000 Subject: Add latest changes from gitlab-org/gitlab@15-10-stable-ee --- app/graphql/resolvers/issues_resolver.rb | 18 ++++++++++++++--- doc/api/graphql/reference/index.md | 1 + 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): | `iid` | [`String`](#string) | IID of the issue. For example, "1". | | `iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. | | `in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument.'. | +| `includeArchived` | [`Boolean`](#boolean) | Whether to include issues from archived projects. Defaults to `false`. | | `includeSubepics` | [`Boolean`](#boolean) | Whether to include subepics when filtering issues by epicId. | | `iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. | | `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) { {} } -- cgit v1.2.1