summaryrefslogtreecommitdiff
path: root/spec/models/user_spec.rb
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2015-11-16 14:28:02 +0100
committerYorick Peterse <yorickpeterse@gmail.com>2015-11-18 13:05:45 +0100
commit5fcd9986b86812786c90a0b8d3461db79ce71051 (patch)
tree959c2a1187f5e8d0fabdf2c6e8d1a9c441e4e4d4 /spec/models/user_spec.rb
parentbfd9855a2b2a09e8f5bff89e84891d3ad598fe0d (diff)
downloadgitlab-ce-5fcd9986b86812786c90a0b8d3461db79ce71051.tar.gz
Refactor getting user groups/projects/contributions
This new setup no longer loads any IDs into memory using "pluck", instead using SQL UNIONs to merge the various datasets together. This results in greatly improved query performance as well as a reduction of memory usage. The old setup was in particular problematic when requesting the authorized projects _including_ public/internal projects as this would result in roughly 65000 project IDs being loaded into memory. These IDs would in turn be passed to other queries.
Diffstat (limited to 'spec/models/user_spec.rb')
-rw-r--r--spec/models/user_spec.rb52
1 files changed, 48 insertions, 4 deletions
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 7d716c23120..71160f8dfef 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -686,7 +686,7 @@ describe User do
end
end
- describe "#contributed_projects_ids" do
+ describe "#contributed_projects" do
subject { create(:user) }
let!(:project1) { create(:project) }
let!(:project2) { create(:project, forked_from_project: project3) }
@@ -701,15 +701,15 @@ describe User do
end
it "includes IDs for projects the user has pushed to" do
- expect(subject.contributed_projects_ids).to include(project1.id)
+ expect(subject.contributed_projects).to include(project1)
end
it "includes IDs for projects the user has had merge requests merged into" do
- expect(subject.contributed_projects_ids).to include(project3.id)
+ expect(subject.contributed_projects).to include(project3)
end
it "doesn't include IDs for unrelated projects" do
- expect(subject.contributed_projects_ids).not_to include(project2.id)
+ expect(subject.contributed_projects).not_to include(project2)
end
end
@@ -758,4 +758,48 @@ describe User do
expect(subject.recent_push).to eq(nil)
end
end
+
+ describe '#authorized_groups' do
+ let!(:user) { create(:user) }
+ let!(:private_group) { create(:group) }
+ let!(:public_group) { create(:group, public: true) }
+
+ before do
+ private_group.add_user(user, Gitlab::Access::MASTER)
+ end
+
+ describe 'excluding public groups' do
+ subject { user.authorized_groups }
+
+ it { is_expected.to eq([private_group]) }
+ end
+
+ describe 'including public groups' do
+ subject { user.authorized_groups(true) }
+
+ it { is_expected.to eq([public_group, private_group]) }
+ end
+ end
+
+ describe '#authorized_projects' do
+ let!(:user) { create(:user) }
+ let!(:private_project) { create(:project, :private) }
+ let!(:public_project) { create(:project, :public) }
+
+ before do
+ private_project.team << [user, Gitlab::Access::MASTER]
+ end
+
+ describe 'excluding public projects' do
+ subject { user.authorized_projects }
+
+ it { is_expected.to eq([private_project]) }
+ end
+
+ describe 'including public projects' do
+ subject { user.authorized_projects(true) }
+
+ it { is_expected.to eq([public_project, private_project]) }
+ end
+ end
end