diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-17 15:09:52 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-17 15:09:52 +0300 |
commit | 8ae26d705abe341b03bc15d4373d6cd0c77c0baf (patch) | |
tree | 655ee03a968e340c975b8ab7d77cfd5ceaf3c969 /spec | |
parent | fc1df8c8307fc5022f9e8aae04164c089d8fdf2e (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r-- | spec/features/projects/navbar_spec.rb | 19 | ||||
-rw-r--r-- | spec/lib/gitlab/checks/project_created_spec.rb | 29 | ||||
-rw-r--r-- | spec/lib/gitlab/checks/project_moved_spec.rb | 103 | ||||
-rw-r--r-- | spec/lib/gitlab/repo_path_spec.rb | 39 | ||||
-rw-r--r-- | spec/models/snippet_spec.rb | 16 | ||||
-rw-r--r-- | spec/services/post_receive_service_spec.rb | 4 | ||||
-rw-r--r-- | spec/support/shared_examples/workers/idempotency_shared_examples.rb | 2 | ||||
-rw-r--r-- | spec/workers/concerns/application_worker_spec.rb | 41 | ||||
-rw-r--r-- | spec/workers/expire_job_cache_worker_spec.rb | 4 |
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 |