diff options
author | Peter Leitzen <pleitzen@gitlab.com> | 2018-12-18 22:21:49 +0100 |
---|---|---|
committer | Peter Leitzen <pleitzen@gitlab.com> | 2019-01-02 15:29:33 +0100 |
commit | d4d0faac5c684614c5746e12c1cbb647dda5e5d8 (patch) | |
tree | 4e97ddd58fc8aa9a104b24355545074b3f38a355 | |
parent | 909082b397b53bce44666ab740f8f14bbef1da08 (diff) | |
download | gitlab-ce-d4d0faac5c684614c5746e12c1cbb647dda5e5d8.tar.gz |
Implement settings for error tracking
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 |