Commit d945300b authored by Grzegorz Bizon's avatar Grzegorz Bizon

Check permissions before stopping CI environments

parent ec0daedb
...@@ -10,6 +10,7 @@ module Ci ...@@ -10,6 +10,7 @@ module Ci
environments.each do |environment| environments.each do |environment|
next unless environment.stoppable? next unless environment.stoppable?
next unless can?(current_user, :create_deployment, project)
environment.stop!(current_user) environment.stop!(current_user)
end end
......
require 'spec_helper' require 'spec_helper'
describe Ci::StopEnvironmentService, services: true do describe Ci::StopEnvironmentService, services: true do
let(:project) { create(:project) } let(:project) { create(:project, :private) }
let(:user) { create(:user) } let(:user) { create(:user) }
let(:service) { described_class.new(project, user) } let(:service) { described_class.new(project, user) }
...@@ -12,38 +12,46 @@ describe Ci::StopEnvironmentService, services: true do ...@@ -12,38 +12,46 @@ describe Ci::StopEnvironmentService, services: true do
create(:environment, :with_review_app, project: project) create(:environment, :with_review_app, project: project)
end end
it 'stops environment' do context 'when user has permission to stop environment' do
expect_any_instance_of(Environment).to receive(:stop!) before do
project.team << [user, :developer]
end
service.execute('master') it 'stops environment' do
end expect_environment_stopped_on('master')
end
context 'when specified branch does not exist' do context 'when specified branch does not exist' do
it 'does not stop environment' do it 'does not stop environment' do
expect_any_instance_of(Environment).not_to receive(:stop!) expect_environment_not_stopped_on('non/existent/branch')
end
end
service.execute('non/existent/branch') context 'when no branch not specified' do
it 'does not stop environment' do
expect_environment_not_stopped_on(nil)
end
end end
end
context 'when no branch not specified' do context 'when environment is not stoppable' do
it 'does not stop environment' do before do
expect_any_instance_of(Environment).not_to receive(:stop!) allow_any_instance_of(Environment)
.to receive(:stoppable?).and_return(false)
end
service.execute(nil) it 'does not stop environment' do
expect_environment_not_stopped_on('master')
end
end end
end end
context 'when environment is not stoppable' do context 'when user does not have permission to stop environment' do
before do before do
allow_any_instance_of(Environment) project.team << [user, :guest]
.to receive(:stoppable?).and_return(false)
end end
it 'does not stop environment' do it 'does not stop environment' do
expect_any_instance_of(Environment).not_to receive(:stop!) expect_environment_not_stopped_on('master')
service.execute('master')
end end
end end
end end
...@@ -53,10 +61,14 @@ describe Ci::StopEnvironmentService, services: true do ...@@ -53,10 +61,14 @@ describe Ci::StopEnvironmentService, services: true do
create(:environment, project: project) create(:environment, project: project)
end end
it 'does not stop environment' do context 'when user has permission to stop environments' do
expect_any_instance_of(Environment).not_to receive(:stop!) before do
project.team << [user, :master]
end
service.execute('master') it 'does not stop environment' do
expect_environment_not_stopped_on('master')
end
end end
end end
...@@ -67,4 +79,18 @@ describe Ci::StopEnvironmentService, services: true do ...@@ -67,4 +79,18 @@ describe Ci::StopEnvironmentService, services: true do
end end
end end
end end
def expect_environment_stopped_on(branch)
expect_any_instance_of(Environment)
.to receive(:stop!)
service.execute(branch)
end
def expect_environment_not_stopped_on(branch)
expect_any_instance_of(Environment)
.not_to receive(:stop!)
service.execute(branch)
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment