summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-01-24 18:09:00 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-01-24 18:09:00 +0000
commit411cc77938f99b495e0fe802705d275a28e939ef (patch)
tree97770ec9904daeaaa1f7546b191d23b0a642da47 /spec
parent3e36f70be4bd74a412b2ea1286090b54803a8c20 (diff)
downloadgitlab-ce-411cc77938f99b495e0fe802705d275a28e939ef.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/concerns/lfs_request_spec.rb2
-rw-r--r--spec/controllers/projects/git_http_controller_spec.rb107
-rw-r--r--spec/controllers/repositories/git_http_controller_spec.rb146
-rw-r--r--spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb3
-rw-r--r--spec/lib/gitaly/server_spec.rb47
-rw-r--r--spec/lib/gitlab/gitaly_client_spec.rb59
-rw-r--r--spec/lib/gitlab/import_export/import_failure_service_spec.rb23
-rw-r--r--spec/lib/gitlab/import_export/project_tree_restorer_spec.rb52
-rw-r--r--spec/lib/gitlab/sidekiq_config/worker_spec.rb45
-rw-r--r--spec/lib/gitlab/sidekiq_config_spec.rb60
-rw-r--r--spec/models/ci/build_spec.rb2
-rw-r--r--spec/requests/api/broadcast_messages_spec.rb30
-rw-r--r--spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb4
-rw-r--r--spec/requests/api/internal/base_spec.rb6
-rw-r--r--spec/requests/git_http_spec.rb16
-rw-r--r--spec/support/shared_examples/lib/gitlab/import_export/import_failure_service_shared_examples.rb9
16 files changed, 445 insertions, 166 deletions
diff --git a/spec/controllers/concerns/lfs_request_spec.rb b/spec/controllers/concerns/lfs_request_spec.rb
index 584448e68f9..79257e9a7f6 100644
--- a/spec/controllers/concerns/lfs_request_spec.rb
+++ b/spec/controllers/concerns/lfs_request_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
describe LfsRequest do
include ProjectForksHelper
- controller(Projects::GitHttpClientController) do
+ controller(Repositories::GitHttpClientController) do
# `described_class` is not available in this context
include LfsRequest
diff --git a/spec/controllers/projects/git_http_controller_spec.rb b/spec/controllers/projects/git_http_controller_spec.rb
deleted file mode 100644
index 4df53121aaa..00000000000
--- a/spec/controllers/projects/git_http_controller_spec.rb
+++ /dev/null
@@ -1,107 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-describe Projects::GitHttpController do
- include GitHttpHelpers
-
- let_it_be(:project) { create(:project, :public, :repository) }
- let(:project_params) do
- {
- namespace_id: project.namespace.to_param,
- project_id: project.path + '.git'
- }
- end
- let(:params) { project_params }
-
- describe 'HEAD #info_refs' do
- it 'returns 403' do
- head :info_refs, params: { namespace_id: project.namespace.to_param, project_id: project.path + '.git' }
-
- expect(response.status).to eq(403)
- end
- end
-
- describe 'GET #info_refs' do
- let(:params) { project_params.merge(service: 'git-upload-pack') }
-
- it 'returns 401 for unauthenticated requests to public repositories when http protocol is disabled' do
- stub_application_setting(enabled_git_access_protocol: 'ssh')
-
- get :info_refs, params: params
-
- expect(response.status).to eq(401)
- end
-
- context 'with authorized user' do
- let(:user) { project.owner }
-
- before do
- request.headers.merge! auth_env(user.username, user.password, nil)
- end
-
- it 'returns 200' do
- get :info_refs, params: params
-
- expect(response.status).to eq(200)
- end
-
- it 'updates the user activity' do
- expect_next_instance_of(Users::ActivityService) do |activity_service|
- expect(activity_service).to receive(:execute)
- end
-
- get :info_refs, params: params
- end
- end
-
- context 'with exceptions' do
- before do
- allow(controller).to receive(:verify_workhorse_api!).and_return(true)
- end
-
- it 'returns 503 with GRPC Unavailable' do
- allow(controller).to receive(:access_check).and_raise(GRPC::Unavailable)
-
- get :info_refs, params: params
-
- expect(response.status).to eq(503)
- end
-
- it 'returns 503 with timeout error' do
- allow(controller).to receive(:access_check).and_raise(Gitlab::GitAccess::TimeoutError)
-
- get :info_refs, params: params
-
- expect(response.status).to eq(503)
- expect(response.body).to eq 'Gitlab::GitAccess::TimeoutError'
- end
- end
- end
-
- describe 'POST #git_upload_pack' do
- before do
- allow(controller).to receive(:authenticate_user).and_return(true)
- allow(controller).to receive(:verify_workhorse_api!).and_return(true)
- allow(controller).to receive(:access_check).and_return(nil)
- end
-
- after do
- post :git_upload_pack, params: params
- end
-
- context 'on a read-only instance' do
- before do
- allow(Gitlab::Database).to receive(:read_only?).and_return(true)
- end
-
- it 'does not update project statistics' do
- expect(ProjectDailyStatisticsWorker).not_to receive(:perform_async)
- end
- end
-
- it 'updates project statistics' do
- expect(ProjectDailyStatisticsWorker).to receive(:perform_async)
- end
- end
-end
diff --git a/spec/controllers/repositories/git_http_controller_spec.rb b/spec/controllers/repositories/git_http_controller_spec.rb
new file mode 100644
index 00000000000..10a7b72ca89
--- /dev/null
+++ b/spec/controllers/repositories/git_http_controller_spec.rb
@@ -0,0 +1,146 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Repositories::GitHttpController do
+ include GitHttpHelpers
+
+ let_it_be(:project) { create(:project, :public, :repository) }
+
+ let(:namespace_id) { project.namespace.to_param }
+ let(:repository_id) { project.path + '.git' }
+ let(:project_params) do
+ {
+ namespace_id: namespace_id,
+ repository_id: repository_id
+ }
+ end
+ let(:params) { project_params }
+
+ describe 'HEAD #info_refs' do
+ it 'returns 403' do
+ head :info_refs, params: params
+
+ expect(response.status).to eq(403)
+ end
+ end
+
+ shared_examples 'info_refs behavior' do
+ describe 'GET #info_refs' do
+ let(:params) { project_params.merge(service: 'git-upload-pack') }
+
+ it 'returns 401 for unauthenticated requests to public repositories when http protocol is disabled' do
+ stub_application_setting(enabled_git_access_protocol: 'ssh')
+ allow(controller).to receive(:basic_auth_provided?).and_call_original
+
+ expect(controller).to receive(:http_download_allowed?).and_call_original
+
+ get :info_refs, params: params
+
+ expect(response.status).to eq(401)
+ end
+
+ context 'with authorized user' do
+ let(:user) { project.owner }
+
+ before do
+ request.headers.merge! auth_env(user.username, user.password, nil)
+ end
+
+ it 'returns 200' do
+ get :info_refs, params: params
+
+ expect(response.status).to eq(200)
+ end
+
+ it 'updates the user activity' do
+ expect_next_instance_of(Users::ActivityService) do |activity_service|
+ expect(activity_service).to receive(:execute)
+ end
+
+ get :info_refs, params: params
+ end
+ end
+
+ context 'with exceptions' do
+ before do
+ allow(controller).to receive(:verify_workhorse_api!).and_return(true)
+ end
+
+ it 'returns 503 with GRPC Unavailable' do
+ allow(controller).to receive(:access_check).and_raise(GRPC::Unavailable)
+
+ get :info_refs, params: params
+
+ expect(response.status).to eq(503)
+ end
+
+ it 'returns 503 with timeout error' do
+ allow(controller).to receive(:access_check).and_raise(Gitlab::GitAccess::TimeoutError)
+
+ get :info_refs, params: params
+
+ expect(response.status).to eq(503)
+ expect(response.body).to eq 'Gitlab::GitAccess::TimeoutError'
+ end
+ end
+ end
+ end
+
+ shared_examples 'git_upload_pack behavior' do |expected|
+ describe 'POST #git_upload_pack' do
+ before do
+ allow(controller).to receive(:authenticate_user).and_return(true)
+ allow(controller).to receive(:verify_workhorse_api!).and_return(true)
+ allow(controller).to receive(:access_check).and_return(nil)
+ end
+
+ after do
+ post :git_upload_pack, params: params
+ end
+
+ context 'on a read-only instance' do
+ before do
+ allow(Gitlab::Database).to receive(:read_only?).and_return(true)
+ end
+
+ it 'does not update project statistics' do
+ expect(ProjectDailyStatisticsWorker).not_to receive(:perform_async)
+ end
+ end
+
+ if expected
+ it 'updates project statistics' do
+ expect(ProjectDailyStatisticsWorker).to receive(:perform_async)
+ end
+ else
+ it 'does not update project statistics' do
+ expect(ProjectDailyStatisticsWorker).not_to receive(:perform_async)
+ end
+ end
+ end
+ end
+
+ shared_examples 'access checker class' do
+ let(:params) { project_params.merge(service: 'git-upload-pack') }
+
+ it 'calls the right access class checker with the right object' do
+ allow(controller).to receive(:verify_workhorse_api!).and_return(true)
+
+ access_double = double
+ expect(expected_class).to receive(:new).with(anything, expected_object, 'http', anything).and_return(access_double)
+ allow(access_double).to receive(:check).and_return(false)
+
+ get :info_refs, params: params
+ end
+ end
+
+ context 'when repository container is a project' do
+ it_behaves_like 'info_refs behavior'
+ it_behaves_like 'git_upload_pack behavior', true
+ it_behaves_like 'access checker class' do
+ let(:expected_class) { Gitlab::GitAccess }
+ let(:expected_object) { project }
+ end
+ end
+end
diff --git a/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb b/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb
index 30cede6f4cf..3a512fee3b3 100644
--- a/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb
+++ b/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb
@@ -20,6 +20,7 @@ describe GitlabSchema.types['SentryDetailedError'] do
message
culprit
externalUrl
+ externalBaseUrl
sentryProjectId
sentryProjectName
sentryProjectSlug
@@ -30,8 +31,10 @@ describe GitlabSchema.types['SentryDetailedError'] do
lastReleaseLastCommit
firstReleaseShortVersion
lastReleaseShortVersion
+ gitlabIssuePath
gitlabCommit
gitlabCommitPath
+ tags
]
is_expected.to have_graphql_fields(*expected_fields)
diff --git a/spec/lib/gitaly/server_spec.rb b/spec/lib/gitaly/server_spec.rb
index 184d049d1fb..5142f705251 100644
--- a/spec/lib/gitaly/server_spec.rb
+++ b/spec/lib/gitaly/server_spec.rb
@@ -66,6 +66,53 @@ describe Gitaly::Server do
end
end
+ context "when examining disk statistics for a given server" do
+ let(:disk_available) { 42 }
+ let(:disk_used) { 42 }
+ let(:storage_status) { double('storage_status') }
+
+ before do
+ allow(storage_status).to receive(:storage_name).and_return('default')
+ allow(storage_status).to receive(:available).and_return(disk_available)
+ allow(storage_status).to receive(:used).and_return(disk_used)
+ response = double("response")
+ allow(response).to receive(:storage_statuses).and_return([storage_status])
+ allow_next_instance_of(Gitlab::GitalyClient::ServerService) do |instance|
+ allow(instance).to receive(:disk_statistics).and_return(response)
+ end
+ end
+
+ describe '#disk_available' do
+ subject { server.disk_available }
+
+ it { is_expected.to be_present }
+
+ it "returns disk available for the storage of the instantiated server" do
+ is_expected.to eq(disk_available)
+ end
+ end
+
+ describe '#disk_used' do
+ subject { server.disk_used }
+
+ it { is_expected.to be_present }
+
+ it "returns disk used for the storage of the instantiated server" do
+ is_expected.to eq(disk_used)
+ end
+ end
+
+ describe '#disk_stats' do
+ subject { server.disk_stats }
+
+ it { is_expected.to be_present }
+
+ it "returns the storage of the instantiated server" do
+ is_expected.to eq(storage_status)
+ end
+ end
+ end
+
describe '#expected_version?' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/lib/gitlab/gitaly_client_spec.rb b/spec/lib/gitlab/gitaly_client_spec.rb
index ebf56c0ae66..b03c1feb429 100644
--- a/spec/lib/gitlab/gitaly_client_spec.rb
+++ b/spec/lib/gitlab/gitaly_client_spec.rb
@@ -52,7 +52,7 @@ describe Gitlab::GitalyClient do
end
describe '.filesystem_id' do
- it 'returns an empty string when the storage is not found in the response' do
+ it 'returns an empty string when the relevant storage status is not found in the response' do
response = double("response")
allow(response).to receive(:storage_statuses).and_return([])
allow_next_instance_of(Gitlab::GitalyClient::ServerService) do |instance|
@@ -63,6 +63,63 @@ describe Gitlab::GitalyClient do
end
end
+ context 'when the relevant storage status is not found' do
+ before do
+ response = double('response')
+ allow(response).to receive(:storage_statuses).and_return([])
+ allow_next_instance_of(Gitlab::GitalyClient::ServerService) do |instance|
+ allow(instance).to receive(:disk_statistics).and_return(response)
+ expect(instance).to receive(:storage_disk_statistics)
+ end
+ end
+
+ describe '.filesystem_disk_available' do
+ it 'returns nil when the relevant storage status is not found in the response' do
+ expect(described_class.filesystem_disk_available('default')).to eq(nil)
+ end
+ end
+
+ describe '.filesystem_disk_used' do
+ it 'returns nil when the relevant storage status is not found in the response' do
+ expect(described_class.filesystem_disk_used('default')).to eq(nil)
+ end
+ end
+ end
+
+ context 'when the relevant storage status is found' do
+ let(:disk_available) { 42 }
+ let(:disk_used) { 42 }
+ let(:storage_status) { double('storage_status') }
+
+ before do
+ allow(storage_status).to receive(:storage_name).and_return('default')
+ allow(storage_status).to receive(:used).and_return(disk_used)
+ allow(storage_status).to receive(:available).and_return(disk_available)
+ response = double('response')
+ allow(response).to receive(:storage_statuses).and_return([storage_status])
+ allow_next_instance_of(Gitlab::GitalyClient::ServerService) do |instance|
+ allow(instance).to receive(:disk_statistics).and_return(response)
+ end
+ expect_next_instance_of(Gitlab::GitalyClient::ServerService) do |instance|
+ expect(instance).to receive(:storage_disk_statistics).and_return(storage_status)
+ end
+ end
+
+ describe '.filesystem_disk_available' do
+ it 'returns disk available when the relevant storage status is found in the response' do
+ expect(storage_status).to receive(:available)
+ expect(described_class.filesystem_disk_available('default')).to eq(disk_available)
+ end
+ end
+
+ describe '.filesystem_disk_used' do
+ it 'returns disk used when the relevant storage status is found in the response' do
+ expect(storage_status).to receive(:used)
+ expect(described_class.filesystem_disk_used('default')).to eq(disk_used)
+ end
+ end
+ end
+
describe '.stub_class' do
it 'returns the gRPC health check stub' do
expect(described_class.stub_class(:health_check)).to eq(::Grpc::Health::V1::Health::Stub)
diff --git a/spec/lib/gitlab/import_export/import_failure_service_spec.rb b/spec/lib/gitlab/import_export/import_failure_service_spec.rb
index 0351f88afdb..324328181e4 100644
--- a/spec/lib/gitlab/import_export/import_failure_service_spec.rb
+++ b/spec/lib/gitlab/import_export/import_failure_service_spec.rb
@@ -6,6 +6,7 @@ describe Gitlab::ImportExport::ImportFailureService do
let(:importable) { create(:project, :builds_enabled, :issues_disabled, name: 'project', path: 'project') }
let(:label) { create(:label) }
let(:subject) { described_class.new(importable) }
+ let(:action) { "save_relation" }
let(:relation_key) { "labels" }
let(:relation_index) { 0 }
@@ -15,7 +16,12 @@ describe Gitlab::ImportExport::ImportFailureService do
let(:correlation_id) { 'my-correlation-id' }
let(:retry_count) { 2 }
let(:log_import_failure) do
- subject.log_import_failure(relation_key, relation_index, exception, retry_count)
+ subject.log_import_failure(
+ source: action,
+ relation_key: relation_key,
+ relation_index: relation_index,
+ exception: exception,
+ retry_count: retry_count)
end
before do
@@ -44,7 +50,7 @@ describe Gitlab::ImportExport::ImportFailureService do
describe '#with_retry' do
let(:perform_retry) do
- subject.with_retry(relation_key, relation_index) do
+ subject.with_retry(action: action, relation_key: relation_key, relation_index: relation_index) do
label.save!
end
end
@@ -60,7 +66,12 @@ describe Gitlab::ImportExport::ImportFailureService do
end
it 'retries and logs import failure once with correct params' do
- expect(subject).to receive(:log_import_failure).with(relation_key, relation_index, instance_of(exception), 1).once
+ expect(subject).to receive(:log_import_failure).with(
+ source: action,
+ relation_key: relation_key,
+ relation_index: relation_index,
+ exception: instance_of(exception),
+ retry_count: 1).once
perform_retry
end
@@ -85,7 +96,11 @@ describe Gitlab::ImportExport::ImportFailureService do
maximum_retry_count.times do |index|
retry_count = index + 1
- expect(subject).to receive(:log_import_failure).with(relation_key, relation_index, instance_of(exception), retry_count)
+ expect(subject).to receive(:log_import_failure).with(
+ source: action, relation_key: relation_key,
+ relation_index: relation_index,
+ exception: instance_of(exception),
+ retry_count: retry_count)
end
expect { perform_retry }.to raise_exception(exception)
diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
index ac9a63e8414..25f70420cda 100644
--- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
@@ -498,6 +498,58 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
end
end
+ context 'when post import action throw non-retriable exception' do
+ let(:exception) { StandardError.new('post_import_error') }
+
+ before do
+ setup_import_export_config('light')
+ expect(project)
+ .to receive(:merge_requests)
+ .and_raise(exception)
+ end
+
+ it 'report post import error' do
+ expect(restored_project_json).to eq(false)
+ expect(shared.errors).to include('post_import_error')
+ end
+ end
+
+ context 'when post import action throw retriable exception one time' do
+ let(:exception) { GRPC::DeadlineExceeded.new }
+
+ before do
+ setup_import_export_config('light')
+ expect(project)
+ .to receive(:merge_requests)
+ .and_raise(exception)
+ expect(project)
+ .to receive(:merge_requests)
+ .and_call_original
+ expect(restored_project_json).to eq(true)
+ end
+
+ it_behaves_like 'restores project successfully',
+ issues: 1,
+ labels: 2,
+ label_with_priorities: 'A project label',
+ milestones: 1,
+ first_issue_labels: 1,
+ services: 1,
+ import_failures: 1
+
+ it 'records the failures in the database' do
+ import_failure = ImportFailure.last
+
+ expect(import_failure.project_id).to eq(project.id)
+ expect(import_failure.relation_key).to be_nil
+ expect(import_failure.relation_index).to be_nil
+ expect(import_failure.exception_class).to eq('GRPC::DeadlineExceeded')
+ expect(import_failure.exception_message).to be_present
+ expect(import_failure.correlation_id_value).not_to be_empty
+ expect(import_failure.created_at).to be_present
+ end
+ end
+
context 'when the project has overridden params in import data' do
before do
setup_import_export_config('light')
diff --git a/spec/lib/gitlab/sidekiq_config/worker_spec.rb b/spec/lib/gitlab/sidekiq_config/worker_spec.rb
index f2fe51abd5e..ba6760f38b5 100644
--- a/spec/lib/gitlab/sidekiq_config/worker_spec.rb
+++ b/spec/lib/gitlab/sidekiq_config/worker_spec.rb
@@ -3,8 +3,11 @@
require 'fast_spec_helper'
describe Gitlab::SidekiqConfig::Worker do
- def worker_with_queue(queue)
- described_class.new(double(queue: queue), ee: false)
+ def create_worker(queue:, weight: 0)
+ namespace = queue.include?(':') && queue.split(':').first
+ inner_worker = double(queue: queue, queue_namespace: namespace, get_weight: weight)
+
+ described_class.new(inner_worker, ee: false)
end
describe '#ee?' do
@@ -34,9 +37,9 @@ describe Gitlab::SidekiqConfig::Worker do
describe 'delegations' do
[
- :feature_category_not_owned?, :get_feature_category,
+ :feature_category_not_owned?, :get_feature_category, :get_weight,
:get_worker_resource_boundary, :latency_sensitive_worker?, :queue,
- :worker_has_external_dependencies?
+ :queue_namespace, :worker_has_external_dependencies?
].each do |meth|
it "delegates #{meth} to the worker class" do
worker = double
@@ -50,8 +53,8 @@ describe Gitlab::SidekiqConfig::Worker do
describe 'sorting' do
it 'sorts queues with a namespace before those without a namespace' do
- namespaced_worker = worker_with_queue('namespace:queue')
- plain_worker = worker_with_queue('a_queue')
+ namespaced_worker = create_worker(queue: 'namespace:queue')
+ plain_worker = create_worker(queue: 'a_queue')
expect([plain_worker, namespaced_worker].sort)
.to eq([namespaced_worker, plain_worker])
@@ -59,12 +62,12 @@ describe Gitlab::SidekiqConfig::Worker do
it 'sorts alphabetically by queue' do
workers = [
- worker_with_queue('namespace:a'),
- worker_with_queue('namespace:b'),
- worker_with_queue('other_namespace:a'),
- worker_with_queue('other_namespace:b'),
- worker_with_queue('a'),
- worker_with_queue('b')
+ create_worker(queue: 'namespace:a'),
+ create_worker(queue: 'namespace:b'),
+ create_worker(queue: 'other_namespace:a'),
+ create_worker(queue: 'other_namespace:b'),
+ create_worker(queue: 'a'),
+ create_worker(queue: 'b')
]
expect(workers.shuffle.sort).to eq(workers)
@@ -73,12 +76,26 @@ describe Gitlab::SidekiqConfig::Worker do
describe 'YAML encoding' do
it 'encodes the worker in YAML as a string of the queue' do
- worker_a = worker_with_queue('a')
- worker_b = worker_with_queue('b')
+ worker_a = create_worker(queue: 'a')
+ worker_b = create_worker(queue: 'b')
expect(YAML.dump(worker_a)).to eq(YAML.dump('a'))
expect(YAML.dump([worker_a, worker_b]))
.to eq(YAML.dump(%w[a b]))
end
end
+
+ describe '#namespace_and_weight' do
+ it 'returns a namespace, weight pair for the worker' do
+ expect(create_worker(queue: 'namespace:a', weight: 2).namespace_and_weight)
+ .to eq(['namespace', 2])
+ end
+ end
+
+ describe '#queue_and_weight' do
+ it 'returns a queue, weight pair for the worker' do
+ expect(create_worker(queue: 'namespace:a', weight: 2).queue_and_weight)
+ .to eq(['namespace:a', 2])
+ end
+ end
end
diff --git a/spec/lib/gitlab/sidekiq_config_spec.rb b/spec/lib/gitlab/sidekiq_config_spec.rb
index 39bb149cf73..20690a35dc8 100644
--- a/spec/lib/gitlab/sidekiq_config_spec.rb
+++ b/spec/lib/gitlab/sidekiq_config_spec.rb
@@ -80,4 +80,64 @@ describe Gitlab::SidekiqConfig do
expect(described_class.all_queues_yml_outdated?).to be(false)
end
end
+
+ describe '.queues_for_sidekiq_queues_yml' do
+ before do
+ workers = [
+ Namespaces::RootStatisticsWorker,
+ Namespaces::ScheduleAggregationWorker,
+ MergeWorker,
+ ProcessCommitWorker
+ ].map { |worker| described_class::Worker.new(worker, ee: false) }
+
+ allow(described_class).to receive(:workers).and_return(workers)
+ end
+
+ it 'returns queues and weights, aggregating namespaces with the same weight' do
+ expected_queues = [
+ ['merge', 5],
+ ['process_commit', 3],
+ ['update_namespace_statistics', 1]
+ ]
+
+ expect(described_class.queues_for_sidekiq_queues_yml).to eq(expected_queues)
+ end
+ end
+
+ describe '.sidekiq_queues_yml_outdated?' do
+ before do
+ workers = [
+ Namespaces::RootStatisticsWorker,
+ Namespaces::ScheduleAggregationWorker,
+ MergeWorker,
+ ProcessCommitWorker
+ ].map { |worker| described_class::Worker.new(worker, ee: false) }
+
+ allow(described_class).to receive(:workers).and_return(workers)
+ end
+
+ let(:expected_queues) do
+ [
+ ['merge', 5],
+ ['process_commit', 3],
+ ['update_namespace_statistics', 1]
+ ]
+ end
+
+ it 'returns true if the YAML file does not match the application code' do
+ allow(File).to receive(:read)
+ .with(described_class::SIDEKIQ_QUEUES_PATH)
+ .and_return(YAML.dump(queues: expected_queues.reverse))
+
+ expect(described_class.sidekiq_queues_yml_outdated?).to be(true)
+ end
+
+ it 'returns false if the YAML file matches the application code' do
+ allow(File).to receive(:read)
+ .with(described_class::SIDEKIQ_QUEUES_PATH)
+ .and_return(YAML.dump(queues: expected_queues))
+
+ expect(described_class.sidekiq_queues_yml_outdated?).to be(false)
+ end
+ end
end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 38e15fc4582..4f729f2546c 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -2391,6 +2391,8 @@ describe Ci::Build do
{ key: 'GITLAB_CI', value: 'true', public: true, masked: false },
{ key: 'CI_SERVER_URL', value: Gitlab.config.gitlab.url, public: true, masked: false },
{ key: 'CI_SERVER_HOST', value: Gitlab.config.gitlab.host, public: true, masked: false },
+ { key: 'CI_SERVER_PORT', value: Gitlab.config.gitlab.port.to_s, public: true, masked: false },
+ { key: 'CI_SERVER_PROTOCOL', value: Gitlab.config.gitlab.protocol, public: true, masked: false },
{ key: 'CI_SERVER_NAME', value: 'GitLab', public: true, masked: false },
{ key: 'CI_SERVER_VERSION', value: Gitlab::VERSION, public: true, masked: false },
{ key: 'CI_SERVER_VERSION_MAJOR', value: Gitlab.version_info.major.to_s, public: true, masked: false },
diff --git a/spec/requests/api/broadcast_messages_spec.rb b/spec/requests/api/broadcast_messages_spec.rb
index 9dc639a25a2..a502d597da1 100644
--- a/spec/requests/api/broadcast_messages_spec.rb
+++ b/spec/requests/api/broadcast_messages_spec.rb
@@ -8,22 +8,10 @@ describe API::BroadcastMessages do
set(:message) { create(:broadcast_message) }
describe 'GET /broadcast_messages' do
- it 'returns a 401 for anonymous users' do
- get api('/broadcast_messages')
-
- expect(response).to have_gitlab_http_status(401)
- end
-
- it 'returns a 403 for users' do
- get api('/broadcast_messages', user)
-
- expect(response).to have_gitlab_http_status(403)
- end
-
- it 'returns an Array of BroadcastMessages for admins' do
+ it 'returns an Array of BroadcastMessages' do
create(:broadcast_message)
- get api('/broadcast_messages', admin)
+ get api('/broadcast_messages')
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
@@ -34,21 +22,9 @@ describe API::BroadcastMessages do
end
describe 'GET /broadcast_messages/:id' do
- it 'returns a 401 for anonymous users' do
+ it 'returns the specified message' do
get api("/broadcast_messages/#{message.id}")
- expect(response).to have_gitlab_http_status(401)
- end
-
- it 'returns a 403 for users' do
- get api("/broadcast_messages/#{message.id}", user)
-
- expect(response).to have_gitlab_http_status(403)
- end
-
- it 'returns the specified message for admins' do
- get api("/broadcast_messages/#{message.id}", admin)
-
expect(response).to have_gitlab_http_status(200)
expect(json_response['id']).to eq message.id
expect(json_response.keys)
diff --git a/spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb b/spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb
index 664206dec29..a1f9fa1f10c 100644
--- a/spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb
+++ b/spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb
@@ -57,6 +57,10 @@ describe 'getting a detailed sentry error' do
expect(error_data['firstSeen']).to eql sentry_detailed_error.first_seen
expect(error_data['lastSeen']).to eql sentry_detailed_error.last_seen
expect(error_data['gitlabCommit']).to be nil
+ expect(error_data['externalBaseUrl']).to eq sentry_detailed_error.external_base_url
+ expect(error_data['gitlabIssuePath']).to eq sentry_detailed_error.gitlab_issue
+ expect(error_data['tags']['logger']).to eq sentry_detailed_error.tags[:logger]
+ expect(error_data['tags']['level']).to eq sentry_detailed_error.tags[:level]
end
it 'is expected to return the frequency correctly' do
diff --git a/spec/requests/api/internal/base_spec.rb b/spec/requests/api/internal/base_spec.rb
index 50754773fad..6f784830f9d 100644
--- a/spec/requests/api/internal/base_spec.rb
+++ b/spec/requests/api/internal/base_spec.rb
@@ -326,7 +326,7 @@ describe API::Internal::Base do
expect(json_response["gitaly"]["repository"]["relative_path"]).to eq(project.repository.gitaly_repository.relative_path)
expect(json_response["gitaly"]["address"]).to eq(Gitlab::GitalyClient.address(project.repository_storage))
expect(json_response["gitaly"]["token"]).to eq(Gitlab::GitalyClient.token(project.repository_storage))
- expect(json_response["gitaly"]["features"]).to eq('gitaly-feature-inforef-uploadpack-cache' => 'true', 'gitaly-feature-get-tag-messages-go' => 'true', 'gitaly-feature-filter-shas-with-signatures-go' => 'true', 'gitaly-feature-cache-invalidator' => 'true', 'gitaly-feature-commit-without-batch-check' => 'true')
+ expect(json_response["gitaly"]["features"]).to eq('gitaly-feature-inforef-uploadpack-cache' => 'true', 'gitaly-feature-filter-shas-with-signatures-go' => 'true', 'gitaly-feature-cache-invalidator' => 'true', 'gitaly-feature-commit-without-batch-check' => 'true')
expect(user.reload.last_activity_on).to eql(Date.today)
end
end
@@ -346,7 +346,7 @@ describe API::Internal::Base do
expect(json_response["gitaly"]["repository"]["relative_path"]).to eq(project.repository.gitaly_repository.relative_path)
expect(json_response["gitaly"]["address"]).to eq(Gitlab::GitalyClient.address(project.repository_storage))
expect(json_response["gitaly"]["token"]).to eq(Gitlab::GitalyClient.token(project.repository_storage))
- expect(json_response["gitaly"]["features"]).to eq('gitaly-feature-inforef-uploadpack-cache' => 'true', 'gitaly-feature-get-tag-messages-go' => 'true', 'gitaly-feature-filter-shas-with-signatures-go' => 'true', 'gitaly-feature-cache-invalidator' => 'true', 'gitaly-feature-commit-without-batch-check' => 'true')
+ expect(json_response["gitaly"]["features"]).to eq('gitaly-feature-inforef-uploadpack-cache' => 'true', 'gitaly-feature-filter-shas-with-signatures-go' => 'true', 'gitaly-feature-cache-invalidator' => 'true', 'gitaly-feature-commit-without-batch-check' => 'true')
expect(user.reload.last_activity_on).to be_nil
end
end
@@ -594,7 +594,7 @@ describe API::Internal::Base do
expect(json_response["gitaly"]["repository"]["relative_path"]).to eq(project.repository.gitaly_repository.relative_path)
expect(json_response["gitaly"]["address"]).to eq(Gitlab::GitalyClient.address(project.repository_storage))
expect(json_response["gitaly"]["token"]).to eq(Gitlab::GitalyClient.token(project.repository_storage))
- expect(json_response["gitaly"]["features"]).to eq('gitaly-feature-inforef-uploadpack-cache' => 'true', 'gitaly-feature-get-tag-messages-go' => 'true', 'gitaly-feature-filter-shas-with-signatures-go' => 'true', 'gitaly-feature-cache-invalidator' => 'true', 'gitaly-feature-commit-without-batch-check' => 'true')
+ expect(json_response["gitaly"]["features"]).to eq('gitaly-feature-inforef-uploadpack-cache' => 'true', 'gitaly-feature-filter-shas-with-signatures-go' => 'true', 'gitaly-feature-cache-invalidator' => 'true', 'gitaly-feature-commit-without-batch-check' => 'true')
end
end
diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb
index 42b4bd71b88..c3a5c0b0caa 100644
--- a/spec/requests/git_http_spec.rb
+++ b/spec/requests/git_http_spec.rb
@@ -108,7 +108,7 @@ describe 'Git HTTP requests' do
shared_examples_for 'project path without .git suffix' do
context "GET info/refs" do
- let(:path) { "/#{project_path}/info/refs" }
+ let(:path) { "/#{repository_path}/info/refs" }
context "when no params are added" do
before do
@@ -116,7 +116,7 @@ describe 'Git HTTP requests' do
end
it "redirects to the .git suffix version" do
- expect(response).to redirect_to("/#{project_path}.git/info/refs")
+ expect(response).to redirect_to("/#{repository_path}.git/info/refs")
end
end
@@ -128,7 +128,7 @@ describe 'Git HTTP requests' do
end
it "redirects to the .git suffix version" do
- expect(response).to redirect_to("/#{project_path}.git/info/refs?service=#{params[:service]}")
+ expect(response).to redirect_to("/#{repository_path}.git/info/refs?service=#{params[:service]}")
end
end
@@ -140,7 +140,7 @@ describe 'Git HTTP requests' do
end
it "redirects to the .git suffix version" do
- expect(response).to redirect_to("/#{project_path}.git/info/refs?service=#{params[:service]}")
+ expect(response).to redirect_to("/#{repository_path}.git/info/refs?service=#{params[:service]}")
end
end
@@ -159,13 +159,13 @@ describe 'Git HTTP requests' do
context "POST git-upload-pack" do
it "fails to find a route" do
- expect { clone_post(project_path) }.to raise_error(ActionController::RoutingError)
+ expect { clone_post(repository_path) }.to raise_error(ActionController::RoutingError)
end
end
context "POST git-receive-pack" do
it "fails to find a route" do
- expect { push_post(project_path) }.to raise_error(ActionController::RoutingError)
+ expect { push_post(repository_path) }.to raise_error(ActionController::RoutingError)
end
end
end
@@ -211,7 +211,7 @@ describe 'Git HTTP requests' do
end
it_behaves_like 'project path without .git suffix' do
- let(:project_path) { "#{user.namespace.path}/project.git-project" }
+ let(:repository_path) { "#{user.namespace.path}/project.git-project" }
end
end
end
@@ -820,7 +820,7 @@ describe 'Git HTTP requests' do
end
it_behaves_like 'project path without .git suffix' do
- let(:project_path) { create(:project, :repository, :public, path: 'project.git-project').full_path }
+ let(:repository_path) { create(:project, :repository, :public, path: 'project.git-project').full_path }
end
context "retrieving an info/refs file" do
diff --git a/spec/support/shared_examples/lib/gitlab/import_export/import_failure_service_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/import_export/import_failure_service_shared_examples.rb
index 55bd2401db1..801be5ae946 100644
--- a/spec/support/shared_examples/lib/gitlab/import_export/import_failure_service_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/import_export/import_failure_service_shared_examples.rb
@@ -3,6 +3,7 @@
RSpec.shared_examples 'log import failure' do |importable_column|
it 'tracks error' do
extra = {
+ source: action,
relation_key: relation_key,
relation_index: relation_index,
retry_count: retry_count
@@ -11,7 +12,12 @@ RSpec.shared_examples 'log import failure' do |importable_column|
expect(Gitlab::ErrorTracking).to receive(:track_exception).with(exception, extra)
- subject.log_import_failure(relation_key, relation_index, exception, retry_count)
+ subject.log_import_failure(
+ source: action,
+ relation_key: relation_key,
+ relation_index: relation_index,
+ exception: exception,
+ retry_count: retry_count)
end
it 'saves data to ImportFailure' do
@@ -21,6 +27,7 @@ RSpec.shared_examples 'log import failure' do |importable_column|
aggregate_failures do
expect(import_failure[importable_column]).to eq(importable.id)
+ expect(import_failure.source).to eq(action)
expect(import_failure.relation_key).to eq(relation_key)
expect(import_failure.relation_index).to eq(relation_index)
expect(import_failure.exception_class).to eq('StandardError')