diff --git a/app/graphql/types/merge_request_state_enum.rb b/app/graphql/types/merge_request_state_enum.rb index bcf18b836de1e4ad557515d677ba957884493347..e03b79dfeb842bdd06076c381f0f04569b52337f 100644 --- a/app/graphql/types/merge_request_state_enum.rb +++ b/app/graphql/types/merge_request_state_enum.rb @@ -5,6 +5,7 @@ class MergeRequestStateEnum < IssuableStateEnum graphql_name 'MergeRequestState' description 'State of a GitLab merge request' - value 'merged', description: "Merge request has been merged." + value 'merged', description: 'Merge request has been merged.' + value 'opened', description: 'Opened merge request.' end end diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 17868bb33a3714c810162e1ff22c782871f86a24..3333af965b689568f6bd709501cd57194bc6a1ad 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -13199,6 +13199,8 @@ Represents the total number of issues and their weights for a particular day. | <a id="cicatalogresourceid"></a>`id` **{warning-solid}** | [`ID!`](#id) | **Introduced** in 15.11. This feature is an Experiment. It can be changed or removed at any time. ID of the catalog resource. | | <a id="cicatalogresourcelatestversion"></a>`latestVersion` **{warning-solid}** | [`Release`](#release) | **Introduced** in 16.1. This feature is an Experiment. It can be changed or removed at any time. Latest version of the catalog resource. | | <a id="cicatalogresourcename"></a>`name` **{warning-solid}** | [`String`](#string) | **Introduced** in 15.11. This feature is an Experiment. It can be changed or removed at any time. Name of the catalog resource. | +| <a id="cicatalogresourceopenissuescount"></a>`openIssuesCount` **{warning-solid}** | [`Int!`](#int) | **Introduced** in 16.3. This feature is an Experiment. It can be changed or removed at any time. Count of open issues that belong to the the catalog resource. | +| <a id="cicatalogresourceopenmergerequestscount"></a>`openMergeRequestsCount` **{warning-solid}** | [`Int!`](#int) | **Introduced** in 16.3. This feature is an Experiment. It can be changed or removed at any time. Count of open merge requests that belong to the the catalog resource. | | <a id="cicatalogresourcereadmehtml"></a>`readmeHtml` **{warning-solid}** | [`String!`](#string) | **Introduced** in 16.1. This feature is an Experiment. It can be changed or removed at any time. GitLab Flavored Markdown rendering of `readme`. | | <a id="cicatalogresourcerootnamespace"></a>`rootNamespace` **{warning-solid}** | [`Namespace`](#namespace) | **Introduced** in 16.1. This feature is an Experiment. It can be changed or removed at any time. Root namespace of the catalog resource. | | <a id="cicatalogresourcestarcount"></a>`starCount` **{warning-solid}** | [`Int!`](#int) | **Introduced** in 16.1. This feature is an Experiment. It can be changed or removed at any time. Number of times the catalog resource has been starred. | @@ -26576,7 +26578,7 @@ State of a GitLab merge request. | <a id="mergerequeststateclosed"></a>`closed` | In closed state. | | <a id="mergerequeststatelocked"></a>`locked` | Discussion has been locked. | | <a id="mergerequeststatemerged"></a>`merged` | Merge request has been merged. | -| <a id="mergerequeststateopened"></a>`opened` | In open state. | +| <a id="mergerequeststateopened"></a>`opened` | Opened merge request. | ### `MergeStatus` diff --git a/ee/app/graphql/types/ci/catalog/resource_type.rb b/ee/app/graphql/types/ci/catalog/resource_type.rb index 773dbf7677d78d1c9763a6392bbb367e42e55271..99067d4308a9ab9ec10e3bc31c5f96304706a80b 100644 --- a/ee/app/graphql/types/ci/catalog/resource_type.rb +++ b/ee/app/graphql/types/ci/catalog/resource_type.rb @@ -9,6 +9,14 @@ class ResourceType < BaseObject connection_type_class(Types::CountableConnectionType) + field :open_issues_count, GraphQL::Types::Int, null: false, + description: 'Count of open issues that belong to the the catalog resource.', + alpha: { milestone: '16.3' } + + field :open_merge_requests_count, GraphQL::Types::Int, null: false, + description: 'Count of open merge requests that belong to the the catalog resource.', + alpha: { milestone: '16.3' } + field :id, GraphQL::Types::ID, null: false, description: 'ID of the catalog resource.', alpha: { milestone: '15.11' } @@ -48,6 +56,14 @@ class ResourceType < BaseObject markdown_field :readme_html, null: false, alpha: { milestone: '16.1' } + def open_issues_count + BatchLoader::GraphQL.wrap(object.project.open_issues_count) + end + + def open_merge_requests_count + BatchLoader::GraphQL.wrap(object.project.open_merge_requests_count) + end + def web_path ::Gitlab::Routing.url_helpers.project_path(object.project) end diff --git a/ee/spec/graphql/types/ci/catalog/resource_type_spec.rb b/ee/spec/graphql/types/ci/catalog/resource_type_spec.rb index 85e18cf55c503f0ac94bf862067913d47b41e3f4..7c94fe2213a5ffe144a930923b09d2eb373b34a4 100644 --- a/ee/spec/graphql/types/ci/catalog/resource_type_spec.rb +++ b/ee/spec/graphql/types/ci/catalog/resource_type_spec.rb @@ -18,6 +18,8 @@ forks_count root_namespace readme_html + open_issues_count + open_merge_requests_count ] expect(described_class).to have_graphql_fields(*expected_fields) diff --git a/ee/spec/requests/api/graphql/ci/catalog/resource_spec.rb b/ee/spec/requests/api/graphql/ci/catalog/resource_spec.rb index 4b5cc3c900fb960329190b95e807cd5734be7e56..77110fd0256606d2bf0d49fcf1b79b54a01395cb 100644 --- a/ee/spec/requests/api/graphql/ci/catalog/resource_spec.rb +++ b/ee/spec/requests/api/graphql/ci/catalog/resource_spec.rb @@ -259,4 +259,97 @@ ) end end + + describe 'openIssuesCount' do + before do + stub_licensed_features(ci_namespace_catalog: true) + end + + context 'when open_issue_count is requested' do + let(:query) do + <<~GQL + query { + ciCatalogResource(id: "#{resource.to_global_id}") { + openIssuesCount + } + } + GQL + end + + it 'returns the correct count' do + create(:issue, :opened, project: project) + create(:issue, :opened, project: project) + + namespace.add_developer(user) + + post_query + + expect(graphql_data_at(:ciCatalogResource)).to match( + a_graphql_entity_for( + open_issues_count: 2 + ) + ) + end + + context 'when open_issue_count is zero' do + it 'returns zero' do + namespace.add_developer(user) + + post_query + + expect(graphql_data_at(:ciCatalogResource)).to match( + a_graphql_entity_for( + open_issues_count: 0 + ) + ) + end + end + end + end + + describe 'openMergeRequestsCount' do + before do + stub_licensed_features(ci_namespace_catalog: true) + end + + context 'when merge_requests_count is requested' do + let(:query) do + <<~GQL + query { + ciCatalogResource(id: "#{resource.to_global_id}") { + openMergeRequestsCount + } + } + GQL + end + + it 'returns the correct count' do + create(:merge_request, :opened, source_project: project) + + namespace.add_developer(user) + + post_query + + expect(graphql_data_at(:ciCatalogResource)).to match( + a_graphql_entity_for( + open_merge_requests_count: 1 + ) + ) + end + + context 'when open merge_requests_count is zero' do + it 'returns zero' do + namespace.add_developer(user) + + post_query + + expect(graphql_data_at(:ciCatalogResource)).to match( + a_graphql_entity_for( + open_merge_requests_count: 0 + ) + ) + end + end + end + end end diff --git a/ee/spec/requests/api/graphql/ci/catalog/resources_spec.rb b/ee/spec/requests/api/graphql/ci/catalog/resources_spec.rb index b5dec039d24265be18dd61151a38d6dc6394027a..cecd9166e8c3828f32a5851a0d61ea884a2149db 100644 --- a/ee/spec/requests/api/graphql/ci/catalog/resources_spec.rb +++ b/ee/spec/requests/api/graphql/ci/catalog/resources_spec.rb @@ -454,4 +454,88 @@ end end end + + describe 'openIssuesCount' do + before do + stub_licensed_features(ci_namespace_catalog: true) + namespace.add_developer(user) + end + + context 'when open_issues_count is requested' do + before_all do + create(:issue, :opened, project: project1) + create(:issue, :opened, project: project1) + + create(:issue, :opened, project: project2) + end + + let(:query) do + <<~GQL + query { + ciCatalogResources(projectPath: "#{project1.full_path}") { + nodes { + openIssuesCount + } + } + } + GQL + end + + it 'returns the correct count' do + create(:catalog_resource, project: project2) + + post_query + + expect(graphql_data_at(:ciCatalogResources, :nodes)).to contain_exactly( + a_graphql_entity_for( + openIssuesCount: 2), + a_graphql_entity_for( + openIssuesCount: 1) + ) + end + + it_behaves_like 'avoids N+1 queries' + end + end + + describe 'openMergeRequestsCount' do + before do + stub_licensed_features(ci_namespace_catalog: true) + namespace.add_developer(user) + end + + context 'when open_merge_requests_count is requested' do + before_all do + create(:merge_request, :opened, source_project: project1) + create(:merge_request, :opened, source_project: project2) + end + + let(:query) do + <<~GQL + query { + ciCatalogResources(projectPath: "#{project1.full_path}") { + nodes { + openMergeRequestsCount + } + } + } + GQL + end + + it 'returns the correct count' do + create(:catalog_resource, project: project2) + + post_query + + expect(graphql_data_at(:ciCatalogResources, :nodes)).to contain_exactly( + a_graphql_entity_for( + openMergeRequestsCount: 1), + a_graphql_entity_for( + openMergeRequestsCount: 1) + ) + end + + it_behaves_like 'avoids N+1 queries' + end + end end diff --git a/spec/graphql/types/merge_request_state_enum_spec.rb b/spec/graphql/types/merge_request_state_enum_spec.rb index 6fc5803a5d067e343bea5f74913654a4aaef8547..9c286c54e159637c83435f063047a000be41cf7d 100644 --- a/spec/graphql/types/merge_request_state_enum_spec.rb +++ b/spec/graphql/types/merge_request_state_enum_spec.rb @@ -8,6 +8,6 @@ it_behaves_like 'issuable state' it 'exposes all the existing merge request states' do - expect(described_class.values.keys).to include('merged') + expect(described_class.values.keys).to include('merged', 'opened') end end