diff options
-rw-r--r-- | app/services/error_tracking/list_sentry_projects_service.rb | 5 | ||||
-rw-r--r-- | spec/services/error_tracking/list_sentry_projects_service_spec.rb | 27 |
2 files changed, 31 insertions, 1 deletions
diff --git a/app/services/error_tracking/list_sentry_projects_service.rb b/app/services/error_tracking/list_sentry_projects_service.rb index e22e5e22743..955fe7d4a09 100644 --- a/app/services/error_tracking/list_sentry_projects_service.rb +++ b/app/services/error_tracking/list_sentry_projects_service.rb @@ -17,12 +17,14 @@ module ErrorTracking rescue Sentry::Client::Error => e error(e.message, :bad_request) + rescue Sentry::Client::SentryError => e + error(e.message, :unprocessable_entity) end private def project_error_tracking_setting - e = project.error_tracking_setting + e = project.error_tracking_setting || project.build_error_tracking_setting e.api_url = ErrorTracking::ProjectErrorTrackingSetting.build_api_url_from( api_host: params[:api_host], @@ -31,6 +33,7 @@ module ErrorTracking ) e.token = params[:token] e.enabled = true + e end diff --git a/spec/services/error_tracking/list_sentry_projects_service_spec.rb b/spec/services/error_tracking/list_sentry_projects_service_spec.rb index dfa10a1b04a..32607cec590 100644 --- a/spec/services/error_tracking/list_sentry_projects_service_spec.rb +++ b/spec/services/error_tracking/list_sentry_projects_service_spec.rb @@ -112,5 +112,32 @@ describe ErrorTracking::ListSentryProjectsService do expect(result).to include(status: :success, projects: []) end end + + context 'error_tracking_setting is nil' do + let(:new_api_host) { 'https://gitlab.com/' } + let(:new_token) { 'new-token' } + let(:params) { ActionController::Parameters.new(api_host: new_api_host, token: new_token) } + + before do + expect(project).to receive(:error_tracking_setting).at_least(:once) + .and_return(nil) + end + + it 'builds a new error_tracking_setting' do + sentry_client = spy(:sentry_client) + + expect(Sentry::Client).to receive(:new) + .with(new_api_host + 'api/0/projects/', new_token) + .and_return(sentry_client) + + expect(sentry_client).to receive(:list_projects) + .and_return([:project1, :project2]) + + result = subject.execute + + expect(result[:projects]).to eq([:project1, :project2]) + expect(project.error_tracking_setting).to be_nil + end + end end end |