Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Van Landuyt <bob@vanlanduyt.co>2017-09-10 19:43:15 +0300
committerBob Van Landuyt <bob@vanlanduyt.co>2017-10-04 23:49:41 +0300
commit79cc3c8e3e7938ea53459e34ca585ae66791199e (patch)
tree59b51c70d1ed62b26a185efa6687257202de0629 /spec/controllers/groups_controller_spec.rb
parentbb5187bb2a71f87b3ff49388f70dbcb27dfe4c6a (diff)
Limit the amount of queries per row
Diffstat (limited to 'spec/controllers/groups_controller_spec.rb')
-rw-r--r--spec/controllers/groups_controller_spec.rb85
1 files changed, 79 insertions, 6 deletions
diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb
index 9cddb538a59..25778cc2b59 100644
--- a/spec/controllers/groups_controller_spec.rb
+++ b/spec/controllers/groups_controller_spec.rb
@@ -226,14 +226,10 @@ describe GroupsController do
end
context 'filtering children' do
- def get_filtered_list
- get :children, id: group.to_param, filter: 'filter', format: :json
- end
-
it 'expands the tree for matching projects' do
project = create(:project, :public, namespace: public_subgroup, name: 'filterme')
- get_filtered_list
+ get :children, id: group.to_param, filter: 'filter', format: :json
group_json = json_response.first
project_json = group_json['children'].first
@@ -245,7 +241,7 @@ describe GroupsController do
it 'expands the tree for matching subgroups' do
matched_group = create(:group, :public, parent: public_subgroup, name: 'filterme')
- get_filtered_list
+ get :children, id: group.to_param, filter: 'filter', format: :json
group_json = json_response.first
matched_group_json = group_json['children'].first
@@ -254,6 +250,83 @@ describe GroupsController do
expect(matched_group_json['id']).to eq(matched_group.id)
end
end
+
+ context 'queries per rendered element' do
+ # The expected extra queries for the rendered group are:
+ # 1. Count of memberships of the group
+ # 2. Count of visible projects in the element
+ # 3. Count of visible subgroups in the element
+ let(:expected_queries_per_group) { 3 }
+ let(:expected_queries_per_project) { 0 }
+
+ def get_list
+ get :children, id: group.to_param, format: :json
+ end
+
+ it 'queries the expected amount for a group row' do
+ control_count = ActiveRecord::QueryRecorder.new { get_list }.count
+
+ _new_group = create(:group, :public, parent: group)
+
+ expect { get_list }.not_to exceed_query_limit(control_count + expected_queries_per_group)
+ end
+
+ it 'queries the expected amount for a project row' do
+ control_count = ActiveRecord::QueryRecorder.new { get_list }.count
+
+ _new_project = create(:project, :public, namespace: group)
+
+ expect { get_list }.not_to exceed_query_limit(control_count + expected_queries_per_project)
+ end
+
+ context 'when rendering hierarchies' do
+ def get_filtered_list
+ get :children, id: group.to_param, filter: 'filter', format: :json
+ end
+
+ it 'queries the expected amount when nested rows are rendered for a group' do
+ matched_group = create(:group, :public, parent: public_subgroup, name: 'filterme')
+
+ control_count = ActiveRecord::QueryRecorder.new { get_filtered_list }.count
+
+ nested_group = create(:group, :public, parent: public_subgroup)
+ matched_group.update!(parent: nested_group)
+
+ expect { get_filtered_list }.not_to exceed_query_limit(control_count + expected_queries_per_group)
+ end
+
+ it 'queries the expected amount when a new group match is added' do
+ create(:group, :public, parent: public_subgroup, name: 'filterme')
+
+ control_count = ActiveRecord::QueryRecorder.new { get_filtered_list }.count
+
+ create(:group, :public, parent: public_subgroup, name: 'filterme2')
+
+ expect { get_filtered_list }.not_to exceed_query_limit(control_count + expected_queries_per_group)
+ end
+
+ it 'queries the expected amount when nested rows are rendered for a project' do
+ matched_project = create(:project, :public, namespace: public_subgroup, name: 'filterme')
+
+ control_count = ActiveRecord::QueryRecorder.new { get_filtered_list }.count
+
+ nested_group = create(:group, :public, parent: public_subgroup)
+ matched_project.update!(namespace: nested_group)
+
+ expect { get_filtered_list }.not_to exceed_query_limit(control_count + expected_queries_per_group)
+ end
+
+ it 'queries the expected amount when a new project match is added' do
+ create(:project, :public, namespace: public_subgroup, name: 'filterme')
+
+ control_count = ActiveRecord::QueryRecorder.new { get_filtered_list }.count
+
+ create(:project, :public, namespace: public_subgroup, name: 'filterme2')
+
+ expect { get_filtered_list }.not_to exceed_query_limit(control_count + expected_queries_per_project)
+ end
+ end
+ end
end
end