debian-mirror-gitlab/spec/services/projects/operations/update_service_spec.rb

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

472 lines
15 KiB
Ruby
Raw Normal View History

2019-02-15 15:39:39 +05:30
# frozen_string_literal: true
require 'spec_helper'
2023-05-27 22:25:52 +05:30
RSpec.describe Projects::Operations::UpdateService, feature_category: :projects do
2021-01-03 14:25:43 +05:30
let_it_be_with_refind(:project) { create(:project) }
2020-03-13 15:44:24 +05:30
let_it_be(:user) { create(:user) }
2019-02-15 15:39:39 +05:30
let(:result) { subject.execute }
subject { described_class.new(project, user, params) }
describe '#execute' do
2020-04-22 19:07:51 +05:30
context 'alerting setting' do
2021-01-03 14:25:43 +05:30
before_all do
2020-04-22 19:07:51 +05:30
project.add_maintainer(user)
end
shared_examples 'no operation' do
it 'does nothing' do
expect(result[:status]).to eq(:success)
expect(project.reload.alerting_setting).to be_nil
end
end
context 'with valid params' do
let(:params) { { alerting_setting_attributes: alerting_params } }
shared_examples 'setting creation' do
it 'creates a setting' do
expect(project.alerting_setting).to be_nil
expect(result[:status]).to eq(:success)
expect(project.reload.alerting_setting).not_to be_nil
end
end
context 'when regenerate_token is not set' do
let(:alerting_params) { { token: 'some token' } }
context 'with an existing setting' do
let!(:alerting_setting) do
create(:project_alerting_setting, project: project)
end
it 'ignores provided token' do
expect(result[:status]).to eq(:success)
expect(project.reload.alerting_setting.token)
.to eq(alerting_setting.token)
end
end
context 'without an existing setting' do
it_behaves_like 'setting creation'
end
end
context 'when regenerate_token is set' do
let(:alerting_params) { { regenerate_token: true } }
context 'with an existing setting' do
let(:token) { 'some token' }
let!(:alerting_setting) do
create(:project_alerting_setting, project: project, token: token)
end
it 'regenerates token' do
expect(result[:status]).to eq(:success)
expect(project.reload.alerting_setting.token).not_to eq(token)
end
end
context 'without an existing setting' do
it_behaves_like 'setting creation'
context 'with insufficient permissions' do
before do
project.add_reporter(user)
end
it_behaves_like 'no operation'
end
end
end
end
context 'with empty params' do
let(:params) { {} }
it_behaves_like 'no operation'
end
end
2019-07-31 22:56:46 +05:30
context 'metrics dashboard setting' do
let(:params) do
{
metrics_setting_attributes: {
2020-06-23 00:09:42 +05:30
external_dashboard_url: 'http://gitlab.com',
dashboard_timezone: 'utc'
2019-07-31 22:56:46 +05:30
}
}
end
context 'without existing metrics dashboard setting' do
it 'creates a setting' do
expect(result[:status]).to eq(:success)
expect(project.reload.metrics_setting.external_dashboard_url).to eq(
'http://gitlab.com'
)
2020-06-23 00:09:42 +05:30
expect(project.metrics_setting.dashboard_timezone).to eq('utc')
2019-07-31 22:56:46 +05:30
end
end
context 'with existing metrics dashboard setting' do
before do
create(:project_metrics_setting, project: project)
end
it 'updates the settings' do
expect(result[:status]).to eq(:success)
expect(project.reload.metrics_setting.external_dashboard_url).to eq(
'http://gitlab.com'
)
2020-06-23 00:09:42 +05:30
expect(project.metrics_setting.dashboard_timezone).to eq('utc')
2019-07-31 22:56:46 +05:30
end
2020-06-23 00:09:42 +05:30
end
2019-07-31 22:56:46 +05:30
2020-06-23 00:09:42 +05:30
context 'with blank external_dashboard_url' do
let(:params) do
{
metrics_setting_attributes: {
external_dashboard_url: '',
dashboard_timezone: 'utc'
2019-07-31 22:56:46 +05:30
}
2020-06-23 00:09:42 +05:30
}
end
2019-07-31 22:56:46 +05:30
2020-06-23 00:09:42 +05:30
it 'updates dashboard_timezone' do
expect(result[:status]).to eq(:success)
2019-07-31 22:56:46 +05:30
2020-06-23 00:09:42 +05:30
expect(project.reload.metrics_setting.external_dashboard_url).to be(nil)
expect(project.metrics_setting.dashboard_timezone).to eq('utc')
2019-07-31 22:56:46 +05:30
end
end
end
2019-02-15 15:39:39 +05:30
context 'error tracking' do
context 'with existing error tracking setting' do
let(:params) do
{
error_tracking_setting_attributes: {
enabled: false,
2021-11-11 11:23:49 +05:30
integrated: true,
2019-07-07 11:18:12 +05:30
api_host: 'http://gitlab.com/',
token: 'token',
project: {
slug: 'project',
name: 'Project',
organization_slug: 'org',
organization_name: 'Org'
}
2019-02-15 15:39:39 +05:30
}
}
end
before do
create(:project_error_tracking_setting, project: project)
end
it 'updates the settings' do
expect(result[:status]).to eq(:success)
project.reload
expect(project.error_tracking_setting).not_to be_enabled
2021-11-11 11:23:49 +05:30
expect(project.error_tracking_setting.integrated).to be_truthy
2019-07-07 11:18:12 +05:30
expect(project.error_tracking_setting.api_url).to eq(
'http://gitlab.com/api/0/projects/org/project/'
)
2019-02-15 15:39:39 +05:30
expect(project.error_tracking_setting.token).to eq('token')
2019-07-07 11:18:12 +05:30
expect(project.error_tracking_setting[:project_name]).to eq('Project')
expect(project.error_tracking_setting[:organization_name]).to eq('Org')
end
context 'disable error tracking' do
before do
params[:error_tracking_setting_attributes][:api_host] = ''
params[:error_tracking_setting_attributes][:enabled] = false
end
it 'can set api_url to nil' do
expect(result[:status]).to eq(:success)
project.reload
expect(project.error_tracking_setting).not_to be_enabled
expect(project.error_tracking_setting.api_url).to be_nil
expect(project.error_tracking_setting.token).to eq('token')
expect(project.error_tracking_setting[:project_name]).to eq('Project')
expect(project.error_tracking_setting[:organization_name]).to eq('Org')
end
2019-02-15 15:39:39 +05:30
end
end
context 'without an existing error tracking setting' do
let(:params) do
{
error_tracking_setting_attributes: {
enabled: true,
2021-11-11 11:23:49 +05:30
integrated: true,
2019-07-07 11:18:12 +05:30
api_host: 'http://gitlab.com/',
token: 'token',
project: {
slug: 'project',
name: 'Project',
organization_slug: 'org',
organization_name: 'Org'
}
2019-02-15 15:39:39 +05:30
}
}
end
it 'creates a setting' do
expect(result[:status]).to eq(:success)
expect(project.error_tracking_setting).to be_enabled
2021-11-11 11:23:49 +05:30
expect(project.error_tracking_setting.integrated).to be_truthy
2019-07-07 11:18:12 +05:30
expect(project.error_tracking_setting.api_url).to eq(
'http://gitlab.com/api/0/projects/org/project/'
)
2019-02-15 15:39:39 +05:30
expect(project.error_tracking_setting.token).to eq('token')
2019-07-07 11:18:12 +05:30
expect(project.error_tracking_setting[:project_name]).to eq('Project')
expect(project.error_tracking_setting[:organization_name]).to eq('Org')
2019-02-15 15:39:39 +05:30
end
end
2020-03-13 15:44:24 +05:30
context 'partial_update' do
let(:params) do
{
error_tracking_setting_attributes: {
enabled: true
}
}
end
context 'with setting' do
before do
create(:project_error_tracking_setting, :disabled, project: project)
end
it 'service succeeds' do
expect(result[:status]).to eq(:success)
end
it 'updates attributes' do
expect { result }
.to change { project.reload.error_tracking_setting.enabled }
.from(false)
.to(true)
end
it 'only updates enabled attribute' do
result
expect(project.error_tracking_setting.previous_changes.keys)
.to contain_exactly('enabled')
end
2021-10-27 15:23:28 +05:30
context 'with integrated attribute' do
let(:params) do
{
error_tracking_setting_attributes: {
enabled: true,
integrated: true
}
}
end
it 'updates integrated attribute' do
expect { result }
.to change { project.reload.error_tracking_setting.integrated }
.from(false)
.to(true)
end
it 'only updates enabled and integrated attributes' do
result
expect(project.error_tracking_setting.previous_changes.keys)
.to contain_exactly('enabled', 'integrated')
end
end
2020-03-13 15:44:24 +05:30
end
context 'without setting' do
2021-11-18 22:05:49 +05:30
it 'creates setting with default values' do
expect(result[:status]).to eq(:success)
expect(project.error_tracking_setting.enabled).to be_truthy
expect(project.error_tracking_setting.integrated).to be_truthy
2020-03-13 15:44:24 +05:30
end
end
end
2019-10-31 01:37:42 +05:30
context 'with masked param token' do
let(:params) do
{
error_tracking_setting_attributes: {
2022-07-29 17:44:30 +05:30
api_host: 'https://sentrytest.gitlab.com/',
project: {
slug: 'sentry-project',
organization_slug: 'sentry-org'
},
2019-10-31 01:37:42 +05:30
enabled: false,
token: '*' * 8
}
}
end
before do
2022-07-29 17:44:30 +05:30
create(:project_error_tracking_setting, project: project, token: 'token', api_url: 'https://sentrytest.gitlab.com/api/0/projects/sentry-org/sentry-project/')
2019-10-31 01:37:42 +05:30
end
it 'does not update token' do
expect(result[:status]).to eq(:success)
expect(project.error_tracking_setting.token).to eq('token')
end
end
2019-02-15 15:39:39 +05:30
context 'with invalid parameters' do
let(:params) { {} }
let!(:error_tracking_setting) do
create(:project_error_tracking_setting, project: project)
end
it 'does nothing' do
expect(result[:status]).to eq(:success)
expect(project.reload.error_tracking_setting)
.to eq(error_tracking_setting)
end
end
end
context 'with inappropriate params' do
let(:params) { { name: '' } }
let!(:original_name) { project.name }
it 'ignores params' do
expect(result[:status]).to eq(:success)
expect(project.reload.name).to eq(original_name)
end
end
2019-12-21 20:55:43 +05:30
context 'grafana integration' do
let(:params) do
{
grafana_integration_attributes: {
grafana_url: 'http://new.grafana.com',
token: 'VerySecureToken='
}
}
end
context 'without existing grafana integration' do
it 'creates an integration' do
expect(result[:status]).to eq(:success)
expected_attrs = params[:grafana_integration_attributes]
integration = project.reload.grafana_integration
expect(integration.grafana_url).to eq(expected_attrs[:grafana_url])
2020-02-01 01:16:34 +05:30
expect(integration.send(:token)).to eq(expected_attrs[:token])
2019-12-21 20:55:43 +05:30
end
end
context 'with an existing grafana integration' do
before do
create(:grafana_integration, project: project)
end
it 'updates the settings' do
expect(result[:status]).to eq(:success)
expected_attrs = params[:grafana_integration_attributes]
integration = project.reload.grafana_integration
expect(integration.grafana_url).to eq(expected_attrs[:grafana_url])
2020-02-01 01:16:34 +05:30
expect(integration.send(:token)).to eq(expected_attrs[:token])
2019-12-21 20:55:43 +05:30
end
context 'with all grafana attributes blank in params' do
let(:params) do
{
grafana_integration_attributes: {
grafana_url: '',
token: ''
}
}
end
it 'destroys the metrics_setting entry in DB' do
expect(result[:status]).to eq(:success)
expect(project.reload.grafana_integration).to be_nil
end
end
end
end
2020-03-13 15:44:24 +05:30
context 'prometheus integration' do
context 'prometheus params were passed into service' do
2022-06-21 17:19:12 +05:30
let!(:prometheus_integration) do
create(:prometheus_integration, :instance, properties: {
2020-03-13 15:44:24 +05:30
api_url: "http://example.prometheus.com",
2022-06-21 17:19:12 +05:30
manual_configuration: "0",
google_iap_audience_client_id: 123
2020-03-13 15:44:24 +05:30
})
end
2020-10-24 23:57:45 +05:30
2020-03-13 15:44:24 +05:30
let(:params) do
{
prometheus_integration_attributes: {
2020-04-08 14:13:33 +05:30
'api_url' => 'http://new.prometheus.com',
'manual_configuration' => '1'
2020-03-13 15:44:24 +05:30
}
}
end
2021-09-30 23:02:18 +05:30
it 'uses Project#find_or_initialize_integration to include instance defined defaults and pass them to Projects::UpdateService', :aggregate_failures do
2020-04-08 14:13:33 +05:30
expect(Projects::UpdateService).to receive(:new) do |project_arg, user_arg, update_params_hash|
2022-06-21 17:19:12 +05:30
prometheus_attrs = update_params_hash[:prometheus_integration_attributes]
2020-04-08 14:13:33 +05:30
expect(project_arg).to eq project
expect(user_arg).to eq user
2022-06-21 17:19:12 +05:30
expect(prometheus_attrs).to have_key('encrypted_properties')
expect(prometheus_attrs.keys).not_to include(*%w(id project_id created_at updated_at properties))
expect(prometheus_attrs['encrypted_properties']).not_to eq(prometheus_integration.encrypted_properties)
end.and_call_original
2020-03-13 15:44:24 +05:30
2022-06-21 17:19:12 +05:30
expect { subject.execute }.to change(Integrations::Prometheus, :count).by(1)
expect(Integrations::Prometheus.last).to have_attributes(
api_url: 'http://new.prometheus.com',
manual_configuration: true,
google_iap_audience_client_id: 123
)
2020-03-13 15:44:24 +05:30
end
end
2021-09-30 23:02:18 +05:30
context 'when prometheus params are not passed into service' do
2020-03-13 15:44:24 +05:30
let(:params) { { something: :else } }
it 'does not pass any prometheus params into Projects::UpdateService', :aggregate_failures do
project_update_service = double(Projects::UpdateService)
2021-09-30 23:02:18 +05:30
expect(project).not_to receive(:find_or_initialize_integration)
2020-03-13 15:44:24 +05:30
expect(Projects::UpdateService)
.to receive(:new)
.with(project, user, {})
.and_return(project_update_service)
expect(project_update_service).to receive(:execute)
subject.execute
end
end
end
2019-02-15 15:39:39 +05:30
end
end