Commit 121d84d7 authored by Matija Čupić's avatar Matija Čupić

Implement multiple variable handling action

parent fe96a1f2
...@@ -33,7 +33,20 @@ class Projects::VariablesController < Projects::ApplicationController ...@@ -33,7 +33,20 @@ class Projects::VariablesController < Projects::ApplicationController
end end
def save_multiple def save_multiple
head :ok respond_to do |format|
format.json do
variables = []
variables_params[:variables].each do |variable_hash|
variable = project.variables.where(key: variable_hash[:key]).first_or_initialize(variable_hash)
variable.assign_attributes(variable_hash) unless variable.new_record?
return head :bad_request unless variable.valid?
variables << variable
end
variables.each { |variable| variable.save }
end
head :ok
end
end end
def destroy def destroy
...@@ -54,6 +67,10 @@ class Projects::VariablesController < Projects::ApplicationController ...@@ -54,6 +67,10 @@ class Projects::VariablesController < Projects::ApplicationController
params.require(:variable).permit(*variable_params_attributes) params.require(:variable).permit(*variable_params_attributes)
end end
def variables_params
params.permit(variables: [*variable_params_attributes])
end
def variable_params_attributes def variable_params_attributes
%i[id key value protected _destroy] %i[id key value protected _destroy]
end end
......
...@@ -57,9 +57,58 @@ describe Projects::VariablesController do ...@@ -57,9 +57,58 @@ describe Projects::VariablesController do
end end
describe 'POST #save_multiple' do describe 'POST #save_multiple' do
it 'returns a successful response' do let(:variable) { create(:ci_variable) }
post :save_multiple, namespace_id: project.namespace.to_param, project_id: project
expect(response).to have_gitlab_http_status(:ok) before do
project.variables << variable
end
context 'with invalid new variable parameters' do
subject do
post :save_multiple,
namespace_id: project.namespace.to_param, project_id: project,
variables: [{ key: variable.key, value: 'other_value' },
{ key: '..?', value: 'dummy_value' }],
format: :json
end
it 'does not update the existing variable' do
expect { subject }.not_to change { variable.reload.value }
end
it 'does not create the new variable' do
expect { subject }.not_to change { project.variables.count }
end
it 'returns a bad request response' do
subject
expect(response).to have_gitlab_http_status(:bad_request)
end
end
context 'with valid new variable parameters' do
subject do
post :save_multiple,
namespace_id: project.namespace.to_param, project_id: project,
variables: [{ key: variable.key, value: 'other_value' },
{ key: 'new_key', value: 'dummy_value' }],
format: :json
end
it 'updates the existing variable' do
expect { subject }.to change { variable.reload.value }.to('other_value')
end
it 'creates the new variable' do
expect { subject }.to change { project.variables.count }.by(1)
end
it 'returns a successful response' do
subject
expect(response).to have_gitlab_http_status(:ok)
end
end end
end 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