summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Leitzen <pleitzen@gitlab.com>2018-12-18 22:21:49 +0100
committerPeter Leitzen <pleitzen@gitlab.com>2019-01-02 15:29:33 +0100
commitd4d0faac5c684614c5746e12c1cbb647dda5e5d8 (patch)
tree4e97ddd58fc8aa9a104b24355545074b3f38a355
parent909082b397b53bce44666ab740f8f14bbef1da08 (diff)
downloadgitlab-ce-d4d0faac5c684614c5746e12c1cbb647dda5e5d8.tar.gz
Implement settings for error tracking
-rw-r--r--app/controllers/projects/settings/operations/error_tracking_controller.rb33
-rw-r--r--app/controllers/projects/settings/operations_controller.rb2
-rw-r--r--app/views/projects/settings/operations/show.html.haml2
-rw-r--r--config/routes/project.rb8
-rw-r--r--spec/controllers/projects/settings/operations/error_tracking_controller_spec.rb104
5 files changed, 143 insertions, 6 deletions
diff --git a/app/controllers/projects/settings/operations/error_tracking_controller.rb b/app/controllers/projects/settings/operations/error_tracking_controller.rb
new file mode 100644
index 00000000000..d0f4b6f287c
--- /dev/null
+++ b/app/controllers/projects/settings/operations/error_tracking_controller.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Projects
+ module Settings
+ module Operations
+ class ErrorTrackingController < Projects::ApplicationController
+ before_action :authorize_update_environment!
+
+ def create
+ result = ::Projects::ErrorTracking::SettingService
+ .new(project, current_user, setting_params)
+ .execute
+
+ if result[:status] == :success
+ flash[:notice] = _('Your changes have been saved')
+ else
+ flash[:alert] = result[:message]
+ end
+
+ redirect_to project_settings_operations_path(project)
+ end
+
+ private
+
+ def setting_params
+ params
+ .require(:error_tracking_setting)
+ .permit(:enabled, :uri, :token)
+ end
+ end
+ end
+ end
+end
diff --git a/app/controllers/projects/settings/operations_controller.rb b/app/controllers/projects/settings/operations_controller.rb
index 1669e8fff75..c048f925a4e 100644
--- a/app/controllers/projects/settings/operations_controller.rb
+++ b/app/controllers/projects/settings/operations_controller.rb
@@ -6,7 +6,7 @@ module Projects
before_action :authorize_update_environment!, only: [:show]
def show
- @error_tracking_setting = ErrorTracking::ErrorTrackingSetting.for_project(project)
+ @error_tracking_setting = ::ErrorTracking::ErrorTrackingSetting.for_project(project)
end
end
end
diff --git a/app/views/projects/settings/operations/show.html.haml b/app/views/projects/settings/operations/show.html.haml
index 4328fe0c936..2e849b973f1 100644
--- a/app/views/projects/settings/operations/show.html.haml
+++ b/app/views/projects/settings/operations/show.html.haml
@@ -9,7 +9,7 @@
%p
= _('To link Sentry to GitLab, enter your Sentry URL and bearer token')
.settings-content
- = form_for @error_tracking_setting, as: :error_tracking_setting, url: project_settings_operations_path(@project) do |f|
+ = form_for @error_tracking_setting, as: :error_tracking_setting, url: namespace_project_settings_operations_error_tracking_path(@project.namespace, @project), method: :post do |f|
= form_errors(@error_tracking_setting)
.form-group
%div.form-check
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 8522d18738e..cbad8f317aa 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -24,10 +24,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
module: :projects,
as: :project) do
- namespace :settings do
- resource :operations, only: [:show]
- end
-
resources :autocomplete_sources, only: [] do
collection do
get 'members'
@@ -443,6 +439,10 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
post :create_deploy_token, path: 'deploy_token/create'
post :cleanup
end
+ resource :operations, only: [:show]
+ namespace :operations do
+ resource :error_tracking, controller: :error_tracking, only: [:create]
+ end
end
# Since both wiki and repository routing contains wildcard characters
diff --git a/spec/controllers/projects/settings/operations/error_tracking_controller_spec.rb b/spec/controllers/projects/settings/operations/error_tracking_controller_spec.rb
new file mode 100644
index 00000000000..0f39ffcca87
--- /dev/null
+++ b/spec/controllers/projects/settings/operations/error_tracking_controller_spec.rb
@@ -0,0 +1,104 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Projects::Settings::Operations::ErrorTrackingController do
+ set(:user) { create(:user) }
+ set(:project) { create(:project) }
+
+ before do
+ sign_in(user)
+ end
+
+ describe 'POST #create' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ let(:setting_service) { spy(:setting_service) }
+
+ let(:operations_url) do
+ "http://test.host/#{project.namespace.path}/#{project.path}/settings/operations"
+ end
+ let(:error_tracking_params) do
+ {
+ enabled: '1',
+ uri: 'http://url',
+ token: 'token'
+ }
+ end
+ let(:error_tracking_permitted) do
+ ActionController::Parameters.new(error_tracking_params).permit!
+ end
+
+ context 'when update succeeds' do
+ before do
+ stub_setting_service_returning(status: :success)
+ end
+
+ it 'shows a notice' do
+ post :create, params: project_params(project, error_tracking_params)
+
+ expect(response).to redirect_to(operations_url)
+ expect(flash[:notice]).to eq _('Your changes have been saved')
+ end
+ end
+
+ context 'when update fails' do
+ before do
+ stub_setting_service_returning(status: :error, message: error_message)
+ end
+
+ let(:error_message) { 'error message' }
+
+ it 'shows an alert' do
+ post :create, params: project_params(project, error_tracking_params)
+
+ expect(response).to redirect_to(operations_url)
+ expect(flash[:alert]).to eq error_message
+ end
+ end
+
+ context 'as a reporter' do
+ before do
+ project.add_reporter(user)
+ end
+
+ it 'renders 404' do
+ post :create, params: project_params(project)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'as an anonymous user' do
+ before do
+ sign_out(user)
+ end
+
+ it 'redirects to signup page' do
+ post :create, params: project_params(project)
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+ end
+
+ private
+
+ def project_params(project, params = {})
+ {
+ namespace_id: project.namespace,
+ project_id: project,
+ error_tracking_setting: params
+ }
+ end
+
+ def stub_setting_service_returning(return_value = {})
+ expect(::Projects::ErrorTracking::SettingService)
+ .to receive(:new).with(project, user, error_tracking_permitted)
+ .and_return(setting_service)
+ expect(setting_service).to receive(:execute)
+ .and_return(return_value)
+ end
+end