summaryrefslogtreecommitdiff
path: root/spec/lib/api
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-06-16 18:25:58 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2021-06-16 18:25:58 +0000
commita5f4bba440d7f9ea47046a0a561d49adf0a1e6d4 (patch)
treefb69158581673816a8cd895f9d352dcb3c678b1e /spec/lib/api
parentd16b2e8639e99961de6ddc93909f3bb5c1445ba1 (diff)
downloadgitlab-ce-a5f4bba440d7f9ea47046a0a561d49adf0a1e6d4.tar.gz
Add latest changes from gitlab-org/gitlab@14-0-stable-eev14.0.0-rc42
Diffstat (limited to 'spec/lib/api')
-rw-r--r--spec/lib/api/entities/merge_request_basic_spec.rb11
-rw-r--r--spec/lib/api/helpers/runner_helpers_spec.rb71
-rw-r--r--spec/lib/api/helpers/runner_spec.rb69
-rw-r--r--spec/lib/api/helpers_spec.rb60
4 files changed, 211 insertions, 0 deletions
diff --git a/spec/lib/api/entities/merge_request_basic_spec.rb b/spec/lib/api/entities/merge_request_basic_spec.rb
index 8572b067984..b9d6ab7a652 100644
--- a/spec/lib/api/entities/merge_request_basic_spec.rb
+++ b/spec/lib/api/entities/merge_request_basic_spec.rb
@@ -9,11 +9,22 @@ RSpec.describe ::API::Entities::MergeRequestBasic do
let_it_be(:labels) { create_list(:label, 3) }
let_it_be(:merge_requests) { create_list(:labeled_merge_request, 10, :unique_branches, labels: labels) }
+ let_it_be(:entity) { described_class.new(merge_request) }
+
# This mimics the behavior of the `Grape::Entity` serializer
def present(obj)
described_class.new(obj).presented
end
+ subject { entity.as_json }
+
+ it 'includes basic fields' do
+ is_expected.to include(
+ draft: merge_request.draft?,
+ work_in_progress: merge_request.draft?
+ )
+ end
+
context "with :with_api_entity_associations scope" do
let(:scope) { MergeRequest.with_api_entity_associations }
diff --git a/spec/lib/api/helpers/runner_helpers_spec.rb b/spec/lib/api/helpers/runner_helpers_spec.rb
new file mode 100644
index 00000000000..65b35845aab
--- /dev/null
+++ b/spec/lib/api/helpers/runner_helpers_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Helpers::Runner do
+ let(:ip_address) { '1.2.3.4' }
+ let(:runner_class) do
+ Class.new do
+ include API::Helpers
+ include API::Helpers::Runner
+
+ attr_accessor :params
+
+ def initialize(params)
+ @params = params
+ end
+
+ def ip_address
+ '1.2.3.4'
+ end
+ end
+ end
+
+ let(:runner_helper) { runner_class.new(runner_params) }
+
+ describe '#get_runner_details_from_request' do
+ context 'when no runner info is present' do
+ let(:runner_params) { {} }
+
+ it 'returns the runner IP' do
+ expect(runner_helper.get_runner_details_from_request).to eq({ ip_address: ip_address })
+ end
+ end
+
+ context 'when runner info is present' do
+ let(:name) { 'runner' }
+ let(:version) { '1.2.3' }
+ let(:revision) { '10.0' }
+ let(:platform) { 'test' }
+ let(:architecture) { 'arm' }
+ let(:config) { { 'gpus' => 'all' } }
+ let(:runner_params) do
+ {
+ 'info' =>
+ {
+ 'name' => name,
+ 'version' => version,
+ 'revision' => revision,
+ 'platform' => platform,
+ 'architecture' => architecture,
+ 'config' => config,
+ 'ignored' => 1
+ }
+ }
+ end
+
+ subject(:details) { runner_helper.get_runner_details_from_request }
+
+ it 'extracts the runner details', :aggregate_failures do
+ expect(details.keys).to match_array(%w(name version revision platform architecture config ip_address))
+ expect(details['name']).to eq(name)
+ expect(details['version']).to eq(version)
+ expect(details['revision']).to eq(revision)
+ expect(details['platform']).to eq(platform)
+ expect(details['architecture']).to eq(architecture)
+ expect(details['config']).to eq(config)
+ expect(details['ip_address']).to eq(ip_address)
+ end
+ end
+ end
+end
diff --git a/spec/lib/api/helpers/runner_spec.rb b/spec/lib/api/helpers/runner_spec.rb
new file mode 100644
index 00000000000..e55c20b7ab6
--- /dev/null
+++ b/spec/lib/api/helpers/runner_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Helpers::Runner do
+ let(:helper) { Class.new { include API::Helpers::Runner }.new }
+
+ before do
+ allow(helper).to receive(:env).and_return({})
+ end
+
+ describe '#current_job' do
+ let(:build) { create(:ci_build, :running) }
+
+ it 'handles sticking of a build when a build ID is specified' do
+ allow(helper).to receive(:params).and_return(id: build.id)
+
+ expect(Gitlab::Database::LoadBalancing::RackMiddleware)
+ .to receive(:stick_or_unstick)
+ .with({}, :build, build.id)
+
+ helper.current_job
+ end
+
+ it 'does not handle sticking if no build ID was specified' do
+ allow(helper).to receive(:params).and_return({})
+
+ expect(Gitlab::Database::LoadBalancing::RackMiddleware)
+ .not_to receive(:stick_or_unstick)
+
+ helper.current_job
+ end
+
+ it 'returns the build if one could be found' do
+ allow(helper).to receive(:params).and_return(id: build.id)
+
+ expect(helper.current_job).to eq(build)
+ end
+ end
+
+ describe '#current_runner' do
+ let(:runner) { create(:ci_runner, token: 'foo') }
+
+ it 'handles sticking of a runner if a token is specified' do
+ allow(helper).to receive(:params).and_return(token: runner.token)
+
+ expect(Gitlab::Database::LoadBalancing::RackMiddleware)
+ .to receive(:stick_or_unstick)
+ .with({}, :runner, runner.token)
+
+ helper.current_runner
+ end
+
+ it 'does not handle sticking if no token was specified' do
+ allow(helper).to receive(:params).and_return({})
+
+ expect(Gitlab::Database::LoadBalancing::RackMiddleware)
+ .not_to receive(:stick_or_unstick)
+
+ helper.current_runner
+ end
+
+ it 'returns the runner if one could be found' do
+ allow(helper).to receive(:params).and_return(token: runner.token)
+
+ expect(helper.current_runner).to eq(runner)
+ end
+ end
+end
diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb
index 87cd0d4388c..6e48ee4c315 100644
--- a/spec/lib/api/helpers_spec.rb
+++ b/spec/lib/api/helpers_spec.rb
@@ -7,6 +7,66 @@ RSpec.describe API::Helpers do
subject { Class.new.include(described_class).new }
+ describe '#current_user' do
+ include Rack::Test::Methods
+
+ let(:user) { build(:user, id: 42) }
+
+ let(:helper) do
+ Class.new(Grape::API::Instance) do
+ helpers API::APIGuard::HelperMethods
+ helpers API::Helpers
+ format :json
+
+ get 'user' do
+ current_user ? { id: current_user.id } : { found: false }
+ end
+
+ get 'protected' do
+ authenticate_by_gitlab_geo_node_token!
+ end
+ end
+ end
+
+ def app
+ helper
+ end
+
+ before do
+ allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
+ end
+
+ it 'handles sticking when a user could be found' do
+ allow_any_instance_of(API::Helpers).to receive(:initial_current_user).and_return(user)
+
+ expect(Gitlab::Database::LoadBalancing::RackMiddleware)
+ .to receive(:stick_or_unstick).with(any_args, :user, 42)
+
+ get 'user'
+
+ expect(Gitlab::Json.parse(last_response.body)).to eq({ 'id' => user.id })
+ end
+
+ it 'does not handle sticking if no user could be found' do
+ allow_any_instance_of(API::Helpers).to receive(:initial_current_user).and_return(nil)
+
+ expect(Gitlab::Database::LoadBalancing::RackMiddleware)
+ .not_to receive(:stick_or_unstick)
+
+ get 'user'
+
+ expect(Gitlab::Json.parse(last_response.body)).to eq({ 'found' => false })
+ end
+
+ it 'returns the user if one could be found' do
+ allow_any_instance_of(API::Helpers).to receive(:initial_current_user).and_return(user)
+
+ get 'user'
+
+ expect(Gitlab::Json.parse(last_response.body)).to eq({ 'id' => user.id })
+ end
+ end
+
describe '#find_project' do
let(:project) { create(:project) }