diff options
author | Bob Van Landuyt <bob@vanlanduyt.co> | 2017-09-15 12:28:21 +0200 |
---|---|---|
committer | Bob Van Landuyt <bob@vanlanduyt.co> | 2017-10-04 22:49:41 +0200 |
commit | 9781ac552d4ae41983b2d95768e0fb06817e0ef9 (patch) | |
tree | 8beef5af5c8ac701ce53fcf47591d0ea1f6aff32 | |
parent | 20a08965bc949ea233cdde4e777698222fcabff2 (diff) | |
download | gitlab-ce-9781ac552d4ae41983b2d95768e0fb06817e0ef9.tar.gz |
Include pagination when rendering expanded hierarchies
-rw-r--r-- | app/serializers/concerns/with_pagination.rb | 6 | ||||
-rw-r--r-- | app/serializers/group_child_serializer.rb | 32 | ||||
-rw-r--r-- | spec/controllers/groups_controller_spec.rb | 12 |
3 files changed, 33 insertions, 17 deletions
diff --git a/app/serializers/concerns/with_pagination.rb b/app/serializers/concerns/with_pagination.rb index 484c6855f7c..d29e22d6740 100644 --- a/app/serializers/concerns/with_pagination.rb +++ b/app/serializers/concerns/with_pagination.rb @@ -1,10 +1,12 @@ module WithPagination + attr_accessor :paginator + def with_pagination(request, response) - tap { @paginator = Gitlab::Serializer::Pagination.new(request, response) } + tap { self.paginator = Gitlab::Serializer::Pagination.new(request, response) } end def paginated? - @paginator.present? + paginator.present? end # super is `BaseSerializer#represent` here. diff --git a/app/serializers/group_child_serializer.rb b/app/serializers/group_child_serializer.rb index 65dd1ced2a3..fb47bf0b4eb 100644 --- a/app/serializers/group_child_serializer.rb +++ b/app/serializers/group_child_serializer.rb @@ -1,18 +1,20 @@ class GroupChildSerializer < BaseSerializer include WithPagination - attr_reader :hierarchy_root + attr_reader :hierarchy_root, :should_expand_hierarchy entity GroupChildEntity def expand_hierarchy(hierarchy_root = nil) - @hierarchy_root = hierarchy_root - @expand_hierarchy = true - self + tap do + @hierarchy_root = hierarchy_root + @should_expand_hierarchy = true + end end def represent(resource, opts = {}, entity_class = nil) - if @expand_hierarchy + if should_expand_hierarchy + paginator.paginate(resource) if paginated? represent_hierarchies(resource, opts) else super(resource, opts) @@ -33,15 +35,15 @@ class GroupChildSerializer < BaseSerializer def represent_hierarchy(hierarchy, opts) serializer = self.class.new(parameters) - result = if hierarchy.is_a?(Hash) - hierarchy.map do |parent, children| - serializer.represent(parent, opts) - .merge(children: Array.wrap(serializer.represent_hierarchy(children, opts))) - end - else - serializer.represent(hierarchy, opts) - end - - result + if hierarchy.is_a?(Hash) + hierarchy.map do |parent, children| + serializer.represent(parent, opts) + .merge(children: Array.wrap(serializer.represent_hierarchy(children, opts))) + end + elsif hierarchy.is_a?(Array) + hierarchy.map { |child| serializer.represent_hierarchy(child, opts) } + else + serializer.represent(hierarchy, opts) + end end end diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb index 18791a01035..21d5433a970 100644 --- a/spec/controllers/groups_controller_spec.rb +++ b/spec/controllers/groups_controller_spec.rb @@ -152,6 +152,10 @@ describe GroupsController do describe 'GET #show' do context 'pagination' do + before do + allow(Kaminari.config).to receive(:default_per_page).and_return(2) + end + context 'with only projects' do let!(:other_project) { create(:project, :public, namespace: group) } let!(:first_page_projects) { create_list(:project, Kaminari.config.default_per_page, :public, namespace: group ) } @@ -288,6 +292,14 @@ describe GroupsController do expect(group_json['id']).to eq(public_subgroup.id) expect(matched_group_json['id']).to eq(matched_group.id) end + + it 'includes pagination headers' do + 2.times { |i| create(:group, :public, parent: public_subgroup, name: "filterme#{i}") } + + get :children, id: group.to_param, filter: 'filter', per_page: 1, format: :json + + expect(response).to include_pagination_headers + end end context 'queries per rendered element', :request_store do |