Commit 80780018 authored by Bob Van Landuyt's avatar Bob Van Landuyt

Update `children` route to handle projects and groups

parent 648c082a
......@@ -61,7 +61,11 @@ class GroupsController < Groups::ApplicationController
end
def children
parent = Group.find_by(parent_id: params[:parent_id]) || @group
parent = if params[:parent_id].present?
Group.find(params[:parent_id])
else
@group
end
if parent.nil? || !can?(current_user, :read_group, parent)
render_404
end
......@@ -70,7 +74,7 @@ class GroupsController < Groups::ApplicationController
respond_to do |format|
format.json do
render json: GroupChildrenSerializer
render json: GroupChildSerializer
.new(current_user: current_user)
.with_pagination(request, response)
.represent(@children)
......
......@@ -41,6 +41,9 @@ scope(path: 'groups/*id',
get :merge_requests, as: :merge_requests_group
get :projects, as: :projects_group
get :activity, as: :activity_group
scope(path: '-') do
get :children, as: :group_children
end
get '/', action: :show, as: :group_canonical
end
......
......@@ -129,7 +129,6 @@ module Gitlab
notification_setting
pipeline_quota
projects
subgroups
].freeze
ILLEGAL_PROJECT_PATH_WORDS = PROJECT_WILDCARD_ROUTES
......
......@@ -150,39 +150,79 @@ describe GroupsController do
end
end
describe 'GET #subgroups', :nested_groups do
describe 'GET #children' do
context 'for projects' do
let!(:public_project) { create(:project, :public, namespace: group) }
let!(:private_project) { create(:project, :private, namespace: group) }
context 'as a user' do
before do
sign_in(user)
end
it 'shows all children' do
get :children, id: group.to_param, format: :json
expect(assigns(:children)).to contain_exactly(public_project, private_project)
end
context 'being member of private subgroup' do
it 'shows public and private children the user is member of' do
group_member.destroy!
private_project.add_guest(user)
get :children, id: group.to_param, format: :json
expect(assigns(:children)).to contain_exactly(public_project, private_project)
end
end
end
context 'as a guest' do
it 'shows the public children' do
get :children, id: group.to_param, format: :json
expect(assigns(:children)).to contain_exactly(public_project)
end
end
end
context 'for subgroups', :nested_groups do
let!(:public_subgroup) { create(:group, :public, parent: group) }
let!(:private_subgroup) { create(:group, :private, parent: group) }
let!(:public_project) { create(:project, :public, namespace: group) }
let!(:private_project) { create(:project, :private, namespace: group) }
context 'as a user' do
before do
sign_in(user)
pending('spec the children path instead')
end
it 'shows all subgroups' do
get :subgroups, id: group.to_param
it 'shows all children' do
get :children, id: group.to_param, format: :json
expect(assigns(:nested_groups)).to contain_exactly(public_subgroup, private_subgroup)
expect(assigns(:children)).to contain_exactly(public_subgroup, private_subgroup, public_project, private_project)
end
context 'being member of private subgroup' do
it 'shows public and private subgroups the user is member of' do
it 'shows public and private children the user is member of' do
group_member.destroy!
private_subgroup.add_guest(user)
private_project.add_guest(user)
get :subgroups, id: group.to_param
get :children, id: group.to_param, format: :json
expect(assigns(:nested_groups)).to contain_exactly(public_subgroup, private_subgroup)
expect(assigns(:children)).to contain_exactly(public_subgroup, private_subgroup, public_project, private_project)
end
end
end
context 'as a guest' do
it 'shows the public subgroups' do
get :subgroups, id: group.to_param
it 'shows the public children' do
get :children, id: group.to_param, format: :json
expect(assigns(:nested_groups)).to contain_exactly(public_subgroup)
expect(assigns(:children)).to contain_exactly(public_subgroup, public_project)
end
end
end
end
......
......@@ -213,7 +213,7 @@ describe Gitlab::PathRegex do
it 'accepts group routes' do
expect(subject).to match('activity/')
expect(subject).to match('group_members/')
expect(subject).to match('subgroups/')
expect(subject).to match('labels/')
end
it 'is not case sensitive' do
......@@ -246,7 +246,7 @@ describe Gitlab::PathRegex do
it 'accepts group routes' do
expect(subject).to match('activity/')
expect(subject).to match('group_members/')
expect(subject).to match('subgroups/')
expect(subject).to match('labels/')
end
end
......@@ -268,7 +268,7 @@ describe Gitlab::PathRegex do
it 'accepts group routes' do
expect(subject).to match('activity/more/')
expect(subject).to match('group_members/more/')
expect(subject).to match('subgroups/more/')
expect(subject).to match('labels/more/')
end
end
end
......@@ -292,7 +292,7 @@ describe Gitlab::PathRegex do
it 'rejects group routes' do
expect(subject).not_to match('root/activity/')
expect(subject).not_to match('root/group_members/')
expect(subject).not_to match('root/subgroups/')
expect(subject).not_to match('root/labels/')
end
end
......@@ -314,7 +314,7 @@ describe Gitlab::PathRegex do
it 'rejects group routes' do
expect(subject).not_to match('root/activity/more/')
expect(subject).not_to match('root/group_members/more/')
expect(subject).not_to match('root/subgroups/more/')
expect(subject).not_to match('root/labels/more/')
end
end
end
......@@ -349,7 +349,7 @@ describe Gitlab::PathRegex do
it 'accepts group routes' do
expect(subject).to match('activity/')
expect(subject).to match('group_members/')
expect(subject).to match('subgroups/')
expect(subject).to match('labels/')
end
it 'is not case sensitive' do
......@@ -382,7 +382,7 @@ describe Gitlab::PathRegex do
it 'accepts group routes' do
expect(subject).to match('root/activity/')
expect(subject).to match('root/group_members/')
expect(subject).to match('root/subgroups/')
expect(subject).to match('root/labels/')
end
it 'is not case sensitive' do
......
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