From 121d84d774e18b27a8a4624f173e97cfad0d7f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Sat, 13 Jan 2018 01:46:43 +0100 Subject: [PATCH] Implement multiple variable handling action --- .../projects/variables_controller.rb | 19 ++++++- .../projects/variables_controller_spec.rb | 55 ++++++++++++++++++- 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/app/controllers/projects/variables_controller.rb b/app/controllers/projects/variables_controller.rb index b7b88830837..f9d548a14f8 100644 --- a/app/controllers/projects/variables_controller.rb +++ b/app/controllers/projects/variables_controller.rb @@ -33,7 +33,20 @@ class Projects::VariablesController < Projects::ApplicationController end 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 def destroy @@ -54,6 +67,10 @@ class Projects::VariablesController < Projects::ApplicationController params.require(:variable).permit(*variable_params_attributes) end + def variables_params + params.permit(variables: [*variable_params_attributes]) + end + def variable_params_attributes %i[id key value protected _destroy] end diff --git a/spec/controllers/projects/variables_controller_spec.rb b/spec/controllers/projects/variables_controller_spec.rb index 97284909b3c..e0294fd4a46 100644 --- a/spec/controllers/projects/variables_controller_spec.rb +++ b/spec/controllers/projects/variables_controller_spec.rb @@ -57,9 +57,58 @@ describe Projects::VariablesController do end describe 'POST #save_multiple' do - it 'returns a successful response' do - post :save_multiple, namespace_id: project.namespace.to_param, project_id: project - expect(response).to have_gitlab_http_status(:ok) + let(:variable) { create(:ci_variable) } + + 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