Commit a368450a authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'allow_multiple_labels_commands' into 'master'

allow multiple labels commands

### What does this MR do?
This MR should add multiple command support  for all  label related commands.

### What are the relevant issue numbers?
Closes #22965

See merge request !6780
parents 3d253e5c 8213fc6a
...@@ -93,6 +93,7 @@ v 8.13.0 (unreleased) ...@@ -93,6 +93,7 @@ v 8.13.0 (unreleased)
- Ability to batch assign issues relating to a merge request to the author. !5725 (jamedjo) - Ability to batch assign issues relating to a merge request to the author. !5725 (jamedjo)
- Changed Slack service user referencing from full name to username (Sebastian Poxhofer) - Changed Slack service user referencing from full name to username (Sebastian Poxhofer)
- Retouch environments list and deployments list - Retouch environments list and deployments list
- Add multiple command support for all label related slash commands !6780 (barthc)
- Add Container Registry on/off status to Admin Area !6638 (the-undefined) - Add Container Registry on/off status to Admin Area !6638 (the-undefined)
- Allow empty merge requests !6384 (Artem Sidorenko) - Allow empty merge requests !6384 (Artem Sidorenko)
- Grouped pipeline dropdown is a scrollable container - Grouped pipeline dropdown is a scrollable container
......
...@@ -122,7 +122,12 @@ module SlashCommands ...@@ -122,7 +122,12 @@ module SlashCommands
command :label do |labels_param| command :label do |labels_param|
label_ids = find_label_ids(labels_param) label_ids = find_label_ids(labels_param)
@updates[:add_label_ids] = label_ids unless label_ids.empty? if label_ids.any?
@updates[:add_label_ids] ||= []
@updates[:add_label_ids] += label_ids
@updates[:add_label_ids].uniq!
end
end end
desc 'Remove all or specific label(s)' desc 'Remove all or specific label(s)'
...@@ -136,7 +141,12 @@ module SlashCommands ...@@ -136,7 +141,12 @@ module SlashCommands
if labels_param.present? if labels_param.present?
label_ids = find_label_ids(labels_param) label_ids = find_label_ids(labels_param)
@updates[:remove_label_ids] = label_ids unless label_ids.empty? if label_ids.any?
@updates[:remove_label_ids] ||= []
@updates[:remove_label_ids] += label_ids
@updates[:remove_label_ids].uniq!
end
else else
@updates[:label_ids] = [] @updates[:label_ids] = []
end end
...@@ -152,7 +162,12 @@ module SlashCommands ...@@ -152,7 +162,12 @@ module SlashCommands
command :relabel do |labels_param| command :relabel do |labels_param|
label_ids = find_label_ids(labels_param) label_ids = find_label_ids(labels_param)
@updates[:label_ids] = label_ids unless label_ids.empty? if label_ids.any?
@updates[:label_ids] ||= []
@updates[:label_ids] += label_ids
@updates[:label_ids].uniq!
end
end end
desc 'Add a todo' desc 'Add a todo'
......
...@@ -86,6 +86,25 @@ describe SlashCommands::InterpretService, services: true do ...@@ -86,6 +86,25 @@ describe SlashCommands::InterpretService, services: true do
end end
end end
shared_examples 'multiple label command' do
it 'fetches label ids and populates add_label_ids if content contains multiple /label' do
bug # populate the label
inprogress # populate the label
_, updates = service.execute(content, issuable)
expect(updates).to eq(add_label_ids: [inprogress.id, bug.id])
end
end
shared_examples 'multiple label with same argument' do
it 'prevents duplicate label ids and populates add_label_ids if content contains multiple /label' do
inprogress # populate the label
_, updates = service.execute(content, issuable)
expect(updates).to eq(add_label_ids: [inprogress.id])
end
end
shared_examples 'unlabel command' do shared_examples 'unlabel command' do
it 'fetches label ids and populates remove_label_ids if content contains /unlabel' do it 'fetches label ids and populates remove_label_ids if content contains /unlabel' do
issuable.update(label_ids: [inprogress.id]) # populate the label issuable.update(label_ids: [inprogress.id]) # populate the label
...@@ -95,6 +114,15 @@ describe SlashCommands::InterpretService, services: true do ...@@ -95,6 +114,15 @@ describe SlashCommands::InterpretService, services: true do
end end
end end
shared_examples 'multiple unlabel command' do
it 'fetches label ids and populates remove_label_ids if content contains mutiple /unlabel' do
issuable.update(label_ids: [inprogress.id, bug.id]) # populate the label
_, updates = service.execute(content, issuable)
expect(updates).to eq(remove_label_ids: [inprogress.id, bug.id])
end
end
shared_examples 'unlabel command with no argument' do shared_examples 'unlabel command with no argument' do
it 'populates label_ids: [] if content contains /unlabel with no arguments' do it 'populates label_ids: [] if content contains /unlabel with no arguments' do
issuable.update(label_ids: [inprogress.id]) # populate the label issuable.update(label_ids: [inprogress.id]) # populate the label
...@@ -285,6 +313,16 @@ describe SlashCommands::InterpretService, services: true do ...@@ -285,6 +313,16 @@ describe SlashCommands::InterpretService, services: true do
let(:issuable) { merge_request } let(:issuable) { merge_request }
end end
it_behaves_like 'multiple label command' do
let(:content) { %(/label ~"#{inprogress.title}" \n/label ~#{bug.title}) }
let(:issuable) { issue }
end
it_behaves_like 'multiple label with same argument' do
let(:content) { %(/label ~"#{inprogress.title}" \n/label ~#{inprogress.title}) }
let(:issuable) { issue }
end
it_behaves_like 'unlabel command' do it_behaves_like 'unlabel command' do
let(:content) { %(/unlabel ~"#{inprogress.title}") } let(:content) { %(/unlabel ~"#{inprogress.title}") }
let(:issuable) { issue } let(:issuable) { issue }
...@@ -295,6 +333,11 @@ describe SlashCommands::InterpretService, services: true do ...@@ -295,6 +333,11 @@ describe SlashCommands::InterpretService, services: true do
let(:issuable) { merge_request } let(:issuable) { merge_request }
end end
it_behaves_like 'multiple unlabel command' do
let(:content) { %(/unlabel ~"#{inprogress.title}" \n/unlabel ~#{bug.title}) }
let(:issuable) { issue }
end
it_behaves_like 'unlabel command with no argument' do it_behaves_like 'unlabel command with no argument' do
let(:content) { %(/unlabel) } let(:content) { %(/unlabel) }
let(:issuable) { issue } let(:issuable) { issue }
......
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