diff options
Diffstat (limited to 'spec/requests/api/graphql/project/merge_request_spec.rb')
-rw-r--r-- | spec/requests/api/graphql/project/merge_request_spec.rb | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/spec/requests/api/graphql/project/merge_request_spec.rb b/spec/requests/api/graphql/project/merge_request_spec.rb index 15551005502..438ea9bb4c1 100644 --- a/spec/requests/api/graphql/project/merge_request_spec.rb +++ b/spec/requests/api/graphql/project/merge_request_spec.rb @@ -311,23 +311,23 @@ RSpec.describe 'getting merge request information nested in a project' do 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(:selected_fields) { all_graphql_fields_for('UserMergeRequestInteraction') } let(:mr_fields) do query_nodes( - :reviewers, + field, query_graphql_field(:merge_request_interaction, nil, selected_fields) ) end 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 - context 'when the user does not have interactions' do + context 'when the user is not assigned' do it 'returns null data' do post_graphql(query) @@ -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 before do project.add_guest(user) - merge_request.merge_request_reviewers.create!(reviewer: user) + assign_user(user) end it 'returns falsey values' 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( 'canMerge' => false, - 'canUpdate' => false, - 'reviewState' => 'UNREVIEWED', + 'canUpdate' => can_update, + 'reviewState' => unreviewed, 'reviewed' => false, 'approved' => false ) @@ -357,7 +357,9 @@ RSpec.describe 'getting merge request information nested in a project' do context 'when the user has interacted' do before do 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 end @@ -392,7 +394,10 @@ RSpec.describe 'getting merge request information nested in a project' do end 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 post_graphql(query) @@ -401,7 +406,8 @@ RSpec.describe 'getting merge request information nested in a project' do expect(interaction_data).to contain_exactly(include(reviewed)) 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 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 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 |