debian-mirror-gitlab/spec/models/integrations/bamboo_spec.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

281 lines
8.5 KiB
Ruby
Raw Normal View History

2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
2015-10-24 18:46:33 +05:30
require 'spec_helper'
2021-06-08 01:23:25 +05:30
RSpec.describe Integrations::Bamboo, :use_clean_rails_memory_store_caching do
2017-08-17 22:00:37 +05:30
include ReactiveCachingHelpers
2019-06-05 12:25:43 +05:30
include StubRequests
2017-08-17 22:00:37 +05:30
let(:bamboo_url) { 'http://gitlab.com/bamboo' }
2020-04-22 19:07:51 +05:30
let_it_be(:project) { create(:project) }
2021-09-30 23:02:18 +05:30
subject(:integration) do
2020-11-24 15:15:51 +05:30
described_class.create!(
2021-10-27 15:23:28 +05:30
active: true,
2020-04-22 19:07:51 +05:30
project: project,
2017-08-17 22:00:37 +05:30
properties: {
bamboo_url: bamboo_url,
username: 'mic',
password: 'password',
build_key: 'foo'
}
)
end
2022-02-05 19:09:49 +05:30
include_context Integrations::EnableSslVerification
2016-06-02 11:05:42 +05:30
describe 'Validations' do
2021-09-30 23:02:18 +05:30
context 'when active' do
2017-09-10 17:25:29 +05:30
before do
2021-09-30 23:02:18 +05:30
integration.active = true
2017-09-10 17:25:29 +05:30
end
2016-06-02 11:05:42 +05:30
it { is_expected.to validate_presence_of(:build_key) }
it { is_expected.to validate_presence_of(:bamboo_url) }
2021-09-30 23:02:18 +05:30
it_behaves_like 'issue tracker integration URL attribute', :bamboo_url
2015-10-24 18:46:33 +05:30
2016-06-02 11:05:42 +05:30
describe '#username' do
it 'does not validate the presence of username if password is nil' do
2021-09-30 23:02:18 +05:30
integration.password = nil
2016-06-02 11:05:42 +05:30
2021-09-30 23:02:18 +05:30
expect(integration).not_to validate_presence_of(:username)
2016-06-02 11:05:42 +05:30
end
it 'validates the presence of username if password is present' do
2021-09-30 23:02:18 +05:30
integration.password = 'secret'
2016-06-02 11:05:42 +05:30
2021-09-30 23:02:18 +05:30
expect(integration).to validate_presence_of(:username)
2016-06-02 11:05:42 +05:30
end
2015-10-24 18:46:33 +05:30
end
2016-06-02 11:05:42 +05:30
describe '#password' do
it 'does not validate the presence of password if username is nil' do
2021-09-30 23:02:18 +05:30
integration.username = nil
2016-06-02 11:05:42 +05:30
2021-09-30 23:02:18 +05:30
expect(integration).not_to validate_presence_of(:password)
2016-06-02 11:05:42 +05:30
end
it 'validates the presence of password if username is present' do
2021-09-30 23:02:18 +05:30
integration.username = 'john'
2016-06-02 11:05:42 +05:30
2021-09-30 23:02:18 +05:30
expect(integration).to validate_presence_of(:password)
2016-06-02 11:05:42 +05:30
end
2015-10-24 18:46:33 +05:30
end
end
2016-06-02 11:05:42 +05:30
2021-09-30 23:02:18 +05:30
context 'when inactive' do
2017-09-10 17:25:29 +05:30
before do
2021-09-30 23:02:18 +05:30
integration.active = false
2017-09-10 17:25:29 +05:30
end
2016-06-02 11:05:42 +05:30
it { is_expected.not_to validate_presence_of(:build_key) }
it { is_expected.not_to validate_presence_of(:bamboo_url) }
it { is_expected.not_to validate_presence_of(:username) }
it { is_expected.not_to validate_presence_of(:password) }
end
end
describe 'Callbacks' do
2021-10-27 15:23:28 +05:30
describe 'before_validation :reset_password' do
2016-06-02 11:05:42 +05:30
context 'when a password was previously set' do
it 'resets password if url changed' do
2021-09-30 23:02:18 +05:30
integration.bamboo_url = 'http://gitlab1.com'
2016-06-02 11:05:42 +05:30
2021-10-27 15:23:28 +05:30
expect(integration).not_to be_valid
2021-09-30 23:02:18 +05:30
expect(integration.password).to be_nil
2016-06-02 11:05:42 +05:30
end
it 'does not reset password if username changed' do
2021-09-30 23:02:18 +05:30
integration.username = 'some_name'
2016-06-02 11:05:42 +05:30
2021-10-27 15:23:28 +05:30
expect(integration).to be_valid
2021-09-30 23:02:18 +05:30
expect(integration.password).to eq('password')
2016-06-02 11:05:42 +05:30
end
it "does not reset password if new url is set together with password, even if it's the same password" do
2021-09-30 23:02:18 +05:30
integration.bamboo_url = 'http://gitlab_edited.com'
integration.password = 'password'
2016-06-02 11:05:42 +05:30
2021-10-27 15:23:28 +05:30
expect(integration).to be_valid
2021-09-30 23:02:18 +05:30
expect(integration.password).to eq('password')
expect(integration.bamboo_url).to eq('http://gitlab_edited.com')
2016-06-02 11:05:42 +05:30
end
2015-10-24 18:46:33 +05:30
end
2016-06-02 11:05:42 +05:30
it 'saves password if new url is set together with password when no password was previously set' do
2021-09-30 23:02:18 +05:30
integration.password = nil
2016-06-02 11:05:42 +05:30
2021-09-30 23:02:18 +05:30
integration.bamboo_url = 'http://gitlab_edited.com'
integration.password = 'password'
integration.save!
2016-06-02 11:05:42 +05:30
2021-10-27 15:23:28 +05:30
expect(integration.reload).to have_attributes(
bamboo_url: 'http://gitlab_edited.com',
password: 'password'
)
2015-10-24 18:46:33 +05:30
end
2016-06-02 11:05:42 +05:30
end
end
2018-11-08 19:23:39 +05:30
describe '#execute' do
it 'runs update and build action' do
stub_update_and_build_request
2021-09-30 23:02:18 +05:30
integration.execute(Gitlab::DataBuilder::Push::SAMPLE_DATA)
2018-11-08 19:23:39 +05:30
end
end
2016-06-02 11:05:42 +05:30
describe '#build_page' do
2017-08-17 22:00:37 +05:30
it 'returns the contents of the reactive cache' do
2021-09-30 23:02:18 +05:30
stub_reactive_cache(integration, { build_page: 'foo' }, 'sha', 'ref')
2015-10-24 18:46:33 +05:30
2021-09-30 23:02:18 +05:30
expect(integration.build_page('sha', 'ref')).to eq('foo')
2015-10-24 18:46:33 +05:30
end
2017-08-17 22:00:37 +05:30
end
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
describe '#commit_status' do
it 'returns the contents of the reactive cache' do
2021-09-30 23:02:18 +05:30
stub_reactive_cache(integration, { commit_status: 'foo' }, 'sha', 'ref')
2016-06-02 11:05:42 +05:30
2021-09-30 23:02:18 +05:30
expect(integration.commit_status('sha', 'ref')).to eq('foo')
2016-06-02 11:05:42 +05:30
end
2017-08-17 22:00:37 +05:30
end
2016-06-02 11:05:42 +05:30
2019-03-02 22:35:43 +05:30
shared_examples 'reactive cache calculation' do
2020-03-13 15:44:24 +05:30
describe '#build_page' do
2021-09-30 23:02:18 +05:30
subject { integration.calculate_reactive_cache('123', 'unused')[:build_page] }
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
it 'returns a specific URL when status is 500' do
stub_request(status: 500)
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
is_expected.to eq('http://gitlab.com/bamboo/browse/foo')
end
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
it 'returns a specific URL when response has no results' do
2019-03-02 22:35:43 +05:30
stub_request(body: %q({"results":{"results":{"size":"0"}}}))
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
is_expected.to eq('http://gitlab.com/bamboo/browse/foo')
end
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
it 'returns a build URL when bamboo_url has no trailing slash' do
stub_request(body: bamboo_response)
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
is_expected.to eq('http://gitlab.com/bamboo/browse/42')
end
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
context 'bamboo_url has trailing slash' do
let(:bamboo_url) { 'http://gitlab.com/bamboo/' }
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
it 'returns a build URL' do
stub_request(body: bamboo_response)
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
is_expected.to eq('http://gitlab.com/bamboo/browse/42')
end
end
2016-06-02 11:05:42 +05:30
end
2020-03-13 15:44:24 +05:30
describe '#commit_status' do
2021-09-30 23:02:18 +05:30
subject { integration.calculate_reactive_cache('123', 'unused')[:commit_status] }
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
it 'sets commit status to :error when status is 500' do
stub_request(status: 500)
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
is_expected.to eq(:error)
end
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
it 'sets commit status to "pending" when status is 404' do
stub_request(status: 404)
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
is_expected.to eq('pending')
end
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
it 'sets commit status to "pending" when response has no results' do
stub_request(body: %q({"results":{"results":{"size":"0"}}}))
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
is_expected.to eq('pending')
end
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
it 'sets commit status to "success" when build state contains Success' do
stub_request(body: bamboo_response(build_state: 'YAY Success!'))
2016-06-02 11:05:42 +05:30
2017-08-17 22:00:37 +05:30
is_expected.to eq('success')
end
it 'sets commit status to "failed" when build state contains Failed' do
stub_request(body: bamboo_response(build_state: 'NO Failed!'))
is_expected.to eq('failed')
end
it 'sets commit status to "pending" when build state contains Pending' do
stub_request(body: bamboo_response(build_state: 'NO Pending!'))
is_expected.to eq('pending')
end
it 'sets commit status to :error when build state is unknown' do
stub_request(body: bamboo_response(build_state: 'FOO BAR!'))
is_expected.to eq(:error)
end
2020-04-22 19:07:51 +05:30
Gitlab::HTTP::HTTP_ERRORS.each do |http_error|
it "sets commit status to :error with a #{http_error.name} error" do
WebMock.stub_request(:get, 'http://gitlab.com/bamboo/rest/api/latest/result/byChangeset/123?os_authType=basic')
.to_raise(http_error)
expect(Gitlab::ErrorTracking)
.to receive(:log_exception)
2022-07-16 23:28:13 +05:30
.with(instance_of(http_error), { project_id: project.id })
2020-04-22 19:07:51 +05:30
is_expected.to eq(:error)
end
end
2017-08-17 22:00:37 +05:30
end
2016-06-02 11:05:42 +05:30
end
2019-03-02 22:35:43 +05:30
describe '#calculate_reactive_cache' do
context 'when Bamboo API returns single result' do
let(:bamboo_response_template) do
%q({"results":{"results":{"size":"1","result":{"buildState":"%{build_state}","planResultKey":{"key":"42"}}}}})
end
it_behaves_like 'reactive cache calculation'
end
context 'when Bamboo API returns an array of results and we only consider the last one' do
let(:bamboo_response_template) do
%q({"results":{"results":{"size":"2","result":[{"buildState":"%{build_state}","planResultKey":{"key":"41"}},{"buildState":"%{build_state}","planResultKey":{"key":"42"}}]}}})
end
it_behaves_like 'reactive cache calculation'
end
end
2018-11-08 19:23:39 +05:30
def stub_update_and_build_request(status: 200, body: nil)
bamboo_full_url = 'http://gitlab.com/bamboo/updateAndBuild.action?buildKey=foo&os_authType=basic'
stub_bamboo_request(bamboo_full_url, status, body)
end
2017-08-17 22:00:37 +05:30
def stub_request(status: 200, body: nil)
2018-11-08 19:23:39 +05:30
bamboo_full_url = 'http://gitlab.com/bamboo/rest/api/latest/result/byChangeset/123?os_authType=basic'
stub_bamboo_request(bamboo_full_url, status, body)
end
2016-06-02 11:05:42 +05:30
2018-11-08 19:23:39 +05:30
def stub_bamboo_request(url, status, body)
2019-06-05 12:25:43 +05:30
stub_full_request(url).to_return(
2016-06-02 11:05:42 +05:30
status: status,
headers: { 'Content-Type' => 'application/json' },
body: body
2017-09-10 17:25:29 +05:30
).with(basic_auth: %w(mic password))
2015-10-24 18:46:33 +05:30
end
2017-08-17 22:00:37 +05:30
2019-03-02 22:35:43 +05:30
def bamboo_response(build_state: 'success')
2018-12-13 13:39:08 +05:30
# reference: https://docs.atlassian.com/atlassian-bamboo/REST/6.2.5/#d2e786
2019-03-02 22:35:43 +05:30
bamboo_response_template % { build_state: build_state }
2017-08-17 22:00:37 +05:30
end
2015-10-24 18:46:33 +05:30
end