141 lines
5.4 KiB
Ruby
141 lines
5.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Groups::UpdateSharedRunnersService do
|
|
let(:user) { create(:user) }
|
|
let(:group) { create(:group) }
|
|
let(:params) { {} }
|
|
|
|
describe '#execute' do
|
|
subject { described_class.new(group, user, params).execute }
|
|
|
|
context 'when current_user is not the group owner' do
|
|
let_it_be(:group) { create(:group) }
|
|
|
|
let(:params) { { shared_runners_setting: 'enabled' } }
|
|
|
|
before do
|
|
group.add_maintainer(user)
|
|
end
|
|
|
|
it 'results error and does not call any method' do
|
|
expect(group).not_to receive(:update_shared_runners_setting!)
|
|
|
|
expect(subject[:status]).to eq(:error)
|
|
expect(subject[:message]).to eq('Operation not allowed')
|
|
expect(subject[:http_status]).to eq(403)
|
|
end
|
|
end
|
|
|
|
context 'when current_user is the group owner' do
|
|
before do
|
|
group.add_owner(user)
|
|
end
|
|
|
|
context 'enable shared Runners' do
|
|
let(:params) { { shared_runners_setting: 'enabled' } }
|
|
|
|
context 'group that its ancestors have shared runners disabled' do
|
|
let_it_be(:parent) { create(:group, :shared_runners_disabled) }
|
|
let_it_be(:group) { create(:group, :shared_runners_disabled, parent: parent) }
|
|
|
|
it 'results error' do
|
|
expect(subject[:status]).to eq(:error)
|
|
expect(subject[:message]).to eq('Validation failed: Shared runners enabled cannot be enabled because parent group has shared Runners disabled')
|
|
end
|
|
end
|
|
|
|
context 'root group with shared runners disabled' do
|
|
let_it_be(:group) { create(:group, :shared_runners_disabled) }
|
|
|
|
it 'receives correct method and succeeds' do
|
|
expect(group).to receive(:update_shared_runners_setting!).with('enabled')
|
|
|
|
expect(subject[:status]).to eq(:success)
|
|
end
|
|
end
|
|
|
|
context 'when group has pending builds' do
|
|
let_it_be(:group) { create(:group, :shared_runners_disabled) }
|
|
let_it_be(:project) { create(:project, namespace: group, shared_runners_enabled: false) }
|
|
let_it_be(:pending_build_1) { create(:ci_pending_build, project: project, instance_runners_enabled: false) }
|
|
let_it_be(:pending_build_2) { create(:ci_pending_build, project: project, instance_runners_enabled: false) }
|
|
|
|
it 'updates pending builds for the group' do
|
|
expect(::Ci::UpdatePendingBuildService).to receive(:new).and_call_original
|
|
|
|
subject
|
|
|
|
expect(pending_build_1.reload.instance_runners_enabled).to be_truthy
|
|
expect(pending_build_2.reload.instance_runners_enabled).to be_truthy
|
|
end
|
|
|
|
context 'when shared runners is not toggled' do
|
|
let(:params) { { shared_runners_setting: 'invalid_enabled' } }
|
|
|
|
it 'does not update pending builds for the group' do
|
|
expect(::Ci::UpdatePendingBuildService).not_to receive(:new).and_call_original
|
|
|
|
subject
|
|
|
|
expect(pending_build_1.reload.instance_runners_enabled).to be_falsey
|
|
expect(pending_build_2.reload.instance_runners_enabled).to be_falsey
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'disable shared Runners' do
|
|
let_it_be(:group) { create(:group) }
|
|
|
|
let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_AND_UNOVERRIDABLE } }
|
|
|
|
it 'receives correct method and succeeds' do
|
|
expect(group).to receive(:update_shared_runners_setting!).with(Namespace::SR_DISABLED_AND_UNOVERRIDABLE)
|
|
|
|
expect(subject[:status]).to eq(:success)
|
|
end
|
|
|
|
context 'when group has pending builds' do
|
|
let_it_be(:project) { create(:project, namespace: group) }
|
|
let_it_be(:pending_build_1) { create(:ci_pending_build, project: project, instance_runners_enabled: true) }
|
|
let_it_be(:pending_build_2) { create(:ci_pending_build, project: project, instance_runners_enabled: true) }
|
|
|
|
it 'updates pending builds for the group' do
|
|
expect(::Ci::UpdatePendingBuildService).to receive(:new).and_call_original
|
|
|
|
subject
|
|
|
|
expect(pending_build_1.reload.instance_runners_enabled).to be_falsey
|
|
expect(pending_build_2.reload.instance_runners_enabled).to be_falsey
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'allow descendants to override' do
|
|
let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_WITH_OVERRIDE } }
|
|
|
|
context 'top level group' do
|
|
let_it_be(:group) { create(:group, :shared_runners_disabled) }
|
|
|
|
it 'receives correct method and succeeds' do
|
|
expect(group).to receive(:update_shared_runners_setting!).with(Namespace::SR_DISABLED_WITH_OVERRIDE)
|
|
|
|
expect(subject[:status]).to eq(:success)
|
|
end
|
|
end
|
|
|
|
context 'when parent does not allow' do
|
|
let_it_be(:parent) { create(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false) }
|
|
let_it_be(:group) { create(:group, :shared_runners_disabled, allow_descendants_override_disabled_shared_runners: false, parent: parent) }
|
|
|
|
it 'results error' do
|
|
expect(subject[:status]).to eq(:error)
|
|
expect(subject[:message]).to eq('Validation failed: Allow descendants override disabled shared runners cannot be enabled because parent group does not allow it')
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|