debian-mirror-gitlab/spec/services/design_management/move_designs_service_spec.rb
2020-10-24 23:57:45 +05:30

147 lines
4.3 KiB
Ruby

# 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