Commit 2bb9267f authored by Tiger's avatar Tiger

Add GraphQL mutation to unlock a Terraform state

https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43955
parent 58125543
# frozen_string_literal: true
module Mutations
module Terraform
module State
class Unlock < Base
graphql_name 'TerraformStateUnlock'
def resolve(id:)
state = authorized_find!(id: id)
state.update(lock_xid: nil, locked_by_user: nil, locked_at: nil)
{ errors: errors_on_object(state) }
end
end
end
end
end
......@@ -56,6 +56,7 @@ module Types
mount_mutation Mutations::Notes::Destroy
mount_mutation Mutations::Terraform::State::Delete
mount_mutation Mutations::Terraform::State::Lock
mount_mutation Mutations::Terraform::State::Unlock
mount_mutation Mutations::Todos::MarkDone
mount_mutation Mutations::Todos::Restore
mount_mutation Mutations::Todos::MarkAllDone
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Mutations::Terraform::State::Unlock do
let_it_be(:user) { create(:user) }
let(:state) { create(:terraform_state, :locked) }
let(:mutation) do
described_class.new(
object: double,
context: { current_user: user },
field: double
)
end
it { expect(described_class.graphql_name).to eq('TerraformStateUnlock') }
it { expect(described_class).to require_graphql_authorizations(:admin_terraform_state) }
describe '#resolve' do
let(:global_id) { state.to_global_id }
subject { mutation.resolve(id: global_id) }
context 'user does not have permission' do
it 'raises an error', :aggregate_failures do
expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
expect(state.reload).to be_locked
end
end
context 'user has permission' do
before do
state.project.add_maintainer(user)
end
it 'unlocks the state', :aggregate_failures do
expect(subject).to eq(errors: [])
expect(state.reload).not_to be_locked
end
end
context 'with invalid params' do
let(:global_id) { user.to_global_id }
it 'raises an error', :aggregate_failures do
expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
expect(state.reload).to be_locked
end
end
end
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'unlock a terraform state' do
include GraphqlHelpers
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user, maintainer_projects: [project]) }
let(:state) { create(:terraform_state, :locked, project: project) }
let(:mutation) { graphql_mutation(:terraform_state_unlock, id: state.to_global_id.to_s) }
before do
expect(state).to be_locked
post_graphql_mutation(mutation, current_user: user)
end
include_examples 'a working graphql query'
it 'unlocks the state' do
expect(state.reload).not_to be_locked
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