Commit 1c7b6983 authored by Patrick Bajao's avatar Patrick Bajao

Merge branch '231332-epics-not-inheriting-dates' into 'master'

Update epic inherited dates and create notes when reordering in epic tree

See merge request gitlab-org/gitlab!39742
parents 5f1a5cbe 99d2379b
......@@ -26,19 +26,26 @@ module Epics
def set_new_parent
return unless new_parent && new_parent_different?
moving_object.parent = new_parent
validate_new_parent
service = create_issuable_links(new_parent)
return unless service[:status] == :error
service[:message]
end
def new_parent_different?
params[:new_parent_id] != GitlabSchema.id_from_object(moving_object.parent)
end
def validate_new_parent
return unless moving_object.respond_to?(:valid_parent?)
return if moving_object.valid_parent?
def create_issuable_links(parent)
service, issuable = if moving_object.is_a?(Epic)
[EpicLinks::CreateService, moving_object]
elsif moving_object.is_a?(EpicIssue)
[EpicIssues::CreateService, moving_object.issue]
end
return unless service.present?
moving_object.errors[:parent]&.first
service.new(parent, current_user, { target_issuable: issuable }).execute
end
def move!
......@@ -110,6 +117,10 @@ module Epics
if new_parent
return false unless can?(current_user, :admin_epic, new_parent.group)
return false unless moving_object.parent && can?(current_user, :admin_epic, moving_object.parent.group)
if moving_object.is_a?(Epic)
return false unless can?(current_user, :admin_epic_link, moving_object.parent.group)
end
end
true
......
---
title: Update epic inherited dates and create notes when reordering in epic tree
merge_request: 39742
author:
type: fixed
......@@ -49,9 +49,9 @@ RSpec.describe 'Updating an epic tree' do
end
end
context 'when epic feature is enabled' do
context 'when epics and subepics features are enabled' do
before do
stub_licensed_features(epics: true)
stub_licensed_features(epics: true, subepics: true)
end
context 'when the user does not have permission' do
......@@ -141,6 +141,24 @@ RSpec.describe 'Updating an epic tree' do
expect(mutation_response['errors']).to eq(["The sibling object's parent must match the current parent epic."])
end
end
context 'when the new parent is another epic and subepics feature is disabled' do
let(:new_parent_id) { GitlabSchema.id_from_object(base_epic).to_s }
before do
stub_licensed_features(epics: true, subepics: false)
other_epic = create(:epic, group: group)
epic2.update(parent: other_epic)
end
it_behaves_like 'a mutation that does not update the tree'
it 'returns the error message' do
post_graphql_mutation(mutation, current_user: current_user)
expect(mutation_response['errors']).to eq(['You don\'t have permissions to move the objects.'])
end
end
end
context 'when moving an issue' do
......
......@@ -66,7 +66,7 @@ RSpec.describe Epics::TreeReorderService do
context 'when user does have permission to admin the base epic' do
before do
group.add_developer(user)
group.add_reporter(user)
end
context 'when relative_position is not valid' do
......@@ -102,6 +102,10 @@ RSpec.describe Epics::TreeReorderService do
it 'updates the parent' do
expect { subject }.to change { tree_object_2.reload.epic }.from(epic1).to(epic)
end
it 'creates system notes' do
expect { subject }.to change { Note.system.count }.by(3)
end
end
context 'when object being moved is from another epic' do
......@@ -207,6 +211,10 @@ RSpec.describe Epics::TreeReorderService do
expect(tree_object_1.reload.relative_position).to be > tree_object_2.reload.relative_position
end
it 'creates system notes' do
expect { subject }.to change { Note.system.count }.by(3)
end
end
end
end
......@@ -215,6 +223,21 @@ RSpec.describe Epics::TreeReorderService do
let!(:tree_object_1) { epic1 }
let!(:tree_object_2) { epic2 }
context 'when subepics feature is disabled' do
let(:new_parent_id) { GitlabSchema.id_from_object(epic) }
before do
stub_licensed_features(epics: true, subepics: false)
end
it_behaves_like 'error for the tree update', 'You don\'t have permissions to move the objects.'
end
context 'when subepics feature is enabled' do
before do
stub_licensed_features(epics: true, subepics: true)
end
context 'when user does not have permissions to admin the previous parent' do
let(:other_group) { create(:group) }
let(:other_epic) { create(:epic, group: other_group) }
......@@ -227,6 +250,16 @@ RSpec.describe Epics::TreeReorderService do
it_behaves_like 'error for the tree update', 'You don\'t have permissions to move the objects.'
end
context 'when user does not have permissions to admin the previous parent links' do
let(:new_parent_id) { GitlabSchema.id_from_object(epic) }
before do
group.add_guest(user)
end
it_behaves_like 'error for the tree update', 'You don\'t have permissions to move the objects.'
end
context 'when there is some other error with the new parent' do
let(:other_group) { create(:group) }
let(:new_parent_id) { GitlabSchema.id_from_object(epic) }
......@@ -248,6 +281,8 @@ RSpec.describe Epics::TreeReorderService do
it_behaves_like 'error for the tree update', 'You don\'t have permissions to move the objects.'
end
context 'when user '
context 'when the reordered epics are not subepics of the base epic' do
let(:another_group) { create(:group) }
let(:another_epic) { create(:epic, group: another_group) }
......@@ -287,7 +322,7 @@ RSpec.describe Epics::TreeReorderService do
let(:epic3) { create(:epic, parent: other_epic, group: group) }
let(:tree_object_2) { epic3 }
it 'updates the relative positions and parent_id' do
it 'updates the relative positions' do
subject
expect(tree_object_1.reload.relative_position).to be > tree_object_2.reload.relative_position
......@@ -296,6 +331,11 @@ RSpec.describe Epics::TreeReorderService do
it 'updates the parent' do
expect { subject }.to change { tree_object_2.reload.parent }.from(other_epic).to(epic)
end
it 'creates system notes' do
expect { subject }.to change { Note.system.count }.by(2)
end
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