Skip to content
Snippets Groups Projects
Verified Commit 98184fee authored by Gary Holtz's avatar Gary Holtz :two: Committed by GitLab
Browse files

Add backend support for multiple Vue list filters

* "merged by"
* "approved by"
* "my reaction emoji"
* "approvers"
* "release"

Changelog: added
EE: true
parent b7e0c597
No related branches found
No related tags found
2 merge requests!162233Draft: Script to update Topology Service Gem,!160938Add several backend filters to the Vue version of the merge request list
......@@ -33,6 +33,24 @@ def self.accept_reviewer
description: 'Filter by reviewer presence. Incompatible with reviewerUsername.'
end
argument :approved_by, [GraphQL::Types::String],
required: false,
as: :approved_by_usernames,
description: 'Usernames of the approvers.'
argument :release_tag, GraphQL::Types::String,
required: false,
description: 'Filter by release tag.'
argument :merged_by, GraphQL::Types::String,
required: false,
as: :merge_user_username,
description: 'Username of the merger.'
argument :my_reaction_emoji, GraphQL::Types::String,
required: false,
description: 'Filter by your reaction emoji.'
argument :iids, [GraphQL::Types::String],
required: false,
description: 'Array of IIDs of merge requests, for example `[1, 2]`.'
......@@ -124,6 +142,10 @@ def self.accept_reviewer
default_value: :created_desc
negated do
argument :approved_by, [GraphQL::Types::String],
required: false,
as: :approved_by_usernames,
description: 'Usernames of approvers to exclude.'
argument :assignee_usernames, [GraphQL::Types::String],
as: :assignee_username,
required: false,
......@@ -134,10 +156,16 @@ def self.accept_reviewer
description: 'Array of label names. All resolved merge requests will not have these labels.'
argument :milestone_title, GraphQL::Types::String,
required: false,
description: 'Title of the milestone.'
description: 'Title of the milestone to exclude.'
argument :my_reaction_emoji, GraphQL::Types::String,
required: false,
description: 'Filter by reaction emoji to exclude.'
argument :release_tag, GraphQL::Types::String,
required: false,
description: 'Filter by release tag to exclude.'
argument :reviewer_username, GraphQL::Types::String,
required: false,
description: 'Username of the reviewer.'
description: 'Username of the reviewer to exclude.'
end
validates mutually_exclusive: [:assignee_username, :assignee_wildcard_id]
......
......@@ -231,6 +231,7 @@ def mr_compare_form_data(_, merge_request)
def project_merge_requests_list_data(project, current_user)
{
autocomplete_award_emojis_path: autocomplete_award_emojis_path,
full_path: project.full_path,
has_any_merge_requests: project_merge_requests(project).exists?.to_s,
initial_sort: current_user&.user_preference&.issues_sort,
......
This diff is collapsed.
......@@ -5,6 +5,7 @@
RSpec.describe Resolvers::MergeRequestsResolver, feature_category: :code_review_workflow do
include GraphqlHelpers
include SortingHelper
include MrResolverHelpers
let_it_be(:project) { create(:project, :repository) }
let_it_be(:other_project) { create(:project, :repository) }
......@@ -240,6 +241,107 @@
end
end
context 'with merged_by argument' do
before_all do
merge_request_1.metrics.update!(merged_by: other_user)
end
context "for matching arguments" do
it 'returns merge requests merged by user' do
result = resolve_mr(project, merged_by: other_user.username)
expect(result).to contain_exactly(merge_request_1)
end
it 'does not return anything' do
result = resolve_mr(project, merged_by: "cool_guy_123")
expect(result).to be_empty
end
end
end
context 'with release argument' do
let_it_be(:release_in_project) { create(:release, :with_milestones, project: merge_request_1.project) }
let_it_be(:milestone) { release_in_project.milestones.last }
before_all do
merge_request_1.update!(milestone: milestone)
end
it 'returns merge requests in release' do
result = resolve_mr(project, release_tag: release_in_project.name)
expect(result).to contain_exactly(merge_request_1)
end
it 'does not return anything' do
result = resolve_mr(project, release_tag: "8675309.0")
expect(result).to be_empty
end
it 'filters out merge requests with given milestone title' do
result = resolve_mr(project, not: { release_tag: release_in_project.name })
expect(result).not_to include(merge_request_1)
end
end
context 'with approved_by argument' do
let(:username) { other_user.username }
before_all do
merge_request_1.approvals.create!(user: other_user)
end
it 'returns merge requests approved by user' do
result = resolve_mr(project, approved_by: [username])
expect(result).to contain_exactly(merge_request_1)
end
it 'does not return anything' do
result = resolve_mr(project, approved_by: ["cool_guy_123"])
expect(result).to be_empty
end
context 'with negated approved by argument' do
it 'filters out merge requests with given approved user' do
result = resolve_mr(project, not: { approved_by: [username] })
expect(result).not_to include(merge_request_1)
end
end
end
context 'with my_reaction_emoji argument' do
before_all do
merge_request_1.award_emoji.create!(name: "poop", user: current_user)
end
it 'returns merge requests with a reaction emoji set by user' do
result = resolve_mr(project, my_reaction_emoji: "poop")
expect(result).to contain_exactly(merge_request_1)
end
it 'does not return anything' do
result = resolve_mr(project, my_reaction_emoji: "thumbsup")
expect(result).to be_empty
end
context 'with negated my_reaction_emoji argument' do
it 'filters out merge requests with given reaction emoji' do
result = resolve_mr(project, not: { my_reaction_emoji: "poop" })
expect(result).not_to include(merge_request_1)
end
end
end
context 'when filtering by the merge request deployments' do
let_it_be(:gstg) { create(:environment, project: project, name: 'gstg') }
let_it_be(:gprd) { create(:environment, project: project, name: 'gprd') }
......@@ -501,8 +603,4 @@ def closed_at(mr)
def resolve_mr_single(project, iid)
resolve_mr(project, resolver: described_class.single, iid: iid.to_s)
end
def resolve_mr(project, resolver: described_class, user: current_user, **args)
resolve(resolver, obj: project, args: args, ctx: { current_user: user }, arg_style: :internal)
end
end
......@@ -356,6 +356,10 @@
:updated_after,
:updated_before,
:author_username,
:approved_by,
:my_reaction_emoji,
:merged_by,
:release_tag,
:assignee_username,
:assignee_wildcard_id,
:reviewer_username,
......
......@@ -333,6 +333,7 @@
it 'returns the correct data' do
expected_data = {
autocomplete_award_emojis_path: autocomplete_award_emojis_path,
full_path: project.full_path,
is_public_visibility_restricted: 'false',
is_signed_in: 'true',
......
# frozen_string_literal: true
module MrResolverHelpers
def resolve_mr(project, resolver: described_class, user: current_user, **args)
resolve(resolver, obj: project, args: args, ctx: { current_user: user }, arg_style: :internal)
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment