diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-04-20 23:50:22 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-04-20 23:50:22 +0000 |
commit | 9dc93a4519d9d5d7be48ff274127136236a3adb3 (patch) | |
tree | 70467ae3692a0e35e5ea56bcb803eb512a10bedb /spec/lib/api | |
parent | 4b0f34b6d759d6299322b3a54453e930c6121ff0 (diff) | |
download | gitlab-ce-9dc93a4519d9d5d7be48ff274127136236a3adb3.tar.gz |
Add latest changes from gitlab-org/gitlab@13-11-stable-eev13.11.0-rc43
Diffstat (limited to 'spec/lib/api')
-rw-r--r-- | spec/lib/api/entities/clusters/agent_spec.rb | 16 | ||||
-rw-r--r-- | spec/lib/api/entities/design_management/design_spec.rb | 1 | ||||
-rw-r--r-- | spec/lib/api/entities/merge_request_changes_spec.rb | 1 | ||||
-rw-r--r-- | spec/lib/api/entities/project_import_failed_relation_spec.rb | 2 | ||||
-rw-r--r-- | spec/lib/api/entities/release_spec.rb | 1 | ||||
-rw-r--r-- | spec/lib/api/helpers/authentication_spec.rb | 15 | ||||
-rw-r--r-- | spec/lib/api/helpers/caching_spec.rb | 139 | ||||
-rw-r--r-- | spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb | 10 | ||||
-rw-r--r-- | spec/lib/api/helpers/packages_manager_clients_helpers_spec.rb | 3 | ||||
-rw-r--r-- | spec/lib/api/helpers/variables_helpers_spec.rb | 43 | ||||
-rw-r--r-- | spec/lib/api/helpers_spec.rb | 109 |
11 files changed, 289 insertions, 51 deletions
diff --git a/spec/lib/api/entities/clusters/agent_spec.rb b/spec/lib/api/entities/clusters/agent_spec.rb new file mode 100644 index 00000000000..04f7ec28407 --- /dev/null +++ b/spec/lib/api/entities/clusters/agent_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe API::Entities::Clusters::Agent do + let_it_be(:cluster_agent) { create(:cluster_agent) } + + subject { described_class.new(cluster_agent).as_json } + + it 'includes basic fields' do + expect(subject).to include( + id: cluster_agent.id, + config_project: a_hash_including(id: cluster_agent.project_id) + ) + end +end diff --git a/spec/lib/api/entities/design_management/design_spec.rb b/spec/lib/api/entities/design_management/design_spec.rb index fe449e3e9bc..fe2b1dadfa7 100644 --- a/spec/lib/api/entities/design_management/design_spec.rb +++ b/spec/lib/api/entities/design_management/design_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe API::Entities::DesignManagement::Design do let_it_be(:design) { create(:design) } + let(:entity) { described_class.new(design, request: double) } subject { entity.as_json } diff --git a/spec/lib/api/entities/merge_request_changes_spec.rb b/spec/lib/api/entities/merge_request_changes_spec.rb index f46d8981328..29bfd1da6cc 100644 --- a/spec/lib/api/entities/merge_request_changes_spec.rb +++ b/spec/lib/api/entities/merge_request_changes_spec.rb @@ -5,6 +5,7 @@ require 'spec_helper' RSpec.describe ::API::Entities::MergeRequestChanges do let_it_be(:user) { create(:user) } let_it_be(:merge_request) { create(:merge_request) } + let(:entity) { described_class.new(merge_request, current_user: user) } subject(:basic_entity) { entity.as_json } diff --git a/spec/lib/api/entities/project_import_failed_relation_spec.rb b/spec/lib/api/entities/project_import_failed_relation_spec.rb index 51a684c4564..d3c24f6fce3 100644 --- a/spec/lib/api/entities/project_import_failed_relation_spec.rb +++ b/spec/lib/api/entities/project_import_failed_relation_spec.rb @@ -14,7 +14,7 @@ RSpec.describe API::Entities::ProjectImportFailedRelation do id: import_failure.id, created_at: import_failure.created_at, exception_class: import_failure.exception_class, - exception_message: import_failure.exception_message, + exception_message: nil, relation_name: import_failure.relation_key, source: import_failure.source ) diff --git a/spec/lib/api/entities/release_spec.rb b/spec/lib/api/entities/release_spec.rb index d57c283c1f4..06062634015 100644 --- a/spec/lib/api/entities/release_spec.rb +++ b/spec/lib/api/entities/release_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe API::Entities::Release do let_it_be(:project) { create(:project) } + let(:release) { create(:release, project: project) } let(:evidence) { release.evidences.first } let(:user) { create(:user) } diff --git a/spec/lib/api/helpers/authentication_spec.rb b/spec/lib/api/helpers/authentication_spec.rb index 461b0d2f6f9..eea5c10d4f8 100644 --- a/spec/lib/api/helpers/authentication_spec.rb +++ b/spec/lib/api/helpers/authentication_spec.rb @@ -7,6 +7,7 @@ RSpec.describe API::Helpers::Authentication do let_it_be(:project, reload: true) { create(:project, :public) } let_it_be(:personal_access_token) { create(:personal_access_token, user: user) } let_it_be(:deploy_token) { create(:deploy_token, read_package_registry: true, write_package_registry: true) } + let_it_be(:ci_build) { create(:ci_build, :running, user: user) } describe 'class methods' do subject { Class.new.include(described_class::ClassMethods).new } @@ -176,6 +177,20 @@ RSpec.describe API::Helpers::Authentication do end end + describe '#ci_build_from_namespace_inheritable' do + subject { object.ci_build_from_namespace_inheritable } + + it 'returns #token_from_namespace_inheritable if it is a ci build' do + expect(object).to receive(:token_from_namespace_inheritable).and_return(ci_build) + expect(subject).to be(ci_build) + end + + it 'returns nil if #token_from_namespace_inheritable is not a ci build' do + expect(object).to receive(:token_from_namespace_inheritable).and_return(personal_access_token) + expect(subject).to eq(nil) + end + end + describe '#user_from_namespace_inheritable' do subject { object.user_from_namespace_inheritable } diff --git a/spec/lib/api/helpers/caching_spec.rb b/spec/lib/api/helpers/caching_spec.rb new file mode 100644 index 00000000000..a8cd061e123 --- /dev/null +++ b/spec/lib/api/helpers/caching_spec.rb @@ -0,0 +1,139 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe API::Helpers::Caching do + subject(:instance) { Class.new.include(described_class).new } + + describe "#present_cached" do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + + let(:presenter) { API::Entities::Todo } + + let(:kwargs) do + { + with: presenter, + project: project + } + end + + subject do + instance.present_cached(presentable, **kwargs) + end + + before do + # We have to stub #body as it's a Grape method + # unavailable in the module by itself + expect(instance).to receive(:body) do |data| + data + end + + allow(instance).to receive(:current_user) { user } + end + + context "single object" do + let_it_be(:presentable) { create(:todo, project: project) } + + it { is_expected.to be_a(Gitlab::Json::PrecompiledJson) } + + it "uses the presenter" do + expect(presenter).to receive(:represent).with(presentable, project: project) + + subject + end + + it "is valid JSON" do + parsed = Gitlab::Json.parse(subject.to_s) + + expect(parsed).to be_a(Hash) + expect(parsed["id"]).to eq(presentable.id) + end + + it "fetches from the cache" do + expect(instance.cache).to receive(:fetch).with("#{presentable.cache_key}:#{user.cache_key}", expires_in: described_class::DEFAULT_EXPIRY).once + + subject + end + + context "when a cache context is supplied" do + before do + kwargs[:cache_context] = -> (todo) { todo.project.cache_key } + end + + it "uses the context to augment the cache key" do + expect(instance.cache).to receive(:fetch).with("#{presentable.cache_key}:#{project.cache_key}", expires_in: described_class::DEFAULT_EXPIRY).once + + subject + end + end + + context "when expires_in is supplied" do + it "sets the expiry when accessing the cache" do + kwargs[:expires_in] = 7.days + + expect(instance.cache).to receive(:fetch).with("#{presentable.cache_key}:#{user.cache_key}", expires_in: 7.days).once + + subject + end + end + end + + context "for a collection of objects" do + let_it_be(:presentable) { Array.new(5).map { create(:todo, project: project) } } + + it { is_expected.to be_an(Gitlab::Json::PrecompiledJson) } + + it "uses the presenter" do + presentable.each do |todo| + expect(presenter).to receive(:represent).with(todo, project: project) + end + + subject + end + + it "is valid JSON" do + parsed = Gitlab::Json.parse(subject.to_s) + + expect(parsed).to be_an(Array) + + presentable.each_with_index do |todo, i| + expect(parsed[i]["id"]).to eq(todo.id) + end + end + + it "fetches from the cache" do + keys = presentable.map { |todo| "#{todo.cache_key}:#{user.cache_key}" } + + expect(instance.cache).to receive(:fetch_multi).with(*keys, expires_in: described_class::DEFAULT_EXPIRY).once.and_call_original + + subject + end + + context "when a cache context is supplied" do + before do + kwargs[:cache_context] = -> (todo) { todo.project.cache_key } + end + + it "uses the context to augment the cache key" do + keys = presentable.map { |todo| "#{todo.cache_key}:#{project.cache_key}" } + + expect(instance.cache).to receive(:fetch_multi).with(*keys, expires_in: described_class::DEFAULT_EXPIRY).once.and_call_original + + subject + end + end + + context "expires_in is supplied" do + it "sets the expiry when accessing the cache" do + keys = presentable.map { |todo| "#{todo.cache_key}:#{user.cache_key}" } + kwargs[:expires_in] = 7.days + + expect(instance.cache).to receive(:fetch_multi).with(*keys, expires_in: 7.days).once.and_call_original + + subject + end + end + end + end +end diff --git a/spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb b/spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb index 6d06fc3618d..99b52236771 100644 --- a/spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb +++ b/spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb @@ -12,6 +12,10 @@ RSpec.describe API::Helpers::Packages::DependencyProxyHelpers do subject { helper.redirect_registry_request(forward_to_registry, package_type, options) { helper.fallback } } + before do + allow(helper).to receive(:options).and_return(for: API::NpmInstancePackages) + end + shared_examples 'executing fallback' do it 'redirects to package registry' do expect(helper).to receive(:registry_url).never @@ -23,13 +27,14 @@ RSpec.describe API::Helpers::Packages::DependencyProxyHelpers do end shared_examples 'executing redirect' do - it 'redirects to package registry' do - expect(helper).to receive(:track_event).with('npm_request_forward').once + it 'redirects to package registry', :snowplow do expect(helper).to receive(:registry_url).once expect(helper).to receive(:redirect).once expect(helper).to receive(:fallback).never subject + + expect_snowplow_event(category: 'API::NpmInstancePackages', action: 'npm_request_forward') end end @@ -64,7 +69,6 @@ RSpec.describe API::Helpers::Packages::DependencyProxyHelpers do let(:package_type) { pkg_type } it 'raises an error' do - allow(helper).to receive(:track_event) expect { subject }.to raise_error(ArgumentError, "Can't build registry_url for package_type #{package_type}") end end diff --git a/spec/lib/api/helpers/packages_manager_clients_helpers_spec.rb b/spec/lib/api/helpers/packages_manager_clients_helpers_spec.rb index 3c40859da21..e4c5002aa68 100644 --- a/spec/lib/api/helpers/packages_manager_clients_helpers_spec.rb +++ b/spec/lib/api/helpers/packages_manager_clients_helpers_spec.rb @@ -8,6 +8,7 @@ RSpec.describe API::Helpers::PackagesManagerClientsHelpers do let_it_be(:personal_access_token) { create(:personal_access_token) } let_it_be(:username) { personal_access_token.user.username } let_it_be(:helper) { Class.new.include(described_class).new } + let(:password) { personal_access_token.token } let(:env) do @@ -50,6 +51,7 @@ RSpec.describe API::Helpers::PackagesManagerClientsHelpers do describe '#find_job_from_http_basic_auth' do let_it_be(:user) { personal_access_token.user } + let(:job) { create(:ci_build, user: user, status: :running) } let(:password) { job.token } @@ -74,6 +76,7 @@ RSpec.describe API::Helpers::PackagesManagerClientsHelpers do describe '#find_deploy_token_from_http_basic_auth' do let_it_be(:deploy_token) { create(:deploy_token) } + let(:token) { deploy_token.token } let(:username) { deploy_token.username } let(:password) { token } diff --git a/spec/lib/api/helpers/variables_helpers_spec.rb b/spec/lib/api/helpers/variables_helpers_spec.rb new file mode 100644 index 00000000000..de6bebaa827 --- /dev/null +++ b/spec/lib/api/helpers/variables_helpers_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe API::Helpers::VariablesHelpers do + let(:helper) { Class.new.include(described_class).new } + + describe '#filter_variable_parameters' do + let(:project) { double } + let(:params) { double } + + subject { helper.filter_variable_parameters(project, params) } + + it 'returns unmodified params (overridden in EE)' do + expect(subject).to eq(params) + end + end + + describe '#find_variable' do + let(:owner) { double } + let(:params) { double } + let(:variables) { [double] } + + subject { helper.find_variable(owner, params) } + + before do + expect(Ci::VariablesFinder).to receive(:new).with(owner, params) + .and_return(double(execute: variables)) + end + + it { is_expected.to eq(variables.first) } + + context 'there are multiple variables with the supplied key' do + let(:variables) { [double, double] } + + it 'raises a conflict!' do + expect(helper).to receive(:conflict!).with(/There are multiple variables with provided parameters/) + + subject + end + end + end +end diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb index bdf04fafaae..15b22fcf25e 100644 --- a/spec/lib/api/helpers_spec.rb +++ b/spec/lib/api/helpers_spec.rb @@ -47,6 +47,58 @@ RSpec.describe API::Helpers do end end + describe '#find_project!' do + let_it_be(:project) { create(:project, :public) } + let_it_be(:user) { create(:user) } + + shared_examples 'private project without access' do + before do + project.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value('private')) + allow(subject).to receive(:authenticate_non_public?).and_return(false) + end + + it 'returns not found' do + expect(subject).to receive(:not_found!) + + subject.find_project!(project.id) + end + end + + context 'when user is authenticated' do + before do + subject.instance_variable_set(:@current_user, user) + subject.instance_variable_set(:@initial_current_user, user) + end + + context 'public project' do + it 'returns requested project' do + expect(subject.find_project!(project.id)).to eq(project) + end + end + + context 'private project' do + it_behaves_like 'private project without access' + end + end + + context 'when user is not authenticated' do + before do + subject.instance_variable_set(:@current_user, nil) + subject.instance_variable_set(:@initial_current_user, nil) + end + + context 'public project' do + it 'returns requested project' do + expect(subject.find_project!(project.id)).to eq(project) + end + end + + context 'private project' do + it_behaves_like 'private project without access' + end + end + end + describe '#find_namespace' do let(:namespace) { create(:namespace) } @@ -175,64 +227,27 @@ RSpec.describe API::Helpers do end end - describe '#track_event' do - it "creates a gitlab tracking event", :snowplow do - subject.track_event('my_event', category: 'foo') - - expect_snowplow_event(category: 'foo', action: 'my_event') - end - - it "logs an exception" do - expect(Gitlab::AppLogger).to receive(:warn).with(/Tracking event failed/) - - subject.track_event('my_event', category: nil) - end - end - describe '#increment_unique_values' do let(:value) { '9f302fea-f828-4ca9-aef4-e10bd723c0b3' } let(:event_name) { 'g_compliance_dashboard' } let(:unknown_event) { 'unknown' } - let(:feature) { "usage_data_#{event_name}" } - - before do - skip_feature_flags_yaml_validation - end - context 'with feature enabled' do - before do - stub_feature_flags(feature => true) - end + it 'tracks redis hll event' do + expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(event_name, values: value) - it 'tracks redis hll event' do - expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(event_name, values: value) - - subject.increment_unique_values(event_name, value) - end - - it 'logs an exception for unknown event' do - expect(Gitlab::AppLogger).to receive(:warn).with("Redis tracking event failed for event: #{unknown_event}, message: Unknown event #{unknown_event}") - - subject.increment_unique_values(unknown_event, value) - end + subject.increment_unique_values(event_name, value) + end - it 'does not track event for nil values' do - expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event) + it 'logs an exception for unknown event' do + expect(Gitlab::AppLogger).to receive(:warn).with("Redis tracking event failed for event: #{unknown_event}, message: Unknown event #{unknown_event}") - subject.increment_unique_values(unknown_event, nil) - end + subject.increment_unique_values(unknown_event, value) end - context 'with feature disabled' do - before do - stub_feature_flags(feature => false) - end - - it 'does not track event' do - expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event) + it 'does not track event for nil values' do + expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event) - subject.increment_unique_values(event_name, value) - end + subject.increment_unique_values(unknown_event, nil) end end |