summaryrefslogtreecommitdiff
path: root/spec/requests/api/groups_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/requests/api/groups_spec.rb')
-rw-r--r--spec/requests/api/groups_spec.rb34
1 files changed, 32 insertions, 2 deletions
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 7de3567dcdd..ffc5d353958 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -1164,17 +1164,47 @@ RSpec.describe API::Groups do
end
context 'when include_subgroups is true' do
- it "returns projects including those in subgroups" do
+ before do
subgroup = create(:group, parent: group1)
+ subgroup2 = create(:group, parent: subgroup)
+
create(:project, group: subgroup)
create(:project, group: subgroup)
+ create(:project, group: subgroup2)
+
+ group1.reload
+ end
+
+ it "only looks up root ancestor once and returns projects including those in subgroups" do
+ expect(Namespace).to receive(:find_by).with(id: group1.id.to_s).once.and_call_original # For the group sent in the API call
+ expect(Namespace).to receive(:find_by).with(id: group1.traversal_ids.first).once.and_call_original # root_ancestor direct lookup
+ expect(Namespace).to receive(:joins).with(start_with('INNER JOIN (SELECT id, traversal_ids[1]')).once.and_call_original # All-in-one root_ancestor query
get api("/groups/#{group1.id}/projects", user1), params: { include_subgroups: true }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(json_response).to be_an(Array)
- expect(json_response.length).to eq(5)
+ expect(json_response.length).to eq(6)
+ end
+
+ context 'when group_projects_api_preload_groups feature is disabled' do
+ before do
+ stub_feature_flags(group_projects_api_preload_groups: false)
+ end
+
+ it 'looks up the root ancestor multiple times' do
+ expect(Namespace).to receive(:find_by).with(id: group1.id.to_s).once.and_call_original
+ expect(Namespace).to receive(:find_by).with(id: group1.traversal_ids.first).at_least(:twice).and_call_original
+ expect(Namespace).not_to receive(:joins).with(start_with('INNER JOIN (SELECT id, traversal_ids[1]'))
+
+ get api("/groups/#{group1.id}/projects", user1), params: { include_subgroups: true }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an(Array)
+ expect(json_response.length).to eq(6)
+ end
end
end