Use zero-based positions on issues board services
This commit is contained in:
parent
2c00d5928c
commit
9e5a305f18
|
@ -12,7 +12,8 @@ module Boards
|
||||||
private
|
private
|
||||||
|
|
||||||
def find_next_position
|
def find_next_position
|
||||||
board.lists.label.maximum(:position).to_i + 1
|
max_position = board.lists.label.maximum(:position)
|
||||||
|
max_position.nil? ? 0 : max_position.succ
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_list_at(position)
|
def create_list_at(position)
|
||||||
|
|
|
@ -19,7 +19,7 @@ module Boards
|
||||||
|
|
||||||
def valid_move?
|
def valid_move?
|
||||||
new_position.present? && new_position != old_position &&
|
new_position.present? && new_position != old_position &&
|
||||||
new_position >= 0 && new_position <= board.lists.label.size
|
new_position >= 0 && new_position < board.lists.label.size
|
||||||
end
|
end
|
||||||
|
|
||||||
def old_position
|
def old_position
|
||||||
|
|
|
@ -7,8 +7,8 @@ describe Projects::BoardIssuesController do
|
||||||
let(:planning) { create(:label, project: project, name: 'Planning') }
|
let(:planning) { create(:label, project: project, name: 'Planning') }
|
||||||
let(:development) { create(:label, project: project, name: 'Development') }
|
let(:development) { create(:label, project: project, name: 'Development') }
|
||||||
|
|
||||||
let!(:list1) { create(:list, board: project.board, label: planning, position: 1) }
|
let!(:list1) { create(:list, board: project.board, label: planning, position: 0) }
|
||||||
let!(:list2) { create(:list, board: project.board, label: development, position: 2) }
|
let!(:list2) { create(:list, board: project.board, label: development, position: 1) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
project.team << [user, :master]
|
project.team << [user, :master]
|
||||||
|
|
|
@ -47,20 +47,20 @@ describe Projects::BoardListsController do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'PATCH #update' do
|
describe 'PATCH #update' do
|
||||||
let!(:planning) { create(:list, board: board, position: 1) }
|
let!(:planning) { create(:list, board: board, position: 0) }
|
||||||
let!(:development) { create(:list, board: board, position: 2) }
|
let!(:development) { create(:list, board: board, position: 1) }
|
||||||
|
|
||||||
context 'with valid position' do
|
context 'with valid position' do
|
||||||
it 'returns a successful 200 response' do
|
it 'returns a successful 200 response' do
|
||||||
move list: planning, position: 2
|
move list: planning, position: 1
|
||||||
|
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(200)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'moves the list to the desired position' do
|
it 'moves the list to the desired position' do
|
||||||
move list: planning, position: 2
|
move list: planning, position: 1
|
||||||
|
|
||||||
expect(planning.reload.position).to eq 2
|
expect(planning.reload.position).to eq 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ describe Projects::BoardListsController do
|
||||||
|
|
||||||
context 'with invalid list id' do
|
context 'with invalid list id' do
|
||||||
it 'returns a not found 404 response' do
|
it 'returns a not found 404 response' do
|
||||||
move list: 999, position: 2
|
move list: 999, position: 1
|
||||||
|
|
||||||
expect(response).to have_http_status(404)
|
expect(response).to have_http_status(404)
|
||||||
end
|
end
|
||||||
|
@ -91,7 +91,7 @@ describe Projects::BoardListsController do
|
||||||
|
|
||||||
describe 'DELETE #destroy' do
|
describe 'DELETE #destroy' do
|
||||||
context 'with valid list id' do
|
context 'with valid list id' do
|
||||||
let!(:planning) { create(:list, board: board, position: 1) }
|
let!(:planning) { create(:list, board: board, position: 0) }
|
||||||
|
|
||||||
it 'returns a successful 200 response' do
|
it 'returns a successful 200 response' do
|
||||||
remove_board_list list: planning
|
remove_board_list list: planning
|
||||||
|
@ -112,7 +112,7 @@ describe Projects::BoardListsController do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove_board_list(list)
|
def remove_board_list(list:)
|
||||||
delete :destroy, namespace_id: project.namespace.to_param,
|
delete :destroy, namespace_id: project.namespace.to_param,
|
||||||
project_id: project.to_param,
|
project_id: project.to_param,
|
||||||
id: list.to_param,
|
id: list.to_param,
|
||||||
|
|
|
@ -14,8 +14,8 @@ describe Boards::Issues::ListService, services: true do
|
||||||
let(:p3) { create(:label, title: 'P3', project: project, priority: 3) }
|
let(:p3) { create(:label, title: 'P3', project: project, priority: 3) }
|
||||||
|
|
||||||
let!(:backlog) { create(:backlog_list, board: board) }
|
let!(:backlog) { create(:backlog_list, board: board) }
|
||||||
let!(:list1) { create(:list, board: board, label: development) }
|
let!(:list1) { create(:list, board: board, label: development, position: 0) }
|
||||||
let!(:list2) { create(:list, board: board, label: testing) }
|
let!(:list2) { create(:list, board: board, label: testing, position: 1) }
|
||||||
let!(:done) { create(:done_list, board: board) }
|
let!(:done) { create(:done_list, board: board) }
|
||||||
|
|
||||||
let!(:opened_issue1) { create(:labeled_issue, project: project, labels: [bug]) }
|
let!(:opened_issue1) { create(:labeled_issue, project: project, labels: [bug]) }
|
||||||
|
|
|
@ -11,8 +11,8 @@ describe Boards::Issues::MoveService, services: true do
|
||||||
let(:testing) { create(:label, project: project, name: 'Testing') }
|
let(:testing) { create(:label, project: project, name: 'Testing') }
|
||||||
|
|
||||||
let(:backlog) { create(:backlog_list, board: board) }
|
let(:backlog) { create(:backlog_list, board: board) }
|
||||||
let(:list1) { create(:list, board: board, label: development) }
|
let(:list1) { create(:list, board: board, label: development, position: 0) }
|
||||||
let(:list2) { create(:list, board: board, label: testing) }
|
let(:list2) { create(:list, board: board, label: testing, position: 1) }
|
||||||
let(:done) { create(:done_list, board: board) }
|
let(:done) { create(:done_list, board: board) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -13,7 +13,7 @@ describe Boards::Lists::CreateService, services: true do
|
||||||
it 'creates a new list at beginning of the list' do
|
it 'creates a new list at beginning of the list' do
|
||||||
list = service.execute
|
list = service.execute
|
||||||
|
|
||||||
expect(list.position).to eq 1
|
expect(list.position).to eq 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -23,18 +23,18 @@ describe Boards::Lists::CreateService, services: true do
|
||||||
|
|
||||||
list = service.execute
|
list = service.execute
|
||||||
|
|
||||||
expect(list.position).to eq 1
|
expect(list.position).to eq 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when board lists has only labels lists' do
|
context 'when board lists has only labels lists' do
|
||||||
it 'creates a new list at end of the lists' do
|
it 'creates a new list at end of the lists' do
|
||||||
|
create(:list, board: board, position: 0)
|
||||||
create(:list, board: board, position: 1)
|
create(:list, board: board, position: 1)
|
||||||
create(:list, board: board, position: 2)
|
|
||||||
|
|
||||||
list = service.execute
|
list = service.execute
|
||||||
|
|
||||||
expect(list.position).to eq 3
|
expect(list.position).to eq 2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -42,12 +42,12 @@ describe Boards::Lists::CreateService, services: true do
|
||||||
it 'creates a new list at end of the label lists' do
|
it 'creates a new list at end of the label lists' do
|
||||||
create(:backlog_list, board: board)
|
create(:backlog_list, board: board)
|
||||||
create(:done_list, board: board)
|
create(:done_list, board: board)
|
||||||
list1 = create(:list, board: board, position: 1)
|
list1 = create(:list, board: board, position: 0)
|
||||||
|
|
||||||
list2 = service.execute
|
list2 = service.execute
|
||||||
|
|
||||||
expect(list1.reload.position).to eq 1
|
expect(list1.reload.position).to eq 0
|
||||||
expect(list2.reload.position).to eq 2
|
expect(list2.reload.position).to eq 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,16 +16,16 @@ describe Boards::Lists::DestroyService, services: true do
|
||||||
|
|
||||||
it 'decrements position of higher lists' do
|
it 'decrements position of higher lists' do
|
||||||
backlog = create(:backlog_list, board: board)
|
backlog = create(:backlog_list, board: board)
|
||||||
development = create(:list, board: board, position: 1)
|
development = create(:list, board: board, position: 0)
|
||||||
review = create(:list, board: board, position: 2)
|
review = create(:list, board: board, position: 1)
|
||||||
staging = create(:list, board: board, position: 3)
|
staging = create(:list, board: board, position: 2)
|
||||||
done = create(:done_list, board: board)
|
done = create(:done_list, board: board)
|
||||||
|
|
||||||
described_class.new(project, user, id: development.id).execute
|
described_class.new(project, user, id: development.id).execute
|
||||||
|
|
||||||
expect(backlog.reload.position).to be_nil
|
expect(backlog.reload.position).to be_nil
|
||||||
expect(review.reload.position).to eq 1
|
expect(review.reload.position).to eq 0
|
||||||
expect(staging.reload.position).to eq 2
|
expect(staging.reload.position).to eq 1
|
||||||
expect(done.reload.position).to be_nil
|
expect(done.reload.position).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,10 +7,10 @@ describe Boards::Lists::MoveService, services: true do
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
|
|
||||||
let!(:backlog) { create(:backlog_list, board: board) }
|
let!(:backlog) { create(:backlog_list, board: board) }
|
||||||
let!(:planning) { create(:list, board: board, position: 1) }
|
let!(:planning) { create(:list, board: board, position: 0) }
|
||||||
let!(:development) { create(:list, board: board, position: 2) }
|
let!(:development) { create(:list, board: board, position: 1) }
|
||||||
let!(:review) { create(:list, board: board, position: 3) }
|
let!(:review) { create(:list, board: board, position: 2) }
|
||||||
let!(:staging) { create(:list, board: board, position: 4) }
|
let!(:staging) { create(:list, board: board, position: 3) }
|
||||||
let!(:done) { create(:done_list, board: board) }
|
let!(:done) { create(:done_list, board: board) }
|
||||||
|
|
||||||
context 'when list type is set to label' do
|
context 'when list type is set to label' do
|
||||||
|
@ -19,15 +19,15 @@ describe Boards::Lists::MoveService, services: true do
|
||||||
|
|
||||||
service.execute
|
service.execute
|
||||||
|
|
||||||
expect(current_list_positions).to eq [1, 2, 3, 4]
|
expect(current_list_positions).to eq [0, 1, 2, 3]
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'keeps position of lists when new positon is equal to old position' do
|
it 'keeps position of lists when new positon is equal to old position' do
|
||||||
service = described_class.new(project, user, id: planning.id, position: 1)
|
service = described_class.new(project, user, id: planning.id, position: planning.position)
|
||||||
|
|
||||||
service.execute
|
service.execute
|
||||||
|
|
||||||
expect(current_list_positions).to eq [1, 2, 3, 4]
|
expect(current_list_positions).to eq [0, 1, 2, 3]
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'keeps position of lists when new positon is negative' do
|
it 'keeps position of lists when new positon is negative' do
|
||||||
|
@ -35,47 +35,55 @@ describe Boards::Lists::MoveService, services: true do
|
||||||
|
|
||||||
service.execute
|
service.execute
|
||||||
|
|
||||||
expect(current_list_positions).to eq [1, 2, 3, 4]
|
expect(current_list_positions).to eq [0, 1, 2, 3]
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'keeps position of lists when new positon is greater than number of labels lists' do
|
it 'keeps position of lists when new positon is equal to number of labels lists' do
|
||||||
service = described_class.new(project, user, id: planning.id, position: 6)
|
service = described_class.new(project, user, id: planning.id, position: board.lists.label.size)
|
||||||
|
|
||||||
service.execute
|
service.execute
|
||||||
|
|
||||||
expect(current_list_positions).to eq [1, 2, 3, 4]
|
expect(current_list_positions).to eq [0, 1, 2, 3]
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'keeps position of lists when new positon is greater than number of labels lists' do
|
||||||
|
service = described_class.new(project, user, id: planning.id, position: board.lists.label.size + 1)
|
||||||
|
|
||||||
|
service.execute
|
||||||
|
|
||||||
|
expect(current_list_positions).to eq [0, 1, 2, 3]
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'increments position of intermediate lists when new positon is equal to first position' do
|
it 'increments position of intermediate lists when new positon is equal to first position' do
|
||||||
|
service = described_class.new(project, user, id: staging.id, position: 0)
|
||||||
|
|
||||||
|
service.execute
|
||||||
|
|
||||||
|
expect(current_list_positions).to eq [1, 2, 3, 0]
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'decrements position of intermediate lists when new positon is equal to last position' do
|
||||||
|
service = described_class.new(project, user, id: planning.id, position: board.lists.label.last.position)
|
||||||
|
|
||||||
|
service.execute
|
||||||
|
|
||||||
|
expect(current_list_positions).to eq [3, 0, 1, 2]
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'decrements position of intermediate lists when new position is greater than old position' do
|
||||||
|
service = described_class.new(project, user, id: planning.id, position: 2)
|
||||||
|
|
||||||
|
service.execute
|
||||||
|
|
||||||
|
expect(current_list_positions).to eq [2, 0, 1, 3]
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'increments position of intermediate lists when new position is lower than old position' do
|
||||||
service = described_class.new(project, user, id: staging.id, position: 1)
|
service = described_class.new(project, user, id: staging.id, position: 1)
|
||||||
|
|
||||||
service.execute
|
service.execute
|
||||||
|
|
||||||
expect(current_list_positions).to eq [2, 3, 4, 1]
|
expect(current_list_positions).to eq [0, 2, 3, 1]
|
||||||
end
|
|
||||||
|
|
||||||
it 'decrements position of intermediate lists when new positon is equal to last position' do
|
|
||||||
service = described_class.new(project, user, id: planning.id, position: 4)
|
|
||||||
|
|
||||||
service.execute
|
|
||||||
|
|
||||||
expect(current_list_positions).to eq [4, 1, 2, 3]
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'decrements position of intermediate lists when new position is greater than old position' do
|
|
||||||
service = described_class.new(project, user, id: planning.id, position: 3)
|
|
||||||
|
|
||||||
service.execute
|
|
||||||
|
|
||||||
expect(current_list_positions).to eq [3, 1, 2, 4]
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'increments position of intermediate lists when new position is lower than old position' do
|
|
||||||
service = described_class.new(project, user, id: staging.id, position: 2)
|
|
||||||
|
|
||||||
service.execute
|
|
||||||
|
|
||||||
expect(current_list_positions).to eq [1, 3, 4, 2]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -84,7 +92,7 @@ describe Boards::Lists::MoveService, services: true do
|
||||||
|
|
||||||
service.execute
|
service.execute
|
||||||
|
|
||||||
expect(current_list_positions).to eq [1, 2, 3, 4]
|
expect(current_list_positions).to eq [0, 1, 2, 3]
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'keeps position of lists when list type is done' do
|
it 'keeps position of lists when list type is done' do
|
||||||
|
@ -92,7 +100,7 @@ describe Boards::Lists::MoveService, services: true do
|
||||||
|
|
||||||
service.execute
|
service.execute
|
||||||
|
|
||||||
expect(current_list_positions).to eq [1, 2, 3, 4]
|
expect(current_list_positions).to eq [0, 1, 2, 3]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue