summaryrefslogtreecommitdiff
path: root/spec/lib/api/helpers_spec.rb
diff options
context:
space:
mode:
authorAndreas Brandl <abrandl@gitlab.com>2018-04-11 17:45:22 +0200
committerAndreas Brandl <abrandl@gitlab.com>2018-04-13 15:59:45 +0200
commitc4e4258721ae08718a69d73e5046119e4db2f5ef (patch)
tree6669e7c658fd30d06a14a31bee9b4bd849e402b6 /spec/lib/api/helpers_spec.rb
parentab98308db7d907e5fad53d2b1e3435960a1665cd (diff)
downloadgitlab-ce-c4e4258721ae08718a69d73e5046119e4db2f5ef.tar.gz
Validate project path prior to hitting the database.
Closes #45247.
Diffstat (limited to 'spec/lib/api/helpers_spec.rb')
-rw-r--r--spec/lib/api/helpers_spec.rb42
1 files changed, 42 insertions, 0 deletions
diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb
index 3c4deba4712..58a49124ce6 100644
--- a/spec/lib/api/helpers_spec.rb
+++ b/spec/lib/api/helpers_spec.rb
@@ -3,6 +3,48 @@ require 'spec_helper'
describe API::Helpers do
subject { Class.new.include(described_class).new }
+ describe '#find_project' do
+ let(:project) { create(:project) }
+
+ shared_examples 'project finder' do
+ context 'when project exists' do
+ it 'returns requested project' do
+ expect(subject.find_project(existing_id)).to eq(project)
+ end
+
+ it 'returns nil' do
+ expect(subject.find_project(non_existing_id)).to be_nil
+ end
+ end
+ end
+
+ context 'when ID is used as an argument' do
+ let(:existing_id) { project.id }
+ let(:non_existing_id) { (Project.maximum(:id) || 0) + 1 }
+
+ it_behaves_like 'project finder'
+ end
+
+ context 'when PATH is used as an argument' do
+ let(:existing_id) { project.full_path }
+ let(:non_existing_id) { 'something/else' }
+
+ it_behaves_like 'project finder'
+
+ context 'with an invalid PATH' do
+ let(:non_existing_id) { 'undefined' } # path without slash
+
+ it_behaves_like 'project finder'
+
+ it 'does not hit the database' do
+ expect(Project).not_to receive(:find_by_full_path)
+
+ subject.find_project(non_existing_id)
+ end
+ end
+ end
+ end
+
describe '#find_namespace' do
let(:namespace) { create(:namespace) }