Commit 188aad96 authored by Tiger's avatar Tiger

Prevent locking a Terraform state if it is already locked

https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43955
parent fd12870a
......@@ -8,7 +8,12 @@ module Mutations
def resolve(id:)
state = authorized_find!(id: id)
state.update(lock_xid: lock_xid, locked_by_user: current_user, locked_at: Time.current)
if state.locked?
state.errors.add(:base, 'state is already locked')
else
state.update(lock_xid: lock_xid, locked_by_user: current_user, locked_at: Time.current)
end
{ errors: errors_on_object(state) }
end
......
......@@ -4,8 +4,8 @@ require 'spec_helper'
RSpec.describe Mutations::Terraform::State::Delete do
let_it_be(:user) { create(:user) }
let_it_be(:state) { create(:terraform_state) }
let(:state) { create(:terraform_state) }
let(:mutation) do
described_class.new(
object: double,
......
......@@ -4,8 +4,8 @@ require 'spec_helper'
RSpec.describe Mutations::Terraform::State::Lock do
let_it_be(:user) { create(:user) }
let_it_be(:state) { create(:terraform_state) }
let(:state) { create(:terraform_state) }
let(:mutation) do
described_class.new(
object: double,
......@@ -42,6 +42,18 @@ RSpec.describe Mutations::Terraform::State::Lock do
expect(state.lock_xid).to be_present
expect(state.locked_at).to be_present
end
context 'state is already locked' do
let(:locked_by_user) { create(:user) }
let(:state) { create(:terraform_state, :locked, locked_by_user: locked_by_user) }
it 'does not modify the existing lock', :aggregate_failures do
expect(subject).to eq(errors: ['state is already locked'])
expect(state.reload).to be_locked
expect(state.locked_by_user).to eq(locked_by_user)
end
end
end
context 'with invalid params' do
......
......@@ -4,8 +4,8 @@ require 'spec_helper'
RSpec.describe Mutations::Terraform::State::Unlock do
let_it_be(:user) { create(:user) }
let_it_be(:state) { create(:terraform_state, :locked) }
let(:state) { create(:terraform_state, :locked) }
let(:mutation) do
described_class.new(
object: double,
......@@ -38,6 +38,15 @@ RSpec.describe Mutations::Terraform::State::Unlock do
expect(subject).to eq(errors: [])
expect(state.reload).not_to be_locked
end
context 'state is already unlocked' do
let(:state) { create(:terraform_state) }
it 'does not modify the state' do
expect(subject).to eq(errors: [])
expect(state.reload).not_to be_locked
end
end
end
context 'with invalid params' do
......
......@@ -18,7 +18,7 @@ RSpec.describe 'lock a terraform state' do
include_examples 'a working graphql query'
it 'unlocks the state' do
it 'locks the state' do
expect(state.reload).to be_locked
expect(state.locked_by_user).to eq(user)
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