Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-03-17 15:09:52 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-03-17 15:09:52 +0300
commit8ae26d705abe341b03bc15d4373d6cd0c77c0baf (patch)
tree655ee03a968e340c975b8ab7d77cfd5ceaf3c969 /spec
parentfc1df8c8307fc5022f9e8aae04164c089d8fdf2e (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/features/projects/navbar_spec.rb19
-rw-r--r--spec/lib/gitlab/checks/project_created_spec.rb29
-rw-r--r--spec/lib/gitlab/checks/project_moved_spec.rb103
-rw-r--r--spec/lib/gitlab/repo_path_spec.rb39
-rw-r--r--spec/models/snippet_spec.rb16
-rw-r--r--spec/services/post_receive_service_spec.rb4
-rw-r--r--spec/support/shared_examples/workers/idempotency_shared_examples.rb2
-rw-r--r--spec/workers/concerns/application_worker_spec.rb41
-rw-r--r--spec/workers/expire_job_cache_worker_spec.rb4
9 files changed, 198 insertions, 59 deletions
diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb
index 10958db299b..2b8dfc4a5fa 100644
--- a/spec/features/projects/navbar_spec.rb
+++ b/spec/features/projects/navbar_spec.rb
@@ -18,6 +18,13 @@ describe 'Project navbar' do
}
end
+ let(:requirements_nav_item) do
+ {
+ nav_item: _('Requirements'),
+ nav_sub_items: [_('List')]
+ }
+ end
+
let(:structure) do
[
{
@@ -54,6 +61,7 @@ describe 'Project navbar' do
nav_item: _('Merge Requests'),
nav_sub_items: []
},
+ (requirements_nav_item if Gitlab.ee?),
{
nav_item: _('CI / CD'),
nav_sub_items: [
@@ -100,6 +108,7 @@ describe 'Project navbar' do
end
before do
+ stub_licensed_features(requirements: false)
project.add_maintainer(user)
sign_in(user)
end
@@ -123,5 +132,15 @@ describe 'Project navbar' do
it_behaves_like 'verified navigation bar'
end
+
+ context 'when requirements is available' do
+ before do
+ stub_licensed_features(requirements: true)
+
+ visit project_path(project)
+ end
+
+ it_behaves_like 'verified navigation bar'
+ end
end
end
diff --git a/spec/lib/gitlab/checks/project_created_spec.rb b/spec/lib/gitlab/checks/project_created_spec.rb
index 373fef2a240..bbc97155374 100644
--- a/spec/lib/gitlab/checks/project_created_spec.rb
+++ b/spec/lib/gitlab/checks/project_created_spec.rb
@@ -3,24 +3,29 @@
require 'spec_helper'
describe Gitlab::Checks::ProjectCreated, :clean_gitlab_redis_shared_state do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository, namespace: user.namespace) }
+ let(:protocol) { 'http' }
+ let(:git_user) { user }
+ let(:repository) { project.repository }
+
+ subject { described_class.new(repository, git_user, 'http') }
describe '.fetch_message' do
context 'with a project created message queue' do
- let(:project_created) { described_class.new(project, user, 'http') }
-
before do
- project_created.add_message
+ subject.add_message
end
it 'returns project created message' do
- expect(described_class.fetch_message(user.id, project.id)).to eq(project_created.message)
+ expect(described_class.fetch_message(user.id, project.id)).to eq(subject.message)
end
it 'deletes the project created message from redis' do
expect(Gitlab::Redis::SharedState.with { |redis| redis.get("project_created:#{user.id}:#{project.id}") }).not_to be_nil
+
described_class.fetch_message(user.id, project.id)
+
expect(Gitlab::Redis::SharedState.with { |redis| redis.get("project_created:#{user.id}:#{project.id}") }).to be_nil
end
end
@@ -34,15 +39,15 @@ describe Gitlab::Checks::ProjectCreated, :clean_gitlab_redis_shared_state do
describe '#add_message' do
it 'queues a project created message' do
- project_created = described_class.new(project, user, 'http')
-
- expect(project_created.add_message).to eq('OK')
+ expect(subject.add_message).to eq('OK')
end
- it 'handles anonymous push' do
- project_created = described_class.new(nil, user, 'http')
+ context 'when user is nil' do
+ let(:git_user) { nil }
- expect(project_created.add_message).to be_nil
+ it 'handles anonymous push' do
+ expect(subject.add_message).to be_nil
+ end
end
end
end
diff --git a/spec/lib/gitlab/checks/project_moved_spec.rb b/spec/lib/gitlab/checks/project_moved_spec.rb
index 3de397760b4..1d1d6211088 100644
--- a/spec/lib/gitlab/checks/project_moved_spec.rb
+++ b/spec/lib/gitlab/checks/project_moved_spec.rb
@@ -3,24 +3,30 @@
require 'spec_helper'
describe Gitlab::Checks::ProjectMoved, :clean_gitlab_redis_shared_state do
- let(:user) { create(:user) }
- let(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository, :wiki_repo, namespace: user.namespace) }
+ let(:repository) { project.repository }
+ let(:protocol) { 'http' }
+ let(:git_user) { user }
+ let(:redirect_path) { 'foo/bar' }
+
+ subject { described_class.new(repository, git_user, protocol, redirect_path) }
describe '.fetch_message' do
context 'with a redirect message queue' do
- it 'returns the redirect message' do
- project_moved = described_class.new(project, user, 'http', 'foo/bar')
- project_moved.add_message
+ before do
+ subject.add_message
+ end
- expect(described_class.fetch_message(user.id, project.id)).to eq(project_moved.message)
+ it 'returns the redirect message' do
+ expect(described_class.fetch_message(user.id, project.id)).to eq(subject.message)
end
it 'deletes the redirect message from redis' do
- project_moved = described_class.new(project, user, 'http', 'foo/bar')
- project_moved.add_message
-
expect(Gitlab::Redis::SharedState.with { |redis| redis.get("redirect_namespace:#{user.id}:#{project.id}") }).not_to be_nil
+
described_class.fetch_message(user.id, project.id)
+
expect(Gitlab::Redis::SharedState.with { |redis| redis.get("redirect_namespace:#{user.id}:#{project.id}") }).to be_nil
end
end
@@ -34,29 +40,82 @@ describe Gitlab::Checks::ProjectMoved, :clean_gitlab_redis_shared_state do
describe '#add_message' do
it 'queues a redirect message' do
- project_moved = described_class.new(project, user, 'http', 'foo/bar')
- expect(project_moved.add_message).to eq("OK")
+ expect(subject.add_message).to eq("OK")
end
- it 'handles anonymous clones' do
- project_moved = described_class.new(project, nil, 'http', 'foo/bar')
+ context 'when user is nil' do
+ let(:git_user) { nil }
- expect(project_moved.add_message).to eq(nil)
+ it 'handles anonymous clones' do
+ expect(subject.add_message).to be_nil
+ end
end
end
describe '#message' do
- it 'returns a redirect message' do
- project_moved = described_class.new(project, user, 'http', 'foo/bar')
- message = <<~MSG
- Project 'foo/bar' was moved to '#{project.full_path}'.
+ shared_examples 'errors per protocol' do
+ shared_examples 'returns redirect message' do
+ it do
+ message = <<~MSG
+ Project '#{redirect_path}' was moved to '#{project.full_path}'.
+
+ Please update your Git remote:
+
+ git remote set-url origin #{url_to_repo}
+ MSG
+
+ expect(subject.message).to eq(message)
+ end
+ end
+
+ context 'when protocol is http' do
+ it_behaves_like 'returns redirect message' do
+ let(:url_to_repo) { http_url_to_repo }
+ end
+ end
+
+ context 'when protocol is ssh' do
+ let(:protocol) { 'ssh' }
- Please update your Git remote:
+ it_behaves_like 'returns redirect message' do
+ let(:url_to_repo) { ssh_url_to_repo }
+ end
+ end
+ end
+
+ context 'with project' do
+ it_behaves_like 'errors per protocol' do
+ let(:http_url_to_repo) { project.http_url_to_repo }
+ let(:ssh_url_to_repo) { project.ssh_url_to_repo }
+ end
+ end
+
+ context 'with wiki' do
+ let(:repository) { project.wiki.repository }
- git remote set-url origin #{project.http_url_to_repo}
- MSG
+ it_behaves_like 'errors per protocol' do
+ let(:http_url_to_repo) { project.wiki.http_url_to_repo }
+ let(:ssh_url_to_repo) { project.wiki.ssh_url_to_repo }
+ end
+ end
- expect(project_moved.message).to eq(message)
+ context 'with project snippet' do
+ let_it_be(:snippet) { create(:project_snippet, :repository, project: project, author: user) }
+ let(:repository) { snippet.repository }
+
+ it_behaves_like 'errors per protocol' do
+ let(:http_url_to_repo) { snippet.http_url_to_repo }
+ let(:ssh_url_to_repo) { snippet.ssh_url_to_repo }
+ end
+ end
+
+ context 'with personal snippet' do
+ let_it_be(:snippet) { create(:personal_snippet, :repository, author: user) }
+ let(:repository) { snippet.repository }
+
+ it 'returns nil' do
+ expect(subject.add_message).to be_nil
+ end
end
end
end
diff --git a/spec/lib/gitlab/repo_path_spec.rb b/spec/lib/gitlab/repo_path_spec.rb
index e72bdc01940..68571b9de20 100644
--- a/spec/lib/gitlab/repo_path_spec.rb
+++ b/spec/lib/gitlab/repo_path_spec.rb
@@ -8,7 +8,8 @@ describe ::Gitlab::RepoPath do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:personal_snippet) { create(:personal_snippet) }
let_it_be(:project_snippet) { create(:project_snippet, project: project) }
- let_it_be(:redirect) { project.route.create_redirect('foo/bar/baz') }
+ let_it_be(:redirect_route) { 'foo/bar/baz' }
+ let_it_be(:redirect) { project.route.create_redirect(redirect_route) }
describe '.parse' do
context 'a repository storage path' do
@@ -43,22 +44,20 @@ describe ::Gitlab::RepoPath do
end
context 'of a redirected project' do
- let(:redirect) { project.route.create_redirect('foo/bar') }
-
it 'parses a relative repository path' do
- expect(described_class.parse(redirect.path + '.git')).to eq([project, project, Gitlab::GlRepository::PROJECT, 'foo/bar'])
+ expect(described_class.parse(redirect.path + '.git')).to eq([project, project, Gitlab::GlRepository::PROJECT, redirect_route])
end
it 'parses a relative wiki path' do
- expect(described_class.parse(redirect.path + '.wiki.git')).to eq([project, project, Gitlab::GlRepository::WIKI, 'foo/bar.wiki'])
+ expect(described_class.parse(redirect.path + '.wiki.git')).to eq([project, project, Gitlab::GlRepository::WIKI, redirect_route])
end
it 'parses a relative path starting with /' do
- expect(described_class.parse('/' + redirect.path + '.git')).to eq([project, project, Gitlab::GlRepository::PROJECT, 'foo/bar'])
+ expect(described_class.parse('/' + redirect.path + '.git')).to eq([project, project, Gitlab::GlRepository::PROJECT, redirect_route])
end
it 'parses a redirected project snippet repository path' do
- expect(described_class.parse(redirect.path + "/snippets/#{project_snippet.id}.git")).to eq([project_snippet, project, Gitlab::GlRepository::SNIPPET, "foo/bar/snippets/#{project_snippet.id}"])
+ expect(described_class.parse(redirect.path + "/snippets/#{project_snippet.id}.git")).to eq([project_snippet, project, Gitlab::GlRepository::SNIPPET, redirect_route])
end
end
end
@@ -71,8 +70,8 @@ describe ::Gitlab::RepoPath do
describe '.find_project' do
context 'when finding a project by its canonical path' do
context 'when the cases match' do
- it 'returns the project and false' do
- expect(described_class.find_project(project.full_path)).to eq([project, false])
+ it 'returns the project and nil' do
+ expect(described_class.find_project(project.full_path)).to eq([project, nil])
end
end
@@ -81,45 +80,45 @@ describe ::Gitlab::RepoPath do
# easy and safe to redirect someone to the correctly-cased URL. For git
# requests, we should accept wrongly-cased URLs because it is a pain to
# block people's git operations and force them to update remote URLs.
- it 'returns the project and false' do
- expect(described_class.find_project(project.full_path.upcase)).to eq([project, false])
+ it 'returns the project and nil' do
+ expect(described_class.find_project(project.full_path.upcase)).to eq([project, nil])
end
end
end
context 'when finding a project via a redirect' do
- it 'returns the project and true' do
- expect(described_class.find_project(redirect.path)).to eq([project, true])
+ it 'returns the project and nil' do
+ expect(described_class.find_project(redirect.path)).to eq([project, redirect.path])
end
end
end
describe '.find_snippet' do
it 'extracts path and id from personal snippet route' do
- expect(described_class.find_snippet("snippets/#{personal_snippet.id}")).to eq([personal_snippet, false])
+ expect(described_class.find_snippet("snippets/#{personal_snippet.id}")).to eq([personal_snippet, nil])
end
it 'extracts path and id from project snippet route' do
- expect(described_class.find_snippet("#{project.full_path}/snippets/#{project_snippet.id}")).to eq([project_snippet, false])
+ expect(described_class.find_snippet("#{project.full_path}/snippets/#{project_snippet.id}")).to eq([project_snippet, nil])
end
it 'returns nil for invalid snippet paths' do
aggregate_failures do
- expect(described_class.find_snippet("snippets/#{project_snippet.id}")).to eq([nil, false])
- expect(described_class.find_snippet("#{project.full_path}/snippets/#{personal_snippet.id}")).to eq([nil, false])
- expect(described_class.find_snippet('')).to eq([nil, false])
+ expect(described_class.find_snippet("snippets/#{project_snippet.id}")).to eq([nil, nil])
+ expect(described_class.find_snippet("#{project.full_path}/snippets/#{personal_snippet.id}")).to eq([nil, nil])
+ expect(described_class.find_snippet('')).to eq([nil, nil])
end
end
it 'returns nil for snippets not associated with the project' do
snippet = create(:project_snippet)
- expect(described_class.find_snippet("#{project.full_path}/snippets/#{snippet.id}")).to eq([nil, false])
+ expect(described_class.find_snippet("#{project.full_path}/snippets/#{snippet.id}")).to eq([nil, nil])
end
context 'when finding a project snippet via a redirect' do
it 'returns the project and true' do
- expect(described_class.find_snippet("#{redirect.path}/snippets/#{project_snippet.id}")).to eq([project_snippet, true])
+ expect(described_class.find_snippet("#{redirect.path}/snippets/#{project_snippet.id}")).to eq([project_snippet, redirect.path])
end
end
end
diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb
index c9656b4d6ca..7ae4a81ddd7 100644
--- a/spec/models/snippet_spec.rb
+++ b/spec/models/snippet_spec.rb
@@ -697,4 +697,20 @@ describe Snippet do
it { is_expected.to eq result }
end
end
+
+ describe '#url_to_repo' do
+ subject { snippet.url_to_repo }
+
+ context 'with personal snippet' do
+ let(:snippet) { create(:personal_snippet) }
+
+ it { is_expected.to eq(Gitlab.config.gitlab_shell.ssh_path_prefix + "snippets/#{snippet.id}.git") }
+ end
+
+ context 'with project snippet' do
+ let(:snippet) { create(:project_snippet) }
+
+ it { is_expected.to eq(Gitlab.config.gitlab_shell.ssh_path_prefix + "#{snippet.project.full_path}/snippets/#{snippet.id}.git") }
+ end
+ end
end
diff --git a/spec/services/post_receive_service_spec.rb b/spec/services/post_receive_service_spec.rb
index f3631ff922f..b4f48696b15 100644
--- a/spec/services/post_receive_service_spec.rb
+++ b/spec/services/post_receive_service_spec.rb
@@ -234,7 +234,7 @@ describe PostReceiveService do
context 'with a redirected data' do
it 'returns redirected message on the response' do
- project_moved = Gitlab::Checks::ProjectMoved.new(project, user, 'http', 'foo/baz')
+ project_moved = Gitlab::Checks::ProjectMoved.new(project.repository, user, 'http', 'foo/baz')
project_moved.add_message
expect(subject).to include(build_basic_message(project_moved.message))
@@ -243,7 +243,7 @@ describe PostReceiveService do
context 'with new project data' do
it 'returns new project message on the response' do
- project_created = Gitlab::Checks::ProjectCreated.new(project, user, 'http')
+ project_created = Gitlab::Checks::ProjectCreated.new(project.repository, user, 'http')
project_created.add_message
expect(subject).to include(build_basic_message(project_created.message))
diff --git a/spec/support/shared_examples/workers/idempotency_shared_examples.rb b/spec/support/shared_examples/workers/idempotency_shared_examples.rb
index 19be1fe2c9d..9d9b371d61a 100644
--- a/spec/support/shared_examples/workers/idempotency_shared_examples.rb
+++ b/spec/support/shared_examples/workers/idempotency_shared_examples.rb
@@ -16,6 +16,8 @@
# end
#
RSpec.shared_examples 'an idempotent worker' do
+ let(:worker_exec_times) { IdempotentWorkerHelper::WORKER_EXEC_TIMES }
+
# Avoid stubbing calls for a more accurate run.
subject do
defined?(job_args) ? perform_multiple(job_args) : perform_multiple
diff --git a/spec/workers/concerns/application_worker_spec.rb b/spec/workers/concerns/application_worker_spec.rb
index ae5244e2f62..2fbaaf1131f 100644
--- a/spec/workers/concerns/application_worker_spec.rb
+++ b/spec/workers/concerns/application_worker_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
describe ApplicationWorker do
- let(:worker) do
+ let_it_be(:worker) do
Class.new do
def self.name
'Gitlab::Foo::Bar::DummyWorker'
@@ -13,12 +13,51 @@ describe ApplicationWorker do
end
end
+ let(:instance) { worker.new }
+
describe 'Sidekiq options' do
it 'sets the queue name based on the class name' do
expect(worker.sidekiq_options['queue']).to eq('foo_bar_dummy')
end
end
+ describe '#structured_payload' do
+ let(:payload) { {} }
+
+ subject(:result) { instance.structured_payload(payload) }
+
+ it 'adds worker related payload' do
+ instance.jid = 'a jid'
+
+ expect(result).to include(
+ 'class' => worker.class,
+ 'job_status' => 'running',
+ 'queue' => worker.queue,
+ 'jid' => instance.jid
+ )
+ end
+
+ it 'adds labkit context' do
+ user = build_stubbed(:user, username: 'jane-doe')
+
+ instance.with_context(user: user) do
+ expect(result).to include('meta.user' => user.username)
+ end
+ end
+
+ it 'adds custom payload converting stringified keys' do
+ payload[:message] = 'some message'
+
+ expect(result).to include('message' => payload[:message])
+ end
+
+ it 'does not override predefined context keys with custom payload' do
+ payload['class'] = 'custom value'
+
+ expect(result).to include('class' => worker.class)
+ end
+ end
+
describe '.queue_namespace' do
it 'sets the queue name based on the class name' do
worker.queue_namespace :some_namespace
diff --git a/spec/workers/expire_job_cache_worker_spec.rb b/spec/workers/expire_job_cache_worker_spec.rb
index 797f110ec68..2776624f14c 100644
--- a/spec/workers/expire_job_cache_worker_spec.rb
+++ b/spec/workers/expire_job_cache_worker_spec.rb
@@ -21,12 +21,12 @@ describe ExpireJobCacheWorker do
allow(Gitlab::EtagCaching::Store).to receive(:new) { spy_store }
expect(spy_store).to receive(:touch)
- .exactly(IdempotentWorkerHelper::WORKER_EXEC_TIMES).times
+ .exactly(worker_exec_times).times
.with(pipeline_path)
.and_call_original
expect(spy_store).to receive(:touch)
- .exactly(IdempotentWorkerHelper::WORKER_EXEC_TIMES).times
+ .exactly(worker_exec_times).times
.with(job_path)
.and_call_original