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/lib | |
parent | fc1df8c8307fc5022f9e8aae04164c089d8fdf2e (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/lib')
-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 |
3 files changed, 117 insertions, 54 deletions
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 |