Commit f9d97e06 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'bw-fix-board-sorting' into 'master'

Sort boards by ascending id

See merge request gitlab-org/gitlab!24637
parents d9fdfb24 294a7899
...@@ -11,7 +11,10 @@ class Board < ApplicationRecord ...@@ -11,7 +11,10 @@ class Board < ApplicationRecord
validates :group, presence: true, unless: :project validates :group, presence: true, unless: :project
scope :with_associations, -> { preload(:destroyable_lists) } scope :with_associations, -> { preload(:destroyable_lists) }
scope :order_by_name_asc, -> { order(arel_table[:name].lower.asc) }
# Sort by case-insensitive name, then ascending ids. This ensures that we will always
# get the same list/first board no matter how many other boards are named the same
scope :order_by_name_asc, -> { order(arel_table[:name].lower.asc).order(id: :asc) }
scope :first_board, -> { where(id: self.order_by_name_asc.limit(1).select(:id)) } scope :first_board, -> { where(id: self.order_by_name_asc.limit(1).select(:id)) }
def project_needed? def project_needed?
......
---
title: Ensure board lists are sorted consistently
merge_request: 24637
author:
type: fixed
...@@ -16,26 +16,29 @@ describe Board do ...@@ -16,26 +16,29 @@ describe Board do
end end
describe '#order_by_name_asc' do describe '#order_by_name_asc' do
let!(:second_board) { create(:board, name: 'Secondary board', project: project) } let!(:board_B) { create(:board, project: project, name: 'B') }
let!(:first_board) { create(:board, name: 'First board', project: project) } let!(:board_C) { create(:board, project: project, name: 'C') }
let!(:board_a) { create(:board, project: project, name: 'a') }
let!(:board_A) { create(:board, project: project, name: 'A') }
it 'returns in alphabetical order' do it 'returns in case-insensitive alphabetical order and then by ascending id' do
expect(project.boards.order_by_name_asc).to eq [first_board, second_board] expect(project.boards.order_by_name_asc).to eq [board_a, board_A, board_B, board_C]
end end
end end
describe '#first_board' do describe '#first_board' do
let!(:other_board) { create(:board, name: 'Other board', project: other_project) } let!(:board_B) { create(:board, project: project, name: 'B') }
let!(:second_board) { create(:board, name: 'Secondary board', project: project) } let!(:board_C) { create(:board, project: project, name: 'C') }
let!(:first_board) { create(:board, name: 'First board', project: project) } let!(:board_a) { create(:board, project: project, name: 'a') }
let!(:board_A) { create(:board, project: project, name: 'A') }
it 'return the first alphabetical board as a relation' do it 'return the first case-insensitive alphabetical board as a relation' do
expect(project.boards.first_board).to eq [first_board] expect(project.boards.first_board).to eq [board_a]
end end
# BoardsActions#board expects this behavior # BoardsActions#board expects this behavior
it 'raises an error when find is done on a non-existent record' do it 'raises an error when find is done on a non-existent record' do
expect { project.boards.first_board.find(second_board.id) }.to raise_error(ActiveRecord::RecordNotFound) expect { project.boards.first_board.find(board_A.id) }.to raise_error(ActiveRecord::RecordNotFound)
end 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