diff options
Diffstat (limited to 'spec/models/project_services/teamcity_service_spec.rb')
-rw-r--r-- | spec/models/project_services/teamcity_service_spec.rb | 334 |
1 files changed, 0 insertions, 334 deletions
diff --git a/spec/models/project_services/teamcity_service_spec.rb b/spec/models/project_services/teamcity_service_spec.rb deleted file mode 100644 index f71dad86a08..00000000000 --- a/spec/models/project_services/teamcity_service_spec.rb +++ /dev/null @@ -1,334 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe TeamcityService, :use_clean_rails_memory_store_caching do - include ReactiveCachingHelpers - include StubRequests - - let(:teamcity_url) { 'http://gitlab.com/teamcity' } - let(:teamcity_full_url) { 'http://gitlab.com/teamcity/httpAuth/app/rest/builds/branch:unspecified:any,revision:123' } - let(:project) { create(:project) } - - subject(:service) do - described_class.create!( - project: project, - properties: { - teamcity_url: teamcity_url, - username: 'mic', - password: 'password', - build_type: 'foo' - } - ) - end - - describe 'Associations' do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe 'Validations' do - context 'when service is active' do - before do - subject.active = true - end - - it { is_expected.to validate_presence_of(:build_type) } - it { is_expected.to validate_presence_of(:teamcity_url) } - it_behaves_like 'issue tracker service URL attribute', :teamcity_url - - describe '#username' do - it 'does not validate the presence of username if password is nil' do - subject.password = nil - - expect(subject).not_to validate_presence_of(:username) - end - - it 'validates the presence of username if password is present' do - subject.password = 'secret' - - expect(subject).to validate_presence_of(:username) - end - end - - describe '#password' do - it 'does not validate the presence of password if username is nil' do - subject.username = nil - - expect(subject).not_to validate_presence_of(:password) - end - - it 'validates the presence of password if username is present' do - subject.username = 'john' - - expect(subject).to validate_presence_of(:password) - end - end - end - - context 'when service is inactive' do - before do - subject.active = false - end - - it { is_expected.not_to validate_presence_of(:build_type) } - it { is_expected.not_to validate_presence_of(:teamcity_url) } - it { is_expected.not_to validate_presence_of(:username) } - it { is_expected.not_to validate_presence_of(:password) } - end - end - - describe 'Callbacks' do - describe 'before_update :reset_password' do - context 'when a password was previously set' do - it 'resets password if url changed' do - teamcity_service = service - - teamcity_service.teamcity_url = 'http://gitlab1.com' - teamcity_service.save! - - expect(teamcity_service.password).to be_nil - end - - it 'does not reset password if username changed' do - teamcity_service = service - - teamcity_service.username = 'some_name' - teamcity_service.save! - - expect(teamcity_service.password).to eq('password') - end - - it "does not reset password if new url is set together with password, even if it's the same password" do - teamcity_service = service - - teamcity_service.teamcity_url = 'http://gitlab_edited.com' - teamcity_service.password = 'password' - teamcity_service.save! - - expect(teamcity_service.password).to eq('password') - expect(teamcity_service.teamcity_url).to eq('http://gitlab_edited.com') - end - end - - it 'saves password if new url is set together with password when no password was previously set' do - teamcity_service = service - teamcity_service.password = nil - - teamcity_service.teamcity_url = 'http://gitlab_edited.com' - teamcity_service.password = 'password' - teamcity_service.save! - - expect(teamcity_service.password).to eq('password') - expect(teamcity_service.teamcity_url).to eq('http://gitlab_edited.com') - end - end - end - - describe '#build_page' do - it 'returns the contents of the reactive cache' do - stub_reactive_cache(service, { build_page: 'foo' }, 'sha', 'ref') - - expect(service.build_page('sha', 'ref')).to eq('foo') - end - end - - describe '#commit_status' do - it 'returns the contents of the reactive cache' do - stub_reactive_cache(service, { commit_status: 'foo' }, 'sha', 'ref') - - expect(service.commit_status('sha', 'ref')).to eq('foo') - end - end - - describe '#calculate_reactive_cache' do - context 'build_page' do - subject { service.calculate_reactive_cache('123', 'unused')[:build_page] } - - it 'returns a specific URL when status is 500' do - stub_request(status: 500) - - is_expected.to eq('http://gitlab.com/teamcity/viewLog.html?buildTypeId=foo') - end - - it 'returns a build URL when teamcity_url has no trailing slash' do - stub_request(body: %q({"build":{"id":"666"}})) - - is_expected.to eq('http://gitlab.com/teamcity/viewLog.html?buildId=666&buildTypeId=foo') - end - - context 'teamcity_url has trailing slash' do - let(:teamcity_url) { 'http://gitlab.com/teamcity/' } - - it 'returns a build URL' do - stub_request(body: %q({"build":{"id":"666"}})) - - is_expected.to eq('http://gitlab.com/teamcity/viewLog.html?buildId=666&buildTypeId=foo') - end - end - - it 'returns the teamcity_url when teamcity is unreachable' do - stub_full_request(teamcity_full_url).to_raise(Errno::ECONNREFUSED) - - expect(Gitlab::ErrorTracking) - .to receive(:log_exception) - .with(instance_of(Errno::ECONNREFUSED), project_id: project.id) - - is_expected.to eq(teamcity_url) - end - end - - context 'commit_status' do - subject { service.calculate_reactive_cache('123', 'unused')[:commit_status] } - - it 'sets commit status to :error when status is 500' do - stub_request(status: 500) - - is_expected.to eq(:error) - end - - it 'sets commit status to "pending" when status is 404' do - stub_request(status: 404) - - is_expected.to eq('pending') - end - - it 'sets commit status to "success" when build status contains SUCCESS' do - stub_request(build_status: 'YAY SUCCESS!') - - is_expected.to eq('success') - end - - it 'sets commit status to "failed" when build status contains FAILURE' do - stub_request(build_status: 'NO FAILURE!') - - is_expected.to eq('failed') - end - - it 'sets commit status to "pending" when build status contains Pending' do - stub_request(build_status: 'NO Pending!') - - is_expected.to eq('pending') - end - - it 'sets commit status to :error when build status is unknown' do - stub_request(build_status: 'FOO BAR!') - - is_expected.to eq(:error) - end - - it 'sets commit status to :error when teamcity is unreachable' do - stub_full_request(teamcity_full_url).to_raise(Errno::ECONNREFUSED) - - expect(Gitlab::ErrorTracking) - .to receive(:log_exception) - .with(instance_of(Errno::ECONNREFUSED), project_id: project.id) - - is_expected.to eq(:error) - end - end - end - - describe '#execute' do - context 'when push' do - let(:data) do - { - object_kind: 'push', - ref: 'refs/heads/dev-123_branch', - after: '0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e', - total_commits_count: 1 - } - end - - it 'handles push request correctly' do - stub_post_to_build_queue(branch: 'dev-123_branch') - - expect(service.execute(data)).to include('Ok') - end - - it 'returns nil when ref is blank' do - data[:after] = Gitlab::Git::BLANK_SHA - - expect(service.execute(data)).to be_nil - end - - it 'returns nil when there is no content' do - data[:total_commits_count] = 0 - - expect(service.execute(data)).to be_nil - end - - it 'returns nil when a merge request is opened for the same ref' do - create(:merge_request, source_project: project, source_branch: 'dev-123_branch') - - expect(service.execute(data)).to be_nil - end - end - - context 'when merge_request' do - let(:data) do - { - object_kind: 'merge_request', - ref: 'refs/heads/dev-123_branch', - after: '0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e', - total_commits_count: 1, - object_attributes: { - state: 'opened', - source_branch: 'dev-123_branch', - merge_status: 'unchecked' - } - } - end - - it 'handles merge request correctly' do - stub_post_to_build_queue(branch: 'dev-123_branch') - - expect(service.execute(data)).to include('Ok') - end - - it 'returns nil when merge request is not opened' do - data[:object_attributes][:state] = 'closed' - - expect(service.execute(data)).to be_nil - end - - it 'returns nil unless merge request is marked as unchecked' do - data[:object_attributes][:merge_status] = 'can_be_merged' - - expect(service.execute(data)).to be_nil - end - end - - it 'returns nil when event is not supported' do - data = { object_kind: 'foo' } - - expect(service.execute(data)).to be_nil - end - end - - def stub_post_to_build_queue(branch:) - teamcity_full_url = 'http://gitlab.com/teamcity/httpAuth/app/rest/buildQueue' - body ||= %Q(<build branchName=\"#{branch}\"><buildType id=\"foo\"/></build>) - auth = %w(mic password) - - stub_full_request(teamcity_full_url, method: :post).with( - basic_auth: auth, - body: body, - headers: { - 'Content-Type' => 'application/xml' - } - ).to_return(status: 200, body: 'Ok', headers: {}) - end - - def stub_request(status: 200, body: nil, build_status: 'success') - auth = %w(mic password) - - body ||= %Q({"build":{"status":"#{build_status}","id":"666"}}) - - stub_full_request(teamcity_full_url).with(basic_auth: auth).to_return( - status: status, - headers: { 'Content-Type' => 'application/json' }, - body: body - ) - end -end |