summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatija Čupić <matteeyah@gmail.com>2018-01-13 01:46:43 +0100
committerMatija Čupić <matteeyah@gmail.com>2018-02-05 18:57:42 +0100
commit121d84d774e18b27a8a4624f173e97cfad0d7f7c (patch)
tree21f9a7c0d493cbb09215b630c04363a31cd2c1a5
parentfe96a1f268558526fd122a348866fbf513ac17e2 (diff)
downloadgitlab-ce-121d84d774e18b27a8a4624f173e97cfad0d7f7c.tar.gz
Implement multiple variable handling action
-rw-r--r--app/controllers/projects/variables_controller.rb19
-rw-r--r--spec/controllers/projects/variables_controller_spec.rb55
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