Commit 7d55ddf2 authored by Alex Kalderimis's avatar Alex Kalderimis

Change type of merge request assignees in GraphQL

This exposes merge request interaction information on assignees.
parent e77edc54
...@@ -130,7 +130,10 @@ module Types ...@@ -130,7 +130,10 @@ module Types
field :milestone, Types::MilestoneType, null: true, field :milestone, Types::MilestoneType, null: true,
description: 'The milestone of the merge request.' description: 'The milestone of the merge request.'
field :assignees, Types::UserType.connection_type, null: true, complexity: 5, field :assignees,
type: Types::MergeRequests::ReviewerType.connection_type,
null: true,
complexity: 5,
description: 'Assignees of the merge request.' description: 'Assignees of the merge request.'
field :reviewers, field :reviewers,
type: Types::MergeRequests::ReviewerType.connection_type, type: Types::MergeRequests::ReviewerType.connection_type,
......
---
title: Add merge request interaction details to MergeRequest.assignees
merge_request: 59770
author:
type: changed
...@@ -9413,7 +9413,7 @@ Represents an entry from the Cloud License history. ...@@ -9413,7 +9413,7 @@ Represents an entry from the Cloud License history.
| <a id="mergerequestapprovalsrequired"></a>`approvalsRequired` | [`Int`](#int) | Number of approvals required. | | <a id="mergerequestapprovalsrequired"></a>`approvalsRequired` | [`Int`](#int) | Number of approvals required. |
| <a id="mergerequestapproved"></a>`approved` | [`Boolean!`](#boolean) | Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured. | | <a id="mergerequestapproved"></a>`approved` | [`Boolean!`](#boolean) | Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured. |
| <a id="mergerequestapprovedby"></a>`approvedBy` | [`UserConnection`](#userconnection) | Users who approved the merge request. | | <a id="mergerequestapprovedby"></a>`approvedBy` | [`UserConnection`](#userconnection) | Users who approved the merge request. |
| <a id="mergerequestassignees"></a>`assignees` | [`UserConnection`](#userconnection) | Assignees of the merge request. | | <a id="mergerequestassignees"></a>`assignees` | [`MergeRequestReviewerConnection`](#mergerequestreviewerconnection) | Assignees of the merge request. |
| <a id="mergerequestauthor"></a>`author` | [`User`](#user) | User who created this merge request. | | <a id="mergerequestauthor"></a>`author` | [`User`](#user) | User who created this merge request. |
| <a id="mergerequestautomergeenabled"></a>`autoMergeEnabled` | [`Boolean!`](#boolean) | Indicates if auto merge is enabled for the merge request. | | <a id="mergerequestautomergeenabled"></a>`autoMergeEnabled` | [`Boolean!`](#boolean) | Indicates if auto merge is enabled for the merge request. |
| <a id="mergerequestautomergestrategy"></a>`autoMergeStrategy` | [`String`](#string) | Selected auto merge strategy. | | <a id="mergerequestautomergestrategy"></a>`autoMergeStrategy` | [`String`](#string) | Selected auto merge strategy. |
......
...@@ -311,23 +311,23 @@ RSpec.describe 'getting merge request information nested in a project' do ...@@ -311,23 +311,23 @@ RSpec.describe 'getting merge request information nested in a project' do
end end
end end
context 'when requesting information about MR interactions' do shared_examples 'when requesting information about MR interactions' do
let_it_be(:user) { create(:user) } let_it_be(:user) { create(:user) }
let(:selected_fields) { all_graphql_fields_for('UserMergeRequestInteraction') } let(:selected_fields) { all_graphql_fields_for('UserMergeRequestInteraction') }
let(:mr_fields) do let(:mr_fields) do
query_nodes( query_nodes(
:reviewers, field,
query_graphql_field(:merge_request_interaction, nil, selected_fields) query_graphql_field(:merge_request_interaction, nil, selected_fields)
) )
end end
def interaction_data def interaction_data
graphql_data_at(:project, :merge_request, :reviewers, :nodes, :merge_request_interaction) graphql_data_at(:project, :merge_request, field, :nodes, :merge_request_interaction)
end end
context 'when the user does not have interactions' do context 'when the user is not assigned' do
it 'returns null data' do it 'returns null data' do
post_graphql(query) post_graphql(query)
...@@ -338,7 +338,7 @@ RSpec.describe 'getting merge request information nested in a project' do ...@@ -338,7 +338,7 @@ RSpec.describe 'getting merge request information nested in a project' do
context 'when the user is a reviewer, but has not reviewed' do context 'when the user is a reviewer, but has not reviewed' do
before do before do
project.add_guest(user) project.add_guest(user)
merge_request.merge_request_reviewers.create!(reviewer: user) assign_user(user)
end end
it 'returns falsey values' do it 'returns falsey values' do
...@@ -346,8 +346,8 @@ RSpec.describe 'getting merge request information nested in a project' do ...@@ -346,8 +346,8 @@ RSpec.describe 'getting merge request information nested in a project' do
expect(interaction_data).to contain_exactly a_hash_including( expect(interaction_data).to contain_exactly a_hash_including(
'canMerge' => false, 'canMerge' => false,
'canUpdate' => false, 'canUpdate' => can_update,
'reviewState' => 'UNREVIEWED', 'reviewState' => unreviewed,
'reviewed' => false, 'reviewed' => false,
'approved' => false 'approved' => false
) )
...@@ -357,7 +357,9 @@ RSpec.describe 'getting merge request information nested in a project' do ...@@ -357,7 +357,9 @@ RSpec.describe 'getting merge request information nested in a project' do
context 'when the user has interacted' do context 'when the user has interacted' do
before do before do
project.add_maintainer(user) project.add_maintainer(user)
merge_request.merge_request_reviewers.create!(reviewer: user, state: 'reviewed') assign_user(user)
r = merge_request.merge_request_reviewers.find_or_create_by!(reviewer: user)
r.update!(state: 'reviewed')
merge_request.approved_by_users << user merge_request.approved_by_users << user
end end
...@@ -392,7 +394,10 @@ RSpec.describe 'getting merge request information nested in a project' do ...@@ -392,7 +394,10 @@ RSpec.describe 'getting merge request information nested in a project' do
end end
it 'does not suffer from N+1' do it 'does not suffer from N+1' do
merge_request.merge_request_reviewers.create!(reviewer: user, state: 'reviewed') assign_user(user)
merge_request.merge_request_reviewers
.find_or_create_by!(reviewer: user)
.update!(state: 'reviewed')
baseline = ActiveRecord::QueryRecorder.new do baseline = ActiveRecord::QueryRecorder.new do
post_graphql(query) post_graphql(query)
...@@ -401,7 +406,8 @@ RSpec.describe 'getting merge request information nested in a project' do ...@@ -401,7 +406,8 @@ RSpec.describe 'getting merge request information nested in a project' do
expect(interaction_data).to contain_exactly(include(reviewed)) expect(interaction_data).to contain_exactly(include(reviewed))
other_users.each do |user| other_users.each do |user|
merge_request.merge_request_reviewers.create!(reviewer: user) assign_user(user)
merge_request.merge_request_reviewers.find_or_create_by!(reviewer: user)
end end
expect { post_graphql(query) }.not_to exceed_query_limit(baseline) expect { post_graphql(query) }.not_to exceed_query_limit(baseline)
...@@ -435,4 +441,24 @@ RSpec.describe 'getting merge request information nested in a project' do ...@@ -435,4 +441,24 @@ RSpec.describe 'getting merge request information nested in a project' do
end end
end end
end end
it_behaves_like 'when requesting information about MR interactions' do
let(:field) { :reviewers }
let(:unreviewed) { 'UNREVIEWED' }
let(:can_update) { false }
def assign_user(user)
merge_request.merge_request_reviewers.create!(reviewer: user)
end
end
it_behaves_like 'when requesting information about MR interactions' do
let(:field) { :assignees }
let(:unreviewed) { nil }
let(:can_update) { true } # assignees can update MRs
def assign_user(user)
merge_request.assignees << user
end
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment