From d9ab72d6080f594d0b3cae15f14b3ef2c6c638cb Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 20 Oct 2021 08:43:02 +0000 Subject: Add latest changes from gitlab-org/gitlab@14-4-stable-ee --- .../validate_remote_git_endpoint_service_spec.rb | 96 ++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 spec/services/import/validate_remote_git_endpoint_service_spec.rb (limited to 'spec/services/import') diff --git a/spec/services/import/validate_remote_git_endpoint_service_spec.rb b/spec/services/import/validate_remote_git_endpoint_service_spec.rb new file mode 100644 index 00000000000..fbd8a3cb323 --- /dev/null +++ b/spec/services/import/validate_remote_git_endpoint_service_spec.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Import::ValidateRemoteGitEndpointService do + include StubRequests + + let_it_be(:base_url) { 'http://demo.host/path' } + let_it_be(:endpoint_url) { "#{base_url}/info/refs?service=git-upload-pack" } + let_it_be(:error_message) { "#{base_url} is not a valid HTTP Git repository" } + + describe '#execute' do + let(:valid_response) do + { status: 200, + body: '001e# service=git-upload-pack', + headers: { 'Content-Type': 'application/x-git-upload-pack-advertisement' } } + end + + it 'correctly handles URLs with fragment' do + allow(Gitlab::HTTP).to receive(:get) + + described_class.new(url: "#{base_url}#somehash").execute + + expect(Gitlab::HTTP).to have_received(:get).with(endpoint_url, basic_auth: nil, stream_body: true, follow_redirects: false) + end + + context 'when receiving HTTP response' do + subject { described_class.new(url: base_url) } + + it 'returns success when HTTP response is valid and contains correct payload' do + stub_full_request(endpoint_url, method: :get).to_return(valid_response) + + result = subject.execute + + expect(result).to be_a(ServiceResponse) + expect(result.success?).to be(true) + end + + it 'reports error when status code is not 200' do + stub_full_request(endpoint_url, method: :get).to_return(valid_response.merge({ status: 301 })) + + result = subject.execute + + expect(result).to be_a(ServiceResponse) + expect(result.error?).to be(true) + expect(result.message).to eq(error_message) + end + + it 'reports error when invalid URL is provided' do + result = described_class.new(url: 1).execute + + expect(result).to be_a(ServiceResponse) + expect(result.error?).to be(true) + expect(result.message).to eq('1 is not a valid URL') + end + + it 'reports error when required header is missing' do + stub_full_request(endpoint_url, method: :get).to_return(valid_response.merge({ headers: nil })) + + result = subject.execute + + expect(result).to be_a(ServiceResponse) + expect(result.error?).to be(true) + expect(result.message).to eq(error_message) + end + + it 'reports error when body is in invalid format' do + stub_full_request(endpoint_url, method: :get).to_return(valid_response.merge({ body: 'invalid content' })) + + result = subject.execute + + expect(result).to be_a(ServiceResponse) + expect(result.error?).to be(true) + expect(result.message).to eq(error_message) + end + + it 'reports error when exception is raised' do + stub_full_request(endpoint_url, method: :get).to_raise(SocketError.new('dummy message')) + + result = subject.execute + + expect(result).to be_a(ServiceResponse) + expect(result.error?).to be(true) + expect(result.message).to eq(error_message) + end + end + + it 'passes basic auth when credentials are provided' do + allow(Gitlab::HTTP).to receive(:get) + + described_class.new(url: "#{base_url}#somehash", user: 'user', password: 'password').execute + + expect(Gitlab::HTTP).to have_received(:get).with(endpoint_url, basic_auth: { username: 'user', password: 'password' }, stream_body: true, follow_redirects: false) + end + end +end -- cgit v1.2.3