Commit bd219711 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'dz-nested-group-improvements-2' into 'master'

Minor improvements to nested groups code

See merge request !8011
parents 0139896b 3e0b8e00
...@@ -7,6 +7,7 @@ module Routable ...@@ -7,6 +7,7 @@ module Routable
has_one :route, as: :source, autosave: true, dependent: :destroy has_one :route, as: :source, autosave: true, dependent: :destroy
validates_associated :route validates_associated :route
validates :route, presence: true
before_validation :update_route_path, if: :full_path_changed? before_validation :update_route_path, if: :full_path_changed?
end end
...@@ -28,17 +29,17 @@ module Routable ...@@ -28,17 +29,17 @@ module Routable
order_sql = "(CASE WHEN #{binary} routes.path = #{connection.quote(path)} THEN 0 ELSE 1 END)" order_sql = "(CASE WHEN #{binary} routes.path = #{connection.quote(path)} THEN 0 ELSE 1 END)"
where_paths_in([path]).reorder(order_sql).take where_full_path_in([path]).reorder(order_sql).take
end end
# Builds a relation to find multiple objects by their full paths. # Builds a relation to find multiple objects by their full paths.
# #
# Usage: # Usage:
# #
# Klass.where_paths_in(%w{gitlab-org/gitlab-ce gitlab-org/gitlab-ee}) # Klass.where_full_path_in(%w{gitlab-org/gitlab-ce gitlab-org/gitlab-ee})
# #
# Returns an ActiveRecord::Relation. # Returns an ActiveRecord::Relation.
def where_paths_in(paths) def where_full_path_in(paths)
wheres = [] wheres = []
cast_lower = Gitlab::Database.postgresql? cast_lower = Gitlab::Database.postgresql?
......
...@@ -248,7 +248,7 @@ module Banzai ...@@ -248,7 +248,7 @@ module Banzai
end end
def projects_relation_for_paths(paths) def projects_relation_for_paths(paths)
Project.where_paths_in(paths).includes(:namespace) Project.where_full_path_in(paths).includes(:namespace)
end end
# Returns projects for the given paths. # Returns projects for the given paths.
......
...@@ -19,5 +19,9 @@ FactoryGirl.define do ...@@ -19,5 +19,9 @@ FactoryGirl.define do
trait :access_requestable do trait :access_requestable do
request_access_enabled true request_access_enabled true
end end
trait :nested do
parent factory: :group
end
end end
end end
...@@ -3,6 +3,10 @@ require 'spec_helper' ...@@ -3,6 +3,10 @@ require 'spec_helper'
describe Group, 'Routable' do describe Group, 'Routable' do
let!(:group) { create(:group) } let!(:group) { create(:group) }
describe 'Validations' do
it { is_expected.to validate_presence_of(:route) }
end
describe 'Associations' do describe 'Associations' do
it { is_expected.to have_one(:route).dependent(:destroy) } it { is_expected.to have_one(:route).dependent(:destroy) }
end end
...@@ -35,16 +39,16 @@ describe Group, 'Routable' do ...@@ -35,16 +39,16 @@ describe Group, 'Routable' do
it { expect(described_class.find_by_full_path('unknown')).to eq(nil) } it { expect(described_class.find_by_full_path('unknown')).to eq(nil) }
end end
describe '.where_paths_in' do describe '.where_full_path_in' do
context 'without any paths' do context 'without any paths' do
it 'returns an empty relation' do it 'returns an empty relation' do
expect(described_class.where_paths_in([])).to eq([]) expect(described_class.where_full_path_in([])).to eq([])
end end
end end
context 'without any valid paths' do context 'without any valid paths' do
it 'returns an empty relation' do it 'returns an empty relation' do
expect(described_class.where_paths_in(%w[unknown])).to eq([]) expect(described_class.where_full_path_in(%w[unknown])).to eq([])
end end
end end
...@@ -52,13 +56,13 @@ describe Group, 'Routable' do ...@@ -52,13 +56,13 @@ describe Group, 'Routable' do
let!(:nested_group) { create(:group, parent: group) } let!(:nested_group) { create(:group, parent: group) }
it 'returns the projects matching the paths' do it 'returns the projects matching the paths' do
result = described_class.where_paths_in([group.to_param, nested_group.to_param]) result = described_class.where_full_path_in([group.to_param, nested_group.to_param])
expect(result).to contain_exactly(group, nested_group) expect(result).to contain_exactly(group, nested_group)
end end
it 'returns projects regardless of the casing of paths' do it 'returns projects regardless of the casing of paths' do
result = described_class.where_paths_in([group.to_param.upcase, nested_group.to_param.upcase]) result = described_class.where_full_path_in([group.to_param.upcase, nested_group.to_param.upcase])
expect(result).to contain_exactly(group, nested_group) expect(result).to contain_exactly(group, nested_group)
end end
......
...@@ -271,4 +271,11 @@ describe Group, models: true do ...@@ -271,4 +271,11 @@ describe Group, models: true do
expect(group.web_url).to include("groups/#{group.name}") expect(group.web_url).to include("groups/#{group.name}")
end end
end end
describe 'nested group' do
subject { create(:group, :nested) }
it { is_expected.to be_valid }
it { expect(subject.parent).to be_kind_of(Group) }
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