diff options
| author | Rémy Coutable <remy@rymai.me> | 2016-10-05 15:40:29 +0000 |
|---|---|---|
| committer | Rémy Coutable <remy@rymai.me> | 2016-10-05 15:40:29 +0000 |
| commit | 8ddb082fbcdfdfe9ce14922e88a38bf02504d7c3 (patch) | |
| tree | 48bf9769b17cfcf682d1289af10aa754c85cc37f /spec | |
| parent | ba4c392721bc5d784b5d71a5ea41ee83edebc923 (diff) | |
| parent | 154253cab55491d54dfe264fa946acb9c399398a (diff) | |
| download | gitlab-ce-8ddb082fbcdfdfe9ce14922e88a38bf02504d7c3.tar.gz | |
Merge branch 'trending-caching' into 'master'
Refactor TrendingProjectsFinder to support caching
## What does this MR do?
This refactors `TrendingProjectsFinder` so it can support caching of the data. See cb7d398972d786ba7133418266fa34ae641b2497 for more details.
## Why was this MR needed?
Trending projects is quite slow, easily taking seconds to load the entire page.
https://gitlab.com/gitlab-org/gitlab-ce/issues/22164
https://gitlab.com/gitlab-com/infrastructure/milestones/4, in particular the section "Trending page under 2s"
See merge request !6672
Diffstat (limited to 'spec')
| -rw-r--r-- | spec/finders/trending_projects_finder_spec.rb | 53 | ||||
| -rw-r--r-- | spec/models/project_spec.rb | 8 |
2 files changed, 39 insertions, 22 deletions
diff --git a/spec/finders/trending_projects_finder_spec.rb b/spec/finders/trending_projects_finder_spec.rb index a49cbfd5160..cfe15b9defa 100644 --- a/spec/finders/trending_projects_finder_spec.rb +++ b/spec/finders/trending_projects_finder_spec.rb @@ -1,39 +1,48 @@ require 'spec_helper' describe TrendingProjectsFinder do - let(:user) { build(:user) } + let(:user) { create(:user) } + let(:public_project1) { create(:empty_project, :public) } + let(:public_project2) { create(:empty_project, :public) } + let(:private_project) { create(:empty_project, :private) } + let(:internal_project) { create(:empty_project, :internal) } + + before do + 3.times do + create(:note_on_commit, project: public_project1) + end - describe '#execute' do - describe 'without an explicit start date' do - subject { described_class.new } + 2.times do + create(:note_on_commit, project: public_project2, created_at: 5.weeks.ago) + end - it 'returns the trending projects' do - relation = double(:ar_relation) + create(:note_on_commit, project: private_project) + create(:note_on_commit, project: internal_project) + end - allow(subject).to receive(:projects_for) - .with(user) - .and_return(relation) + describe '#execute', caching: true do + context 'without an explicit time range' do + it 'returns public trending projects' do + projects = described_class.new.execute - allow(relation).to receive(:trending) - .with(an_instance_of(ActiveSupport::TimeWithZone)) + expect(projects).to eq([public_project1]) end end - describe 'with an explicit start date' do - let(:date) { 2.months.ago } + context 'with an explicit time range' do + it 'returns public trending projects' do + projects = described_class.new.execute(2) - subject { described_class.new } + expect(projects).to eq([public_project1, public_project2]) + end + end - it 'returns the trending projects' do - relation = double(:ar_relation) + it 'caches the list of projects' do + projects = described_class.new - allow(subject).to receive(:projects_for) - .with(user) - .and_return(relation) + expect(Project).to receive(:trending).once - allow(relation).to receive(:trending) - .with(date) - end + 2.times { projects.execute } end end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 3ab5ac78bba..e52d4aaf884 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -824,6 +824,14 @@ describe Project, models: true do expect(subject).to eq([project2, project1]) end end + + it 'does not take system notes into account' do + 10.times do + create(:note_on_commit, project: project2, system: true) + end + + expect(described_class.trending.to_a).to eq([project1, project2]) + end end describe '.visible_to_user' do |
