diff options
Diffstat (limited to 'spec/services/design_management/move_designs_service_spec.rb')
-rw-r--r-- | spec/services/design_management/move_designs_service_spec.rb | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/spec/services/design_management/move_designs_service_spec.rb b/spec/services/design_management/move_designs_service_spec.rb new file mode 100644 index 00000000000..a05518dc28d --- /dev/null +++ b/spec/services/design_management/move_designs_service_spec.rb @@ -0,0 +1,147 @@ +# frozen_string_literal: true +require 'spec_helper' + +RSpec.describe DesignManagement::MoveDesignsService do + include DesignManagementTestHelpers + + let_it_be(:issue) { create(:issue) } + let_it_be(:developer) { create(:user, developer_projects: [issue.project]) } + let_it_be(:designs) { create_list(:design, 3, :with_relative_position, issue: issue) } + + let(:project) { issue.project } + + let(:service) { described_class.new(current_user, params) } + + let(:params) do + { + current_design: current_design, + previous_design: previous_design, + next_design: next_design + } + end + + let(:current_user) { developer } + let(:current_design) { nil } + let(:previous_design) { nil } + let(:next_design) { nil } + + before do + enable_design_management + end + + describe '#execute' do + subject { service.execute } + + context 'the feature is unavailable' do + let(:current_design) { designs.first } + let(:previous_design) { designs.second } + let(:next_design) { designs.third } + + before do + stub_feature_flags(reorder_designs: false) + end + + it 'raises cannot_move' do + expect(subject).to be_error.and(have_attributes(message: :cannot_move)) + end + + context 'but it is available on the current project' do + before do + stub_feature_flags(reorder_designs: issue.project) + end + + it 'is successful' do + expect(subject).to be_success + end + end + end + + context 'the user cannot move designs' do + let(:current_design) { designs.first } + let(:current_user) { build_stubbed(:user) } + + it 'raises cannot_move' do + expect(subject).to be_error.and(have_attributes(message: :cannot_move)) + end + end + + context 'the designs are not distinct' do + let(:current_design) { designs.first } + let(:previous_design) { designs.first } + + it 'raises not_distinct' do + expect(subject).to be_error.and(have_attributes(message: :not_distinct)) + end + end + + context 'the designs are not on the same issue' do + let(:current_design) { designs.first } + let(:previous_design) { create(:design) } + + it 'raises not_same_issue' do + expect(subject).to be_error.and(have_attributes(message: :not_same_issue)) + end + end + + context 'no focus is passed' do + let(:previous_design) { designs.second } + let(:next_design) { designs.third } + + it 'raises no_focus' do + expect(subject).to be_error.and(have_attributes(message: :no_focus)) + end + end + + context 'no neighbours are passed' do + let(:current_design) { designs.first } + + it 'raises no_neighbors' do + expect(subject).to be_error.and(have_attributes(message: :no_neighbors)) + end + end + + context 'the designs are not adjacent' do + let(:current_design) { designs.first } + let(:previous_design) { designs.second } + let(:next_design) { designs.third } + + it 'raises not_adjacent' do + create(:design, issue: issue, relative_position: next_design.relative_position - 1) + + expect(subject).to be_error.and(have_attributes(message: :not_adjacent)) + end + end + + context 'moving a design with neighbours' do + let(:current_design) { designs.first } + let(:previous_design) { designs.second } + let(:next_design) { designs.third } + + it 'repositions existing designs and correctly places the given design' do + other_design1 = create(:design, issue: issue, relative_position: 10) + other_design2 = create(:design, issue: issue, relative_position: 20) + other_design3, other_design4 = create_list(:design, 2, issue: issue) + + expect(subject).to be_success + + expect(issue.designs.ordered(issue.project)).to eq([ + # Existing designs which already had a relative_position set. + # These should stay at the beginning, in the same order. + other_design1, + other_design2, + + # The designs we're passing into the service. + # These should be placed between the existing designs, in the correct order. + previous_design, + current_design, + next_design, + + # Existing designs which didn't have a relative_position set. + # These should be placed at the end, in the order of their IDs. + other_design3, + other_design4 + ]) + end + end + end +end |